cryptmount-5.2/0000755000175000017500000000000012613166775010623 500000000000000cryptmount-5.2/install-sh0000755000175000017500000002202111216245452012530 00000000000000#!/bin/sh # install - install a program, script, or datafile scriptversion=2005-02-02.21 # This originates from X11R5 (mit/util/scripts/install.sh), which was # later released in X11R6 (xc/config/util/install.sh) with the # following copyright and license. # # Copyright (C) 1994 X Consortium # # Permission is hereby granted, free of charge, to any person obtaining a copy # of this software and associated documentation files (the "Software"), to # deal in the Software without restriction, including without limitation the # rights to use, copy, modify, merge, publish, distribute, sublicense, and/or # sell copies of the Software, and to permit persons to whom the Software is # furnished to do so, subject to the following conditions: # # The above copyright notice and this permission notice shall be included in # all copies or substantial portions of the Software. # # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE # X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN # AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNEC- # TION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. # # Except as contained in this notice, the name of the X Consortium shall not # be used in advertising or otherwise to promote the sale, use or other deal- # ings in this Software without prior written authorization from the X Consor- # tium. # # # FSF changes to this file are in the public domain. # # Calling this script install-sh is preferred over install.sh, to prevent # `make' implicit rules from creating a file called install from it # when there is no Makefile. # # This script is compatible with the BSD install script, but was written # from scratch. It can only install one file at a time, a restriction # shared with many OS's install programs. # set DOITPROG to echo to test this script # Don't use :- since 4.3BSD and earlier shells don't like it. doit="${DOITPROG-}" # put in absolute paths if you don't have them in your path; or use env. vars. mvprog="${MVPROG-mv}" cpprog="${CPPROG-cp}" chmodprog="${CHMODPROG-chmod}" chownprog="${CHOWNPROG-chown}" chgrpprog="${CHGRPPROG-chgrp}" stripprog="${STRIPPROG-strip}" rmprog="${RMPROG-rm}" mkdirprog="${MKDIRPROG-mkdir}" chmodcmd="$chmodprog 0755" chowncmd= chgrpcmd= stripcmd= rmcmd="$rmprog -f" mvcmd="$mvprog" src= dst= dir_arg= dstarg= no_target_directory= usage="Usage: $0 [OPTION]... [-T] SRCFILE DSTFILE or: $0 [OPTION]... SRCFILES... DIRECTORY or: $0 [OPTION]... -t DIRECTORY SRCFILES... or: $0 [OPTION]... -d DIRECTORIES... In the 1st form, copy SRCFILE to DSTFILE. In the 2nd and 3rd, copy all SRCFILES to DIRECTORY. In the 4th, create DIRECTORIES. Options: -c (ignored) -d create directories instead of installing files. -g GROUP $chgrpprog installed files to GROUP. -m MODE $chmodprog installed files to MODE. -o USER $chownprog installed files to USER. -s $stripprog installed files. -t DIRECTORY install into DIRECTORY. -T report an error if DSTFILE is a directory. --help display this help and exit. --version display version info and exit. Environment variables override the default commands: CHGRPPROG CHMODPROG CHOWNPROG CPPROG MKDIRPROG MVPROG RMPROG STRIPPROG " while test -n "$1"; do case $1 in -c) shift continue;; -d) dir_arg=true shift continue;; -g) chgrpcmd="$chgrpprog $2" shift shift continue;; --help) echo "$usage"; exit $?;; -m) chmodcmd="$chmodprog $2" shift shift continue;; -o) chowncmd="$chownprog $2" shift shift continue;; -s) stripcmd=$stripprog shift continue;; -t) dstarg=$2 shift shift continue;; -T) no_target_directory=true shift continue;; --version) echo "$0 $scriptversion"; exit $?;; *) # When -d is used, all remaining arguments are directories to create. # When -t is used, the destination is already specified. test -n "$dir_arg$dstarg" && break # Otherwise, the last argument is the destination. Remove it from $@. for arg do if test -n "$dstarg"; then # $@ is not empty: it contains at least $arg. set fnord "$@" "$dstarg" shift # fnord fi shift # arg dstarg=$arg done break;; esac done if test -z "$1"; then if test -z "$dir_arg"; then echo "$0: no input file specified." >&2 exit 1 fi # It's OK to call `install-sh -d' without argument. # This can happen when creating conditional directories. exit 0 fi for src do # Protect names starting with `-'. case $src in -*) src=./$src ;; esac if test -n "$dir_arg"; then dst=$src src= if test -d "$dst"; then mkdircmd=: chmodcmd= else mkdircmd=$mkdirprog fi else # Waiting for this to be detected by the "$cpprog $src $dsttmp" command # might cause directories to be created, which would be especially bad # if $src (and thus $dsttmp) contains '*'. if test ! -f "$src" && test ! -d "$src"; then echo "$0: $src does not exist." >&2 exit 1 fi if test -z "$dstarg"; then echo "$0: no destination specified." >&2 exit 1 fi dst=$dstarg # Protect names starting with `-'. case $dst in -*) dst=./$dst ;; esac # If destination is a directory, append the input filename; won't work # if double slashes aren't ignored. if test -d "$dst"; then if test -n "$no_target_directory"; then echo "$0: $dstarg: Is a directory" >&2 exit 1 fi dst=$dst/`basename "$src"` fi fi # This sed command emulates the dirname command. dstdir=`echo "$dst" | sed -e 's,/*$,,;s,[^/]*$,,;s,/*$,,;s,^$,.,'` # Make sure that the destination directory exists. # Skip lots of stat calls in the usual case. if test ! -d "$dstdir"; then defaultIFS=' ' IFS="${IFS-$defaultIFS}" oIFS=$IFS # Some sh's can't handle IFS=/ for some reason. IFS='%' set x `echo "$dstdir" | sed -e 's@/@%@g' -e 's@^%@/@'` shift IFS=$oIFS pathcomp= while test $# -ne 0 ; do pathcomp=$pathcomp$1 shift if test ! -d "$pathcomp"; then $mkdirprog "$pathcomp" # mkdir can fail with a `File exist' error in case several # install-sh are creating the directory concurrently. This # is OK. test -d "$pathcomp" || exit fi pathcomp=$pathcomp/ done fi if test -n "$dir_arg"; then $doit $mkdircmd "$dst" \ && { test -z "$chowncmd" || $doit $chowncmd "$dst"; } \ && { test -z "$chgrpcmd" || $doit $chgrpcmd "$dst"; } \ && { test -z "$stripcmd" || $doit $stripcmd "$dst"; } \ && { test -z "$chmodcmd" || $doit $chmodcmd "$dst"; } else dstfile=`basename "$dst"` # Make a couple of temp file names in the proper directory. dsttmp=$dstdir/_inst.$$_ rmtmp=$dstdir/_rm.$$_ # Trap to clean up those temp files at exit. trap 'ret=$?; rm -f "$dsttmp" "$rmtmp" && exit $ret' 0 trap '(exit $?); exit' 1 2 13 15 # Copy the file name to the temp name. $doit $cpprog "$src" "$dsttmp" && # and set any options; do chmod last to preserve setuid bits. # # If any of these fail, we abort the whole thing. If we want to # ignore errors from any of these, just make sure not to ignore # errors from the above "$doit $cpprog $src $dsttmp" command. # { test -z "$chowncmd" || $doit $chowncmd "$dsttmp"; } \ && { test -z "$chgrpcmd" || $doit $chgrpcmd "$dsttmp"; } \ && { test -z "$stripcmd" || $doit $stripcmd "$dsttmp"; } \ && { test -z "$chmodcmd" || $doit $chmodcmd "$dsttmp"; } && # Now rename the file to the real destination. { $doit $mvcmd -f "$dsttmp" "$dstdir/$dstfile" 2>/dev/null \ || { # The rename failed, perhaps because mv can't rename something else # to itself, or perhaps because mv is so ancient that it does not # support -f. # Now remove or move aside any old file at destination location. # We try this two ways since rm can't unlink itself on some # systems and the destination file might be busy for other # reasons. In this case, the final cleanup might fail but the new # file should still install successfully. { if test -f "$dstdir/$dstfile"; then $doit $rmcmd -f "$dstdir/$dstfile" 2>/dev/null \ || $doit $mvcmd -f "$dstdir/$dstfile" "$rmtmp" 2>/dev/null \ || { echo "$0: cannot unlink or rename $dstdir/$dstfile" >&2 (exit 1); exit 1 } else : fi } && # Now rename the file to the real destination. $doit $mvcmd "$dsttmp" "$dstdir/$dstfile" } } fi || { (exit 1); exit 1; } done # The final little trick to "correctly" pass the exit status to the exit trap. { (exit 0); exit 0 } # Local variables: # eval: (add-hook 'write-file-hooks 'time-stamp) # time-stamp-start: "scriptversion=" # time-stamp-format: "%:y-%02m-%02d.%02H" # time-stamp-end: "$" # End: cryptmount-5.2/looputils.c0000644000175000017500000002010512612754537012735 00000000000000/* * Loopback-device utilities for cryptmount * (C)Copyright 2005-2015, RW Penney */ /* This file is part of cryptmount cryptmount is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. cryptmount is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. */ #include #include #include #include #include #include #include #include #include #include #include #ifdef HAVE_LINUX_LOOP_H # include #else # error loop.h kernel-header is needed to build cryptmount #endif #include #include "cryptmount.h" #include "looputils.h" /** * Format-strings for loopback devices, * covering legacy /dev/loop/0 style * as well as current /dev/loop0 style. */ static const char *loop_formats[] = { "/dev/loop%u", "/dev/loop/%u", NULL }; /** * Search for vacant loopback device. * * For recent kernels (>=3.1), this will use the /dev/loop-control * interface, while for older kernels this will involve explicit * search through /dev/loop0..255 for a device whose status indicates * that it not associated with a backing file. */ int loop_findfree(char *buff, size_t buffsz) { unsigned idx, found = 0; int devfd, devno; struct loop_info64 linfo; char loopname[256] = ""; struct stat sbuff; #ifdef LOOP_CTL_GET_FREE devfd = open("/dev/loop-control", O_RDWR); devno = ioctl(devfd, LOOP_CTL_GET_FREE); close(devfd); if (devfd >=0 && devno >= 0) { snprintf(loopname, sizeof(loopname), "/dev/loop%d", devno); found = 1; } #endif for (devno=0; devno<256 && !found; ++devno) { for (idx=0; loop_formats[idx]!=NULL && !found; ++idx) { snprintf(loopname, sizeof(loopname), loop_formats[idx], (unsigned)devno); if (stat(loopname, &sbuff) || !S_ISBLK(sbuff.st_mode)) continue; devfd = open(loopname, O_RDONLY); if (devfd < 0) continue; if (ioctl(devfd, LOOP_GET_STATUS64, &linfo) && errno == ENXIO) { found = 1; } close(devfd); } } if (found && buff != NULL) strncpy(buff, loopname, buffsz); return !found; } int loop_setup(const char *dev, const char *file, int flags) /** Setup loopback device to point to regular file */ { int devfd = -1, filefd = -1, eflag = ERR_NOERROR; struct loop_info64 lpinfo; memset((void*)&lpinfo, 0, sizeof(lpinfo)); strncpy((char*)lpinfo.lo_file_name, file, (size_t)LO_NAME_SIZE); lpinfo.lo_offset = 0; lpinfo.lo_encrypt_key_size = 0; devfd = open(dev, flags); #ifdef LOOP_CTL_ADD if (devfd < 0) { unsigned devno = ~0u; int ctlfd; sscanf(dev, loop_formats[0], &devno); ctlfd = open("/dev/loop-control", O_RDWR); (void)ioctl(ctlfd, LOOP_CTL_ADD, devno); close(ctlfd); devfd = open(dev, flags); } #endif if (devfd < 0) { fprintf(stderr, "Cannot open \"%s\" for reading\n", dev); eflag = ERR_BADFILE; goto bail_out; } filefd = open(file, flags); if (filefd < 0) { fprintf(stderr, "Cannot open \"%s\" for reading\n", file); eflag = ERR_BADFILE; goto bail_out; } if (ioctl(devfd, LOOP_SET_FD, filefd) || ioctl(devfd, LOOP_SET_STATUS64, &lpinfo)) { fprintf(stderr, "LOOP_SET_FD ioctl() failed on \"%s\"\n", dev); eflag = ERR_BADIOCTL; goto bail_out; } bail_out: if (filefd >= 0) close(filefd); if (devfd >= 0) close(devfd); return eflag; } int loop_destroy(const char *dev) /** Detach loopback device from underlying file */ { int devfd; int eflag = ERR_NOERROR; devfd = open(dev, O_RDONLY); if (devfd < 0) { fprintf(stderr, "Cannot open \"%s\" for reading\n", dev); eflag = ERR_BADFILE; goto bail_out; } if (ioctl(devfd, LOOP_CLR_FD, 0)) { fprintf(stderr, "LOOP_CLR_FD ioctl() failed on \"%s\"\n", dev); eflag = ERR_BADIOCTL; goto bail_out; } #ifdef LOOP_CTL_REMOVE { int devno = -1, ctlfd; sscanf(dev, loop_formats[0], &devno); ctlfd = open("/dev/loop-control", O_RDWR); (void)ioctl(ctlfd, LOOP_CTL_REMOVE, devno); close(ctlfd); } #endif bail_out: if (devfd >= 0) (void)close(devfd); return eflag; } int loop_ident(unsigned maj, unsigned min, char *buff, size_t buffsz) /** Find device node for given minor device number */ { unsigned idx; int found=0; char str[256]; struct stat sbuff; if (maj != LOOP_MAJOR) return !found; for (idx=0; loop_formats[idx]!=NULL && !found; ++idx) { sprintf(str, loop_formats[idx], min); if (stat(str, &sbuff) || !S_ISBLK(sbuff.st_mode)) continue; found = ((unsigned)major(sbuff.st_rdev) == maj && (unsigned)minor(sbuff.st_rdev) == min); } if (found && buff != NULL) strncpy(buff, str, buffsz); return !found; } int loop_dellist(unsigned devcnt, const dev_t *devids) /** Tidy-up list of loopback devices */ { unsigned i; char buff[256]; int eflag = 0; if (devids == NULL) return eflag; for (i=0; i #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #ifdef HAVE_SYSLOG # include #endif #include /* Beware ordering conflict with sys/mount.h */ #include "armour.h" #include "cryptmount.h" #include "delegates.h" #include "dmutils.h" #include "fsutils.h" #include "looputils.h" #include "tables.h" #include "utils.h" #if WITH_CSWAP # include #endif #ifdef TESTING # include "cmtesting.h" #endif /** * An element within a linked-list of filesystem-targets, * typically supplied from command-line. */ typedef struct targelt { const tgtdefn_t *tgt; struct targelt *nx; } targelt_t; /** Identifiers of top-level operating mode */ typedef enum { M_UNSET, M_HELP, M_PREPARE, M_RELEASE, M_MOUNT, M_UNMOUNT, M_SWAPON, M_SWAPOFF, M_LIST, M_KEYMGRS, M_STATUS, M_PASSWORD, M_KEYGEN, M_KEYREU, M_SYSBOOT, M_SYSQUIT, M_SAFETYNET, M_VERSION, M_SELFTEST } cmmode_t; /** * Configuration switches set (perhaps indirectly) * from command-line options */ enum { F_NEEDS_TGT = 1, /*!< command requires a filesystem target */ F_ALL_TARGETS = 2, /*!< command will be applied to all known targets */ F_VERIFY_PW = 4 /*!< encryption password should be double-checked */ }; static int64_t getblk512count(const char *device, int *blklen); static int execute_list(cmmode_t mode, const tgtdefn_t *tgttable, const km_pw_context_t *pw_ctxt, const char *params, const targelt_t *eltlist); static int do_list(const targelt_t *eltlist); static int do_status(const targelt_t *eltlist); static int do_keymgrlist(); static int do_sysboot_updown(int booting, const tgtdefn_t *tgttable, const km_pw_context_t *pw_ctxt); static int do_devsetup(const km_pw_context_t *pw_ctxt, bound_tgtdefn_t *boundtgt, char **mntdev); static int do_devshutdown(const bound_tgtdefn_t *boundtgt); static int do_mount(const km_pw_context_t *pw_ctxt, bound_tgtdefn_t *boundtgt); static int do_unmount(const bound_tgtdefn_t *boundtgt); static int do_swapon(const km_pw_context_t *pw_ctxt, bound_tgtdefn_t *boundtgt); static int do_swapoff(const bound_tgtdefn_t *boundtgt); static int do_passwd(const km_pw_context_t *pw_ctxt, bound_tgtdefn_t *boundtgt); static int do_keygen(const km_pw_context_t *pw_ctxt, bound_tgtdefn_t *boundtgt, const char *params, int reuse, const tgtdefn_t *tgttable); static int do_safetynet(); static const char *USAGE_STRING = N_("\ usage: cryptmount [OPTION [target ...]]\n\ \n\ available options are as follows:\n\ \n\ -h | --help\n\ -a | --all\n\ -c | --change-password \n\ -k | --key-managers\n\ -l | --list\n\ -S | --status\n\ -m | --mount \n\ -u | --unmount \n\ --generate-key \n\ --reuse-key \n\ --prepare \n\ --release \n\ --config-fd \n\ --passwd-fd \n\ --swapon \n\ --swapoff \n\ --version\n\ \n\ please report bugs to \n\ "); #ifdef TESTING cm_testinfo_t test_context; cm_testinfo_t *test_ctxtptr = &test_context; int fs_test_blkgetsz() /** Check that 32bit & 64bit device size calculations agree */ { #ifdef BLKGETSIZE64 int fd, n_open, seclen; long len; uint64_t len64; const char **dev; const char *devices[] = { "/dev/hda", "/dev/hda1", "/dev/hda2", "/dev/hda3", "/dev/hdb", "/dev/hdb1", "/dev/hdb2", "/dev/hdb3", "/dev/hdc", "/dev/hdc1", "/dev/hdc2", "/dev/hdc3", "/dev/sda", "/dev/sda1", "/dev/sda2", "/dev/sda3", "/dev/sdb", "/dev/sdb1", "/dev/sdb2", "/dev/sdb3", "/dev/sr0", "/dev/sr1", NULL }; #endif CM_TEST_START("BLKGETSIZE ioctl calls"); #ifndef BLKGETSIZE64 /* Assume that there is no ambiguity with BLKGETSIZE */ CM_TEST_PASS(); #else dev = devices; n_open = 0; while (*dev != NULL) { fd = open(*dev, O_RDONLY); if (fd >= 0) { ++n_open; if (ioctl(fd, BLKSSZGET, &seclen) != 0 || ioctl(fd, BLKGETSIZE, &len) != 0 || ioctl(fd, BLKGETSIZE64, &len64) != 0) { CM_TEST_FAIL(); } close(fd); if (len64 < (1<<31)) { CM_ASSERT_EQUAL(len64, ((int64_t)len * (int64_t)512)); } } #if 0 if (fd >= 0) fprintf(stderr, "%s: %d %ld %lld\n", *dev, seclen, len * 512, len64); #endif ++dev; } if (n_open > 0) { CM_TEST_OK(); } else { CM_TEST_ABORT(); } #endif /* BLKGETSIZE64 */ } #endif /* TESTING */ static int64_t getblk512count(const char *device, int *blklen) /** Find size of raw device in blocks of size 512-bytes */ { int64_t count = -1; int fd; #ifndef BLKGETSIZE64 long len; #endif *blklen = 512; fd = open(device, O_RDONLY); if (fd < 0) return (int64_t)-1; #ifdef BLKGETSIZE64 if (ioctl(fd, BLKGETSIZE64, &count) == 0 && ioctl(fd, BLKSSZGET, blklen) == 0) { count /= (int64_t)512; } else { count = -1; } #else if (ioctl(fd, BLKGETSIZE, &len) == 0) { /* This directly gives the number of 512-byte blocks */ count = (int64_t)len; } #endif (void)close(fd); return count; } /*! @brief Print list of available filing-system targets to stdout * * This provides the back-end functionality for * the '--list' command-line option. */ static int do_list(const targelt_t *eltlist) { const targelt_t *elt; for (elt=eltlist; elt!=NULL; elt=elt->nx) { const tgtdefn_t *tgt = elt->tgt; /* TRANSLATORS: this string is marked as 'no-c-format' because some localizations may require the mount-point and filesystem type to be printed in a different order, but the untranslated string needs to remain an ordinary string that can be printed without gettext. */ /* xgettext:no-c-format */ printf(_("%-16s [to mount on \"%s\" as \"%s\"]\n"), tgt->ident, tgt->dir, tgt->fstype); } return ERR_NOERROR; } /*! @brief Print mounting status of set of targets to stdout * * This provides the back-end functionality for * the '--status' command-line option. */ static int do_status(const targelt_t *eltlist) { const targelt_t *elt; tgtstat_t *tgtstats = NULL, *ts; tgtstats = get_all_tgtstatus(); for (elt=eltlist; elt!=NULL; elt=elt->nx) { const tgtdefn_t *tgt = elt->tgt; for (ts=tgtstats; ts!=NULL; ts=ts->nx) { if (strcmp(ts->ident, tgt->ident) == 0) break; } printf("%-16s %s\n", tgt->ident, (ts != NULL ? "mounted" : "not_mounted")); } free_tgtstatus(tgtstats); return ERR_NOERROR; } /*! @brief Print a list of all available key managers to stdout. * * This provides the back-end functionality for * the '--key-managers' command-line option. */ static int do_keymgrlist() { const char **keymgrs = get_keymgr_list(); int i = 0; while (keymgrs[i] != NULL) { printf("%s", keymgrs[i]); ++i; if (keymgrs[i] != NULL) { printf(", "); } else { printf("\n"); } } free((void*)keymgrs); return ERR_NOERROR; } /*! @brief Setup all devices which have a bootaction option specified * * This provides the back-end functionality for * the '--system-boot' and '--system-shutdown' command-line options. * * \see do_mount(), do_swapon(), do_devsetup(). */ static int do_sysboot_updown(int booting, const tgtdefn_t *tgttable, const km_pw_context_t *pw_ctxt) { const tgtdefn_t *tgt; bound_tgtdefn_t *boundtgt = NULL; int eflag = ERR_NOERROR; for (tgt=tgttable; tgt!=NULL && eflagnx) { const unsigned boot_mode = (tgt->flags & FLG_BOOT_MASK); if (boot_mode == 0) continue; boundtgt = bind_tgtdefn(tgt); if (boundtgt == NULL) continue; switch (boot_mode) { case FLG_BOOT_MOUNT: eflag = (booting ? do_mount(pw_ctxt, boundtgt) : do_unmount(boundtgt)); break; case FLG_BOOT_SWAP: eflag = (booting ? do_swapon(pw_ctxt, boundtgt) : do_swapoff(boundtgt)); break; case FLG_BOOT_PREP: eflag = (booting ? do_devsetup(pw_ctxt, boundtgt, NULL) : do_devshutdown(boundtgt)); break; default: break; } free_boundtgt(boundtgt); } return eflag; } /*! @brief Setup all devices needed to access encrypted target * * This will wrap any file-based targets within a loopback device, * and then setup the device-mapper to provide encryption/decryption * of the target block device after obtaining the access password * from the user. * * This provides the back-end functionality for * the '--prepare' command-line option. * * \see cm_get_key(), blockify_file(), devmap_create(), do_devshutdown(). */ static int do_devsetup(const km_pw_context_t *pw_ctxt, bound_tgtdefn_t *boundtgt, char **mntdev) { enum { BUFFMIN=1024 }; uint8_t *key = NULL; int buffpos, blklen, readonly, isloop = 0, killloop = 0, keylen = 0, eflag = ERR_NOERROR; int64_t devlen = 0, fslen = 0; size_t dpsize; char *dmparams = NULL; const char *tgtdev = NULL; const tgtdefn_t *tgt = NULL; /* Get crypto-key for filing system: */ eflag = cm_get_key(boundtgt, pw_ctxt, &key, &keylen); if (eflag != ERR_NOERROR) { fprintf(stderr, _("Failed to extract cipher key\n")); goto bail_out; } tgt = boundtgt->tgt; readonly = is_readonlyfs(tgt->dev); eflag = blockify_file(tgt->dev, (readonly ? O_RDONLY : O_RDWR), tgt->loopdev, &tgtdev, &isloop); if (eflag != ERR_NOERROR) { fprintf(stderr, _("Cannot open device \"%s\" for target \"%s\"\n"), (tgt->dev != NULL ? tgt->dev : "(NULL)"), tgt->ident); goto bail_out; } /* Get size in blocks of target device: */ devlen = getblk512count(tgtdev, &blklen); if (devlen < 0) { fprintf(stderr, _("Failed to get size of \"%s\"\n"), tgtdev); eflag = ERR_BADIOCTL; goto bail_out; } if (tgt->length < 0 || (tgt->start + tgt->length) > devlen) { fslen = devlen - tgt->start; } else { fslen = tgt->length; } if (tgt->start < 0 || fslen <= 0) { fprintf(stderr,_("Bad device-mapper start/length")); fprintf(stderr, " (%" PRId64 ",%" PRId64 ")\n", tgt->start, tgt->length); eflag = ERR_BADDEVICE; goto bail_out; } /* Setup device-mapper crypt table (CIPHER KEY IV_OFFSET DEV START): */ dpsize = 2 * keylen + BUFFMIN; dmparams = (char*)sec_realloc(dmparams, dpsize); buffpos = snprintf(dmparams, dpsize, "%s ", (tgt->cipher != NULL ? tgt->cipher : CM_DEFAULT_CIPHER)); buffpos += mk_key_string(key, (size_t)keylen, dmparams + buffpos); buffpos += snprintf(dmparams + buffpos, (dpsize - buffpos), " %" PRId64 " %s %" PRId64, tgt->ivoffset, tgtdev, tgt->start); if ((tgt->flags & FLG_TRIM) != 0) { buffpos += snprintf(dmparams + buffpos, (dpsize - buffpos), " 1 allow_discards"); } /* Setup device-mapper target: */ eflag = devmap_create(tgt->ident, (uint64_t)0, (uint64_t)fslen, "crypt", dmparams); if (eflag != ERR_NOERROR) { fprintf(stderr, _("Device-mapper target-creation failed for \"%s\"\n"), tgt->ident); killloop = 1; goto bail_out; } if (mntdev != NULL) { devmap_path(mntdev, tgt->ident); } bail_out: if (killloop) unblockify_file(&tgtdev, isloop); /* mounting failed? */ sec_free(dmparams); sec_free(key); return eflag; } /* do_devsetup() */ /*! @brief Remove all devices attached to encrypted target * * This will close-down device-mapper and loopback devices * configured by do_setup(). * * This provides the back-end functionality for * the '--release' command-line option. * * \see do_devsetup(), devmap_remove(), loop_dellist(). */ int do_devshutdown(const bound_tgtdefn_t *boundtgt) { const tgtdefn_t *tgt = boundtgt->tgt; struct stat sbuff; unsigned devcnt=0; dev_t *devids=NULL; int eflag=ERR_NOERROR; /* Check if filing system has been configured at all: */ if (!is_configured(tgt->ident, NULL)) { fprintf(stderr, _("Target \"%s\" does not appear to be configured\n"), tgt->ident); eflag = WRN_UNCONFIG; goto bail_out; } /* Find any underlying (e.g. loopback) devices for device-mapper target: */ udev_settle(); (void)devmap_dependencies(tgt->ident, &devcnt, &devids); #ifdef DEBUG fprintf(stderr, "Shutting down %s [%u dependencies]\n", tgt->ident, devcnt); #endif if (stat(tgt->dev, &sbuff) != 0) { fprintf(stderr, _("Cannot stat \"%s\"\n"), tgt->dev); eflag = ERR_BADDEVICE; goto bail_out; } /* Remove demice-mapper target: */ eflag = devmap_remove(tgt->ident); if (eflag != ERR_NOERROR) { fprintf(stderr, _("Failed to remove device-mapper target \"%s\"\n"), tgt->ident); goto bail_out; } udev_settle(); /* Tidy-up any associated loopback devices: */ if (S_ISREG(sbuff.st_mode) && devids != NULL) { (void)loop_dellist(devcnt, devids); } bail_out: if (devids != NULL) free((void*)devids); return eflag; } /*! @brief Mount an encrypted filesystem * * This provides the back-end functionality for * the '--mount' command-line option. * * \see do_unmount(), do_devsetup(), fs_mount(). */ static int do_mount(const km_pw_context_t *pw_ctxt, bound_tgtdefn_t *boundtgt) { const tgtdefn_t *tgt=NULL; int freedev=0, eflag=ERR_NOERROR; char *mntdev=NULL; tgtstat_t *tstat; if (is_mounted(boundtgt->tgt)) { fprintf(stderr, _("Target \"%s\" is already mounted\n"), boundtgt->tgt->ident); eflag = ERR_BADMOUNT; goto bail_out; } eflag = do_devsetup(pw_ctxt, boundtgt, &mntdev); if (eflag != ERR_NOERROR) goto bail_out; tgt = boundtgt->tgt; #if WITH_FSCK if ((tgt->flags & FLG_FSCK) != 0) { if (fs_check(mntdev, tgt) != ERR_NOERROR) { freedev = 1; eflag = ERR_BADMOUNT; goto bail_out; } } #endif if (fs_mount(mntdev, tgt) != ERR_NOERROR) { freedev = 1; eflag = ERR_BADMOUNT; goto bail_out; } tstat = alloc_tgtstatus(tgt); tstat->uid = (unsigned long)getuid(); put_tgtstatus(tgt, tstat); free_tgtstatus(tstat); bail_out: if (freedev) { /* Tidy-up debris if mount failed */ udev_settle(); do_devshutdown(boundtgt); } if (mntdev != NULL) free((void*)mntdev); return eflag; } /*! @brief Unmount an encrypted filesystem * * This provides the back-end functionality for * the '--unmount' command-line option. * * \see do_mount(), do_devshutdown(), fs_unmount(). */ static int do_unmount(const bound_tgtdefn_t *boundtgt) { const tgtdefn_t *tgt = boundtgt->tgt; int eflag=ERR_NOERROR; struct passwd *pwent; char *mntdev=NULL; tgtstat_t *tstat; /* Check if filing system has been configured at all: */ if (!is_mounted(tgt) || (tstat = get_tgtstatus(tgt)) == NULL) { fprintf(stderr, _("Target \"%s\" does not appear to be mounted\n"), tgt->ident); eflag = WRN_UNCONFIG; goto bail_out; } /* Check if filing system has been mounted & locked by another user: */ if (getuid() != 0 && (uid_t)tstat->uid != getuid()) { pwent = getpwuid((uid_t)tstat->uid); if (pwent != NULL) { fprintf(stderr, _("Only \"%s\" can unmount \"%s\"\n"), pwent->pw_name, tgt->ident); } else { /* TRANSLATORS: the following expands to include the *numerical* user-identity in place of '%lu', e.g. giving 'only user-16 can unmount "target"': */ fprintf(stderr, _("Only user-%lu can unmount \"%s\"\n"), tstat->uid, tgt->ident); } eflag = ERR_BADPRIV; goto bail_out; } /* Unmount filing system: */ if (fs_unmount(tgt) != ERR_NOERROR) { eflag = ERR_BADMOUNT; goto bail_out; } put_tgtstatus(tgt, NULL); /* Remove supporting device-mapper target etc */ if (do_devshutdown(boundtgt) != ERR_NOERROR) { eflag = ERR_BADDEVICE; } bail_out: if (mntdev != NULL) free((void*)mntdev); return eflag; } /*! @brief Setup an encrypted swap partition * * This provides the back-end functionality for * the '--swapon' command-line option. * * \see do_swapoff(), do_devsetup(), fs_swapon(). */ static int do_swapon(const km_pw_context_t *pw_ctxt, bound_tgtdefn_t *boundtgt) { const tgtdefn_t *tgt=NULL; int freedev=0, eflag=ERR_NOERROR; char *mntdev=NULL; tgtstat_t *tstat; #if WITH_CSWAP eflag = do_devsetup(pw_ctxt, boundtgt, &mntdev); if (eflag != ERR_NOERROR) goto bail_out; tgt = boundtgt->tgt; if (fs_swapon(mntdev, tgt) != ERR_NOERROR) { freedev = 1; eflag = ERR_BADSWAP; goto bail_out; } tstat = alloc_tgtstatus(tgt); tstat->uid = (unsigned long)getuid(); put_tgtstatus(tgt, tstat); free_tgtstatus(tstat); #else /* !WITH_CSWAP */ fprintf(stderr, _("Crypto-swap is not supported by this installation of cryptmount\n")); eflag = ERR_BADSWAP; #endif bail_out: if (freedev) { /* Tidy-up debris if swapon failed */ udev_settle(); do_devshutdown(boundtgt); } if (mntdev != NULL) free((void*)mntdev); return eflag; } /*! @brief Close down an encrypted swap partition * * This provides the back-end functionality for * the '--swapoff' command-line option. * * \see do_swapon(), do_devshutdown(), fs_swapoff(). */ static int do_swapoff(const bound_tgtdefn_t *boundtgt) { const tgtdefn_t *tgt = boundtgt->tgt; int eflag=ERR_NOERROR; char *mntdev=NULL; tgtstat_t *tstat; #if WITH_CSWAP /* Check if device has been configured at all: */ if ((tstat = get_tgtstatus(tgt)) == NULL) { fprintf(stderr, _("Target \"%s\" does not appear to be configured\n"), tgt->ident); eflag = WRN_UNCONFIG; goto bail_out; } /* Remove swap-partition: */ if (fs_swapoff(tgt) != ERR_NOERROR) { eflag = ERR_BADSWAP; goto bail_out; } put_tgtstatus(tgt, NULL); /* Remove supporting device-mapper target etc */ if (do_devshutdown(boundtgt) != ERR_NOERROR) { eflag = ERR_BADDEVICE; } #else /* !WITH_CSWAP */ fprintf(stderr, _("Crypto-swap is not supported by this installation of cryptmount\n")); eflag = ERR_BADSWAP; #endif bail_out: if (mntdev != NULL) free((void*)mntdev); return eflag; } /*! @brief Change access password on particular target * * This provides the back-end functionality for * the '--change-password' command-line option. * * \see cm_get_key(), cm_put_key(). */ static int do_passwd(const km_pw_context_t *pw_ctxt, bound_tgtdefn_t *boundtgt) { tgtdefn_t *tgt = boundtgt->tgt; uint8_t *key = NULL; unsigned keyprops; int keylen = 0, eflag = ERR_NOERROR; char *newfname = NULL, *oldfname = NULL; struct stat sbuff; size_t sz; FILE *fp = NULL; keyprops = cm_get_keyproperties(boundtgt); if ((keyprops & KM_PROP_HASPASSWD) == 0) { fprintf(stderr, _("Key-file for \"%s\" isn't password-protected\n"), tgt->ident); eflag = WRN_NOPASSWD; goto bail_out; } /* Attempt to read current key: */ eflag = cm_get_key(boundtgt, pw_ctxt, &key, &keylen); if (eflag != ERR_NOERROR) goto bail_out; /* Setup location to re-encrypt key: */ if (tgt->key.filename != NULL) { const char *outfname=NULL; if ((keyprops & KM_PROP_FIXEDLOC) == 0) { sz = strlen(tgt->key.filename) + 16; oldfname = (char*)malloc(2 * sz); newfname = oldfname + sz; snprintf(oldfname, sz, "%s-old", tgt->key.filename); snprintf(newfname, sz, "%s-new", tgt->key.filename); fp = fopen(newfname, "wb"); outfname = newfname; } else { fp = fopen(tgt->key.filename, "r+b"); outfname = tgt->key.filename; } if (fp == NULL) { fprintf(stderr, _("Cannot open \"%s\" for writing\n"), outfname); eflag = ERR_BADFILE; goto bail_out; } } eflag = cm_put_key(boundtgt, pw_ctxt, key, keylen, fp); if (fclose(fp) != 0) eflag = ERR_BADFILE; if (eflag != ERR_NOERROR) goto bail_out; /* Replace old key-container with new key-container: */ if (oldfname != NULL && newfname != NULL) { if (stat(tgt->key.filename, &sbuff) != 0 || rename(tgt->key.filename, oldfname) != 0 || chown(oldfname, 0, 0) != 0 || chmod(oldfname, S_IRUSR | S_IWUSR) != 0) { fprintf(stderr, _("Retiring old key (%s -> %s) failed\n"), tgt->key.filename, oldfname); goto bail_out; } if (rename(newfname, tgt->key.filename) != 0 || chown(tgt->key.filename, sbuff.st_uid, sbuff.st_gid) != 0 || chmod(tgt->key.filename, sbuff.st_mode) != 0) { fprintf(stderr, _("Installing new key (%s -> %s) failed\n"), newfname, tgt->key.filename); goto bail_out; } newfname = NULL; fprintf(stderr, _("Backup of previous key is in \"%s\"\n"), oldfname); } bail_out: if (newfname != NULL) { unlink(newfname); } if (oldfname != NULL) free((void*)oldfname); return eflag; } /*! @brief Create new filesystem crypto-key * * This provides the back-end functionality for * the '--generate-key' command-line option. * * \see cm_generate_key(), cm_put_key(). */ static int do_keygen(const km_pw_context_t *pw_ctxt, bound_tgtdefn_t *boundtgt, const char *params, int reuse, const tgtdefn_t *tgttable) { uint8_t *key = NULL; unsigned keyprops; int keylen = 0, fileexists = 0, eflag = ERR_NOERROR; char *newfname = NULL; tgtdefn_t *tgt = boundtgt->tgt; const tgtdefn_t *parent = NULL; bound_tgtdefn_t *boundparent = NULL; size_t sz; struct stat sbuff; FILE *fp = NULL; const unsigned mask_fmtfxd = KM_PROP_FIXEDLOC | KM_PROP_FORMATTED; if (params != NULL) { if (reuse) { parent = get_tgtdefn(tgttable, params); boundparent = bind_tgtdefn(parent); if (parent == NULL || boundparent == NULL) { fprintf(stderr, _("Target name \"%s\" is not recognized\n"), params); eflag = ERR_BADPARAM; } } else { if (sscanf(params, "%i", &keylen) != 1 || keylen < 1) { fprintf(stderr, _("Bad key-length parameter")); eflag = ERR_BADPARAM; } } } if (params == NULL || eflag != ERR_NOERROR) goto bail_out; /* Check if keyfile already exists: */ keyprops = cm_get_keyproperties(boundtgt); fileexists = (tgt->key.filename != NULL && stat(tgt->key.filename, &sbuff) == 0); if (fileexists && (keyprops & mask_fmtfxd) != KM_PROP_FIXEDLOC) { fprintf(stderr,_("Key-file \"%s\" already exists for target \"%s\"\n"), tgt->key.filename, tgt->ident); eflag = ERR_BADFILE; goto bail_out; } /* Assemble new key material: */ if (reuse) { eflag = cm_get_key(boundparent, pw_ctxt, &key, &keylen); } else { fprintf(stderr, _("Generating random key; please be patient...\n")); key = (uint8_t*)sec_realloc(NULL, (size_t)keylen); eflag = cm_generate_key(key, (size_t)keylen); if (eflag != ERR_NOERROR) { fprintf(stderr, _("Failed to generate new key\n")); goto bail_out; } } /* Setup location for new key: */ if (tgt->key.filename != NULL) { const char *outfname=NULL; if ((keyprops & KM_PROP_FIXEDLOC) == 0) { sz = strlen(tgt->key.filename) + 16; newfname = (char*)malloc(sz); snprintf(newfname, sz, "%s-new", tgt->key.filename); fp = fopen(newfname, "wb"); outfname = newfname; } else { fp = fopen(tgt->key.filename, (fileexists ? "r+b" : "wb")); outfname = tgt->key.filename; } if (fp == NULL) { fprintf(stderr, _("Cannot open \"%s\" for writing\n"), outfname); eflag = ERR_BADFILE; goto bail_out; } } eflag = cm_put_key(boundtgt, pw_ctxt, key, keylen, fp); if (fp != NULL && fclose(fp) != 0) eflag = ERR_BADFILE; if (eflag != ERR_NOERROR) goto bail_out; /* Move new key file into prefered location: */ if (newfname != NULL) { if (rename(newfname, tgt->key.filename) != 0 || chown(tgt->key.filename, 0, 0) != 0 || chmod(tgt->key.filename, S_IRUSR | S_IWUSR) != 0) { fprintf(stderr, _("Installation of new keyfile \"%s\" failed"), tgt->key.filename); eflag = ERR_BADFILE; } free((void*)newfname); newfname = NULL; } bail_out: if (newfname != NULL) { unlink(newfname); free((void*)newfname); } if (key != NULL) sec_free((void*)key); if (boundparent != NULL) free_boundtgt(boundparent); return eflag; } /*! @brief Attempt to unmount/shutdown all targets currently mounted. * * This will identify all filesystems listed in cryptmount's own * mounting table (typically /run/cryptmount.status), and try * to unmount, or de-configure, any targets that seem still to be in use. * * This will generally only be useful during a system shutdown, * to provide a safety mechanism for filesystems that have * not been unmounted normally. Accordingly, this routine * is more aggressive in its approach than do_unmount(), do_swapoff(), etc. * * This provides the back-end functionality for * the '--safetynet' command-line option. */ static int do_safetynet() { tgtstat_t *all_tsts=NULL, *tst; char *devname=NULL; const char *old_ident=NULL; tgtdefn_t *tgt=NULL; dev_t *devids=NULL; unsigned devcnt=0; int mflag; struct { unsigned targets, unmounted, unswapped, undeviced, unlooped; } counts = { 0, 0, 0, 0, 0 }; /* This routine is ugly, but may be the best we can do to prevent * damage to filesystems that should have been properly removed * by other mechanisms (e.g. --unmount, --swapoff) */ tgt = alloc_tgtdefn(NULL); old_ident = tgt->ident; /* Get list of all targets in status-file: */ udev_settle(); all_tsts = get_all_tgtstatus(); for (tst=all_tsts; tst!=NULL; tst=tst->nx) { ++counts.targets; devmap_path(&devname, tst->ident); tgt->ident = tst->ident; #ifdef DLGT_UMOUNT /* Attempt to unmount filesystem: */ switch (fork()) { case -1: break; case 0: execl(DLGT_UMOUNT, "umount", devname, NULL); break; default: (void)wait(&mflag); break; } if (mflag == 0) ++counts.unmounted; #endif /* DLGT_UMOUNT */ #if WITH_CSWAP /* Attempt to remove swap partition: */ if (swapoff(devname) == 0) ++counts.unswapped; #endif /* WITH_CSWAP */ /* Remove device-mapper device: */ (void)devmap_dependencies(tst->ident, &devcnt, &devids); if (devmap_remove(tst->ident) == ERR_NOERROR) ++counts.undeviced; udev_settle(); /* Free any associated loopback devices: */ if (devcnt > 0 && loop_dellist(devcnt, devids) == 0) ++counts.unlooped; if (devids != NULL) { free((void*)devids); devids = NULL; } /* Remove entry in status-file, having done our best to clean-up: */ (void)put_tgtstatus(tgt, NULL); if (devname != NULL) { free((void*)devname); devname = NULL; } } free_tgtstatus(all_tsts); if (!is_cmstatus_intact()) { char *statpath = NULL; (void)cm_path(&statpath, CM_SYSRUN_PFX, cm_status_filename); if (statpath != NULL) { fprintf(stderr, "%s has been corrupted - removing\n", statpath); unlink(statpath); free(statpath); } } tgt->ident = old_ident; free_tgtdefn(tgt); if (counts.targets != 0) { fprintf(stderr, "Safety-net caught %u targets:\n" "\t%u unmounted, %u swaps removed\n" "\t%u devices removed, %u loopbacks freed\n", counts.targets, counts.unmounted, counts.unswapped, counts.undeviced, counts.unlooped); } return (counts.targets != counts.undeviced); } static void check_priv_opt(const char *opt) /** Check if ordinary user is allowed to perform privileged actions */ { if (getuid() != 0) { fprintf(stderr, _("Only root can use option \"%s\"\n"), opt); exit(EXIT_PRIV); } /* Remove effect of any setuid flags, reverting to real user-id: */ if (seteuid(getuid()) != 0) exit(EXIT_PRIV); } static int check_priv_tgt(const tgtdefn_t *tgt) /** Check if ordinary user is allowed to perform privileged actions */ { if ((tgt->flags & FLG_USER) == 0 && getuid() != 0) { fprintf(stderr, _("Only root can configure \"%s\"\n"), tgt->ident); return ERR_BADPRIV; } return ERR_NOERROR; } /*! @brief Apply top-level mode-dependent operation to list of targets * * This will mount/unmount/swapon/swapoff the give set of encrypted * filesystems, according to an application-level choice of operating mode. * * \see do_mount(), do_swapon(), do_list(), do_safetynet(), parse_options(). */ static int execute_list(cmmode_t mode, const tgtdefn_t *tgttable, const km_pw_context_t *pw_ctxt, const char *params, const targelt_t *eltlist) { const targelt_t *elt = NULL; bound_tgtdefn_t *boundtgt = NULL; int ignore_eltlist = 1, prio = 0, eflag = ERR_NOERROR; struct passwd *pwent = NULL; const char *username = NULL, *syslogmsg = NULL; pwent = getpwuid(getuid()); username = (pwent != NULL ? pwent->pw_name : "UNKNOWN"); #if defined(HAVE_SYSLOG) && !defined(TESTING) openlog(PACKAGE, LOG_PID, LOG_AUTHPRIV); #endif /* Execute special-cases of user-selected task: */ switch (mode) { case M_VERSION: fprintf(stderr, "%s-%s\n", PACKAGE_NAME, PACKAGE_VERSION); break; case M_KEYMGRS: do_keymgrlist(); break; case M_LIST: do_list(eltlist); break; case M_STATUS: do_status(eltlist); break; case M_SYSBOOT: do_sysboot_updown(1, tgttable, pw_ctxt); break; case M_SYSQUIT: do_sysboot_updown(0, tgttable, pw_ctxt); break; case M_SAFETYNET: do_safetynet(); break; default: ignore_eltlist = 0; break; } if (ignore_eltlist) eltlist = NULL; /* Apply user-selected operation to list of targets (if present): */ for (elt=eltlist; elt!=NULL && eflagnx) { boundtgt = bind_tgtdefn(elt->tgt); if (boundtgt == NULL) { fprintf(stderr, _("Cannot find key-manager to match target \"%s\"\n"), elt->tgt->ident); eflag = ERR_BADKEYFORMAT; break; } syslogmsg = NULL; prio = LOG_AUTHPRIV | LOG_NOTICE; switch (mode) { case M_PREPARE: syslogmsg = "prepare of \"%s\" by %s %s"; eflag = do_devsetup(pw_ctxt, boundtgt, NULL); break; case M_RELEASE: syslogmsg = "release of \"%s\" by %s %s"; prio = LOG_AUTHPRIV | LOG_NOTICE; eflag = do_devshutdown(boundtgt); if (eflag == WRN_UNCONFIG) syslogmsg = NULL; break; case M_MOUNT: if ((eflag = check_priv_tgt(boundtgt->tgt)) != ERR_NOERROR) break; syslogmsg = "mount of \"%s\" by %s %s"; eflag = do_mount(pw_ctxt, boundtgt); break; case M_UNMOUNT: if ((eflag = check_priv_tgt(boundtgt->tgt)) != ERR_NOERROR) break; syslogmsg = "unmount of \"%s\" by %s %s"; eflag = do_unmount(boundtgt); if (eflag == WRN_UNCONFIG) syslogmsg = NULL; break; case M_SWAPON: syslogmsg = "swapon \"%s\" by %s %s"; eflag = do_swapon(pw_ctxt, boundtgt); break; case M_SWAPOFF: syslogmsg = "swapoff \"%s\" by %s %s"; eflag = do_swapoff(boundtgt); if (eflag == WRN_UNCONFIG) syslogmsg = NULL; break; case M_PASSWORD: if ((eflag = check_priv_tgt(boundtgt->tgt)) != ERR_NOERROR) break; syslogmsg = "changing password for \"%s\" by %s %s"; eflag = do_passwd(pw_ctxt, boundtgt); break; case M_KEYGEN: if ((eflag = check_priv_tgt(boundtgt->tgt)) != ERR_NOERROR) break; syslogmsg = "key generation for \"%s\" by %s %s"; eflag = do_keygen(pw_ctxt, boundtgt, params, 0, NULL); break; case M_KEYREU: if ((eflag = check_priv_tgt(boundtgt->tgt)) != ERR_NOERROR) break; syslogmsg = "key generation for \"%s\" by %s %s"; eflag = do_keygen(pw_ctxt, boundtgt, params, 1, tgttable); break; default: break; } #ifndef TESTING # ifdef HAVE_SYSLOG if (syslogmsg != NULL) { syslog(prio, syslogmsg, elt->tgt->ident, username, (eflag == ERR_NOERROR ? "succeeded" : "failed")); } # endif #else /* TESTING */ /* Avoid compiler warnings about unused variables: */ eflag += 0 * (prio + (username == NULL) + (syslogmsg == NULL)); #endif free_boundtgt(boundtgt); } #ifdef HAVE_SYSLOG closelog(); #endif return eflag; } static cmmode_t get_defaultmode(int argc, char *argv[]) /** Translate program-name into default action (or just assume M_MOUNT) */ { cmmode_t mode = M_MOUNT; #ifdef WITH_ARGV0 struct modename { cmmode_t mode; const char *name; } modetable[] = { { M_MOUNT, "cryptmount" }, { M_UNMOUNT, "cryptumount" }, { M_UNMOUNT, "cryptunmount" }, #if WITH_CSWAP { M_SWAPON, "cryptswapon" }, { M_SWAPOFF, "cryptswapoff", }, #endif { M_PREPARE, "cryptprepare" }, { M_RELEASE, "cryptrelease" }, { M_MOUNT, NULL } }, *mp; const char *base; if (argc >= 1) { base = strrchr(argv[0], '/'); if (base != NULL) ++base; else base = argv[0]; for (mp=modetable; mp->name!=NULL; ++mp) { if (strcmp(base, mp->name) == 0) { mode = mp->mode; break; } } } #endif return mode; } /** * Parse command-line options to identify a top-level processing mode, * and extract configuration parameters such as key-length, * password source etc. * This routine will also ensure that 'privileged' options are * only accessible to the super-user. */ cmmode_t parse_options(int argc, char *argv[], unsigned *flags, const char **mode_params, int *passwd_fd, int *config_fd, km_pw_context_t *pw_ctxt) { cmmode_t mode = M_UNSET; enum { ALL_USERS = 0x01, NEEDS_ARG = 0x02, SET_MODE = 0x04, SET_FLAGS = 0x08, NEEDS_TGT = 0x10 }; const char *passwd_fd_str = NULL, *config_fd_str = NULL; struct cm_option { char shortopt; const char *longopt; unsigned flags; const char **argument; cmmode_t newmode; unsigned newflags; }; struct cm_option opt_table[] = { { 'a', "all", ALL_USERS | SET_FLAGS, NULL, M_UNSET, F_ALL_TARGETS }, { 'c', "change-password", ALL_USERS | SET_MODE | SET_FLAGS, NULL, M_PASSWORD, F_NEEDS_TGT }, { 'f', "config-fd", NEEDS_ARG, &config_fd_str, M_UNSET, 0 }, { 'g', "generate-key", NEEDS_ARG | SET_MODE | SET_FLAGS, mode_params, M_KEYGEN, F_NEEDS_TGT }, { 'h', "help", ALL_USERS | SET_MODE, NULL, M_HELP, 0 }, { 'k', "key-managers", ALL_USERS | SET_MODE, NULL, M_KEYMGRS, 0 }, { 'l', "list", ALL_USERS | SET_MODE, NULL, M_LIST, 0 }, { 'm', "mount", ALL_USERS | SET_MODE | SET_FLAGS, NULL, M_MOUNT, F_NEEDS_TGT }, { 'w', "passwd-fd", ALL_USERS | NEEDS_ARG, &passwd_fd_str, M_UNSET, 0 }, { 'p', "prepare", SET_MODE | SET_FLAGS, NULL, M_PREPARE, F_NEEDS_TGT }, { 'r', "release", SET_MODE | SET_FLAGS, NULL, M_RELEASE, F_NEEDS_TGT }, { 'e', "reuse-key", NEEDS_ARG | SET_MODE | SET_FLAGS, mode_params, M_KEYREU, F_NEEDS_TGT }, { 'n', "safetynet", SET_MODE, NULL, M_SAFETYNET, 0 }, { 'S', "status", ALL_USERS | SET_MODE | SET_FLAGS, NULL, M_STATUS }, { 's', "swapon", SET_MODE | SET_FLAGS, NULL, M_SWAPON, F_NEEDS_TGT }, { 'x', "swapoff", SET_MODE | SET_FLAGS, NULL, M_SWAPOFF, F_NEEDS_TGT }, { 'B', "system-boot", SET_MODE, NULL, M_SYSBOOT, 0 }, { 'Q', "system-shutdown", SET_MODE, NULL, M_SYSQUIT, 0 }, { 'u', "unmount", ALL_USERS | SET_MODE | SET_FLAGS, NULL, M_UNMOUNT, F_NEEDS_TGT }, { 'y', "verify-password", ALL_USERS | SET_FLAGS, NULL, M_UNSET, F_VERIFY_PW }, /* FIXME - not implemented? */ { 'v', "version", ALL_USERS | SET_MODE, NULL, M_VERSION, 0 }, #ifdef TESTING { 'D', "config-dir", ALL_USERS | NEEDS_ARG, &test_context.argconfigdir, M_UNSET, 0 }, { 'W', "password", ALL_USERS | NEEDS_ARG, &pw_ctxt->argpasswd[0], M_UNSET, 0 }, { 'N', "newpassword", ALL_USERS | NEEDS_ARG, &pw_ctxt->argpasswd[1], M_UNSET, 0 }, { 'T', "self-test", ALL_USERS | SET_MODE, NULL, M_SELFTEST, 0 }, #endif { '?', NULL, 0, NULL, M_UNSET, 0 } }; const size_t n_options = (sizeof(opt_table) / sizeof(opt_table[0]) - 1); char *shortopts, *spos; int idx = 0, optchar = '\0'; size_t i; shortopts = (char*)malloc(n_options * 2 + 1); spos = shortopts; for (i=0; iflags & ALL_USERS)) { check_priv_opt(selected->longopt); } if ((selected->flags & NEEDS_ARG)) { *selected->argument = optarg; } if ((selected->flags & SET_MODE)) { if (mode == M_UNSET) { mode = selected->newmode; } else { fprintf(stderr, _("Multiple operating modes not supported\n")); exit(1); } } if ((selected->flags & SET_FLAGS)) { *flags |= selected->newflags; } } if (optchar == '?') { fprintf(stderr, "%s", _(USAGE_STRING)); exit(EXIT_BADOPT); } if (mode == M_UNSET) mode = get_defaultmode(argc, argv); if (config_fd_str != NULL) sscanf(config_fd_str, "%d", config_fd); if (passwd_fd_str != NULL) sscanf(passwd_fd_str, "%d", passwd_fd); #ifdef _GNU_SOURCE free((void*)longopts); #endif free((void*)shortopts); return mode; } int main(int argc, char *argv[]) { cmmode_t mode = M_UNSET; unsigned mode_flags = 0; const char *mode_params = NULL; char *cmtab = NULL; int config_fd = -1, passwd_fd = -1, eflag = ERR_NOERROR; tgtdefn_t *tgttable=NULL; km_pw_context_t pw_ctxt; const tgtdefn_t *tgt = NULL; targelt_t *eltlist = NULL, **eltptr = &eltlist; #ifdef HAVE_GETTEXT /* setup internationalization of message-strings via gettext(): */ setlocale(LC_ALL, ""); bindtextdomain(PACKAGE, LOCALEDIR); textdomain(PACKAGE); #endif init_env_dictionary(); #ifdef TESTING fprintf(stderr, "WARNING!!! cryptmount has been compiled for TESTING only - DO NOT INSTALL\n"); pw_ctxt.argpasswd[0] = pw_ctxt.argpasswd[1] = NULL; test_context.argconfigdir = NULL; #endif if (mlockall(MCL_CURRENT | MCL_FUTURE) != 0) { fprintf(stderr, _("Memory-locking failed...\n")); } pw_ctxt.verify = 0; pw_ctxt.debug_level = 0; mode = parse_options(argc, argv, &mode_flags, &mode_params, &passwd_fd, &config_fd, &pw_ctxt); #ifdef TESTING if (mode == M_SELFTEST) { eflag = cm_run_tests(); clear_env_dictionary(); return eflag; } #endif (void)cm_path(&cmtab, CM_SYSCONF_PFX, "cmtab"); if (mode == M_HELP) { fprintf(stderr, "%s", _(USAGE_STRING)); exit(EXIT_OK); } /* Configure source of passwords: */ if (passwd_fd >= 0) { pw_ctxt.fd_pw_source = fdopen(passwd_fd, "r"); if (pw_ctxt.fd_pw_source == NULL) { fprintf(stderr, _("Bad file-descriptor (%d)\n"), passwd_fd); exit(EXIT_BADOPT); } } else { pw_ctxt.fd_pw_source = NULL; } /* Check & read-in configuration file: */ #ifndef TESTING if (sycheck_cmtab(cmtab) != ERR_NOERROR) { fprintf(stderr, _("Security failure\n")); exit(EXIT_INSECURE); } #endif if (config_fd >= 0) { tgttable = parse_config_fd(config_fd); } else { tgttable = parse_config(cmtab); } free((void*)cmtab); if ((mode == M_LIST || mode == M_STATUS) && optind >= argc) { mode_flags |= F_ALL_TARGETS; } /* if '--all' given, assemble list of targets from entire config-file */ if ((mode_flags & F_ALL_TARGETS) != 0) { if (optind < argc) { fprintf(stderr, _("Trailing command-line arguments given with '--all' option\n")); exit(EXIT_BADOPT); } for (tgt=tgttable; tgt!=NULL; tgt=tgt->nx) { *eltptr = (targelt_t*)malloc(sizeof(targelt_t)); (*eltptr)->tgt = tgt; (*eltptr)->nx = NULL; eltptr = &((*eltptr)->nx); } } /* Assemble list of targets from remaining command-line arguments: */ while (optind < argc) { tgt = get_tgtdefn(tgttable, argv[optind]); if (tgt != NULL) { *eltptr = (targelt_t*)malloc(sizeof(targelt_t)); (*eltptr)->tgt = tgt; (*eltptr)->nx = NULL; eltptr = &((*eltptr)->nx); } else { fprintf(stderr, _("Target name \"%s\" is not recognized\n"), argv[optind]); exit(EXIT_BADTGT); } ++optind; } /* Check security of all targets being processed: */ for (eltptr=&eltlist; *eltptr!=NULL; eltptr=&((*eltptr)->nx)) { tgt = (*eltptr)->tgt; if (sycheck_target(tgt) != ERR_NOERROR) { fprintf(stderr, _("Target security failure for \"%s\"\n"), tgt->ident); exit(EXIT_INSECURE); } } /* Execute user-selected task: */ if ((mode_flags & F_NEEDS_TGT) && eltlist == NULL) { fprintf(stderr, _("No targets specified\n")); exit(EXIT_BADTGT); } eflag = execute_list(mode, tgttable, &pw_ctxt, mode_params, eltlist); free_keymanagers(); /* Tidy-up: */ while (eltlist != NULL) { eltptr = &eltlist; eltlist = eltlist->nx; free((void*)*eltptr); } free_config(&tgttable); munlockall(); clear_env_dictionary(); return eflag; } /* * (C)Copyright 2005-2015, RW Penney */ cryptmount-5.2/ChangeLog0000644000175000017500000004644312613166327012321 00000000000000ChangeLog for cryptmount (http://cryptmount.sourceforge.net) 25Oct15 - *** cryptmount-5.2 released 22Oct15 - Added "supath" option to configure PATH via /etc/cryptmount/cmtab 07Oct15 - Improved setup of PATH when invoking fsck 18Aug15 - Dispensed with debian/dirs installation-directory list 17Aug15 - Allowed multiple attempts for password entry in setup script 16Aug15 - Updated debian/rules build-script to use debhelper v7 07Jul15 - Removed support for dynamically loadable key-managers 06Jul15 - Various cleanups to avoid warnings when compiled as C++ 04May15 - *** cryptmount-5.1 released 03May15 - Updated to automake-1.14.1 30Aug14 - Resolved libgcrypt/libcryptsetup versioning in Debian packaging 28Aug14 - Patched rpm build-script to better support redhat/fedora distros 30Apr14 - *** cryptmount-5.0 released 13Apr14 - Added further error checks on LUKS password changing 12Apr14 - *** cryptmount-5.0beta1 released 05Apr14 - Removed legacy LUKS wrappers in favour of libcryptsetup Various improvements to Doxygen documentation. 25Mar14 - Converted LUKS key-writing to use libcryptsetup 21Mar14 - Added '--status' option for querying filesystem mount status 18Mar14 - Converted LUKS key-reading to use libcryptsetup 14Mar14 - Updated LUKS functions to mirror cryptsetup-1.6.4 12Mar14 - Removed support for using LUKS partitions without UUID library. 12Feb14 - Patched unexpanded @ETCDIR@ in cryptmount-setup script 14Jan14 - *** cryptmount-4.5 released 01Jan13 - Removed legacy non-64bit loop-device support 31Dec13 - Added support for /dev/loop-control interface of kernel >= 3.1 23Dec13 - *** cryptmount-4.5beta1 released 22Dec13 - Updated LUKS functions to mirror cryptsetup-1.6.3 20Dec13 - Added runtime warning about deprecated 'fsoptions' in cmtab 16Dec13 - Added support for trim/allow_discards option within dm-crypt 13Dec13 - Moved /etc/cryptmount/cmstatus into /var/run/cryptmount.status Added '--with-sysrundir' option to configure 13Oct13 - Removed support for /etc/init.d/cryptmount-early bootup script 03Aug13 - Added mechanism for validating contents of target-status file 19May13 - *** cryptmount-4.4 released 18May13 - Improved consistency of terminology within cmtab.5 manual page. 17May13 - Added automatic modprobe for dm-crypt etc. as part of installation Improved documentation of need for kernel-support for /dev/loop etc. 10May13 - Updated to autoconf-2.69 Updated Debian packaging to require package-hardening tools 22Apr13 - *** cryptmount-4.4beta1 released 14Apr13 - Moved various /etc/init.d & systemd files into new sysinit/ directory 24Feb13 - Added support for '--system-boot' command-line option Added deprecation notice for /etc/default/cryptmount in bootup script 13Feb13 - Reorganized command-line parser to unify mode & flag declarations 09Feb13 - Added support for 'bootaction' option within configuration file 05Feb13 - Updated LUKS functions to mirror cryptsetup-1.6.0 19Dec12 - Adjusted key-generation to reduce risk of blocking on /dev/random 18Mar12 - *** cryptmount-4.3 released 28Jan12 - *** cryptmount-4.3beta1 released 26Jan12 - Added unit-test for config-files containing environmental variables 22Jan12 - Improved robustness to random combinations of compilation options 01Jan12 - Updated LUKS functions to mirror cryptsetup-1.4.1 31Dec11 - Updated LUKS functions to mirror cryptsetup-1.3.1 29Dec11 - Added support for variables (e.g. $(USERNAME)) in configuration file 08Oct11 - Added support for udev queue hosted beneath /run 17Jun11 - *** cryptmount-4.2 released 11Jun11 - Updated French & German localizations 03May10 - *** cryptmount-4.2beta1 released 02May11 - Added check for working '--size' in cryptsetup-compatibility test 26Apr11 - Added unit-tests for 'mkswap' protection & entropy calculation 26Mar11 - *** cryptmount-4.2alpha1 released 28Feb11 - Patched block-size calculations to consistently use 512-byte blocks 20Feb11 - Added entropy-based check on filesystem before forcing 'mkswap' 21Dec10 - Updated LUKS functions to mirror cryptsetup-1.2.0 23Aug10 - Adjusted configure.ac to use pkg-config to find uuid-dev library 22Aug10 - Updated LUKS functions to mirror cryptsetup-1.1.3 02Jun10 - *** cryptmount-4.1 released 14May10 - Improved logging of system information in testing logfile 02May10 - *** cryptmount-4.1beta1 released 30Apr10 - Extended udev_settle() to support queue.bin of recent udev packages 25Apr10 - Added udev-settling operations to LUKS key manager 06Mar10 - *** cryptmount-4.1alpha1 released 02Mar10 - Added support for 'fsckoptions' flag in cmtab 27Feb10 - Improved legacy-key unit-test to allow for optional key-managers 24Jan10 - Updated LUKS functions to mirror cryptsetup-1.1.0 16Jan10 - Added test of installing in chroot for debian/postinst script 06Dec09 - Patched /etc/init.d script to apply --safety-net option to all targets 17Sep09 - Patched /etc/init.d scripts to correct startup dependencies 13Sep09 - Renamed 'fsoptions' flag to 'mountoptions' in cmtab & internals 08Aug09 - Updated LUKS functions to mirror cryptsetup-1.0.7 17Jun09 - Migrated version control from Subversion to Git 04May09 - *** cryptmount-4.0 released 02May09 - Improved error-trapping in writing of target-status file 25Apr09 - Updated to autoconf-2.61 07Mar09 - Added various udev-waits to avoid race-conditions in mudslinger tests 03Mar09 - Added waits to allow udev events to settle on device creation/deletion 22Feb09 - Added automated test for pure-password key-manager 22Feb09 - *** cryptmount-4.0beta1 released 21Feb09 - Replaced accented chars in French man-pages with groff named chars 01Feb09 - Added mudslinger unit-test for file-format overrides 31Jan09 - Added means for overriding file-format version in builtin key-manager Added various unit-tests for string-processing functions 28Jan09 - Neatened checks on file read/write failures 07Jan09 - *** cryptmount-4.0alpha1 released 06Jan09 - Added support for enhanced password-fortifying in builtin key-manager Added automated test for reading keyfiles created by earlier releases 04Jan09 - Refactored & improved password-fortifying algorithm Purged (redundant) hashing methods from keymanager_t interface 02Jan09 - Extended LUKS-compatibility tests to explore multiple ciphers Improved LUKS key-writing to support choice of cipher+modes 01Jan09 - Refactored linkages between target-definitions & key-managers Neatened installation of default parameters in key-managers 31Dec08 - Renamed 'cment_t' to 'tgtdefn_t' to better align with documentation 16Nov08 - Increased strength of pure-password key derivation function 01Nov08 - Added basic pure-password keymanager, without external keyfile 31Oct08 - Added explicit warnings in documentation about deleting keyfiles 27Oct08 - Patched call to fsck so that fixed f/s errors are treated as success 23Oct08 - Added configuration of /etc/init.d scripts to rpm build-script 20Oct08 - Neatened rpm build-script based on version by Dag Wieers 03Oct08 - *** cryptmount-3.1 released 16Aug08 - tidied internal tests for presence of exising LUKS headers extended LUKS unit-tests to include re-formatting protection 03Aug08 - *** cryptmount-3.1beta1 released 02Aug08 - added basic documentation of LUKS usage to man-pages 01Aug08 - added LUKS inverse-compatibility unit-test 27Jul08 - *** cryptmount-3.1alpha2 released 27Jul08 - added user-confirmation mechanism before formatting LUKS partitions added password-changing mechanisms to LUKS key-manager 26Jul08 - added support for formatting LUKS partitions 19Jul08 - extended keymanager interface to support fixed keyfile locations (e.g. LUKS) 20Jun08 - added auto loopback creation for LUKS targets within ordinary files 19Jun08 - *** cryptmount-3.1alpha1 released 19Jun08 - added unit-test for LUKS compatibility layer 16Jun08 - added prototypical mechanisms for mounting LUKS partitions 15Jun08 - preparing basic infrastructure for LUKS compatibility layer 07Jun08 - *** cryptmount-3.0 released 06Jun08 - added German localization of messages, provided by Kai Wasserbäch 18May08 - converted charset of French manpages from latin1 to utf8 16May08 - tidied more OpenSSL artefacts 12May08 - titied debian build-directory 11May08 - *** cryptmount-3.0beta1 released 10May08 - added basic French localization of cryptmount-setup script 05May08 - began internationalizing cryptmount-setup script 26Apr08 - added support for multiple password attempts on key-extraction improved consistency of usage of baddecrypt error-flag 24Mar08 - added unit-test for '_DEFAULTS_' pseudo-target 11Mar08 - added support for '_DEFAULTS_' pseudo-target 18Feb08 - neatened licence statements in *.c, *.h 03Feb08 - began removing dependence on OpenSSL library 27Jan08 - updated to automake-1.10 20Jan08 - *** cryptmount-2.2 released 20Jan08 - enhanced error-trapping on loop-device setup failure 18Jan08 - added further explanation of device-mapper error messages to README 20Dec07 - updated French translations 14Dec07 - *** cryptmount-2.2beta1 released 09Dec07 - removed (spurious) restriction of '--passwd-fd' option to root only 08Dec07 - altered relative priority of libgcrypt & openssl in configure script 07Dec07 - refactored command-line password reading into km_get_passwd() wired-together reading of passwords from file-descriptor 25Nov07 - tidied various whitespace anomalies 04Nov07 - added lintian-override file to quieten complaints about setuid binary 27Oct07 - changed OpenSSL key-manager to use internal password dialogue function added posix-compliant version of getpass() when termios.h is available 06Oct07 - improved memory-cleanup within gcrypt key-extraction 05Oct07 - patched module-installation to give better control over strip/no-strip adjusted key-manager def'ns to prepare for reading passwds via streams 05Aug07 - refactored cleanup mechanisms in 'mudslinger' testing script 04Aug07 - *** cryptmount-2.1 released 04Aug07 - split /etc/init.d script into separate early & normal phases added basic man-page for cryptmount-setup 17Jul07 - *** branch-2.1 forked from trunk 15Jul07 - added notices about migration plans for avoiding OpenSSL library added 'reuse-key' option 14Jul07 - add OpenSSL-compatible key reading/writing via libgcrypt extended tests for cipher/digest name-mapping in armour-gcry.c added unit-test for extraction of OpenSSL keys via libgcrypt extended automatic cipher/digest name-mapping in armour-gcry.c 13Jul07 - reorganized libgcrypt key/iv-init to allow OpenSSL-compatible algo 12Jul07 - adjusted add_keymgr() to allow adding pre-built lists of key-managers 30May07 - extended commentary messaging in auto-setup script 28May07 - added beginning of auto-setup script 06May07 - added basic '--safetynet' option 04May07 - added precautionary modprobe for dm-mod to /etc/init.d startup script 29Apr07 - patched BLKGETSIZE test to cope better with block-size != 512bytes added comments in documentation about bad keysizes added explicit casting on converting uint32 to uchar updated to autoconf-1.9.6 & gettext-0.16.1 18Apr07 - added more return-code checks in password-changing 10Apr07 - *** cryptmount-2.0 released 02Apr07 - updated French manual pages 29Mar07 - added extra checks for fwrite()-success on key-generation 27Mar07 - widened use of size_t, to improve 64bit-cleanliness 24Mar07 - added 'splint' target to Makefile patched various type imperfections identified by 'splint' 19Mar07 - added basic security check on key-manager module directory 18Mar07 - extended README discussion of configuration at boot 15Mar07 - patched unsigned/size_t conflict in km_aug_key() 12Mar07 - *** cryptmount-2.0beta1 released 10Mar07 - reduced dependency of mudslinger testing-script on OpenSSL support adjusted configure.ac to use OpenSSL & libgcrypt by default if available 07Mar07 - made random-key generation less excessively greedy for entropy 06Mar07 - neatened internal special cases for unencrypted (raw) keys 04Mar07 - re-prioritized keymanagers to make builtin-type default for new keys added '--key-managers' option for listing available crypto engines 03Mar07 - increased security of memory management in armour-gcry key-extraction 01Mar07 - extracted armour-gcry key augmentation/checksum routines into utils.c 27Feb07 - added beginnings of built-in sha1/blowfish key-manager mechanisms added unit-test for internal Blowfish algorithm 25Feb07 - added unit-test for internal SHA1 algorithm added implementation of Blowfish algorithm (from http://www.schneier.com/code/bfsh-sch.zip (declared as "public domain")) 24Feb07 - extracted various armour/tables functions into new utils.{h,c} added basic implementation of SHA1 message-digest replaced crude raw-keymanager hashing algorithm with SHA1 23Feb07 - added basic support for dynamically loadable keymanager modules 19Feb07 - extracted OpenSSL & libgcrypt routines into separate armour-*.c files adjusted key-manager list-mechanisms to prepare for loadable modules 17Feb07 - added support for 'early' setup of cryptmount devices on system boot 13Feb07 - improved cleanup on test-failure in testing script 11Feb07 - improved configure.ac tests for libdevmapper components 10Feb07 - added randomized time-delay to config-file locking mechanisms 28Jan07 - added outline description of boot-time mounting/swap-on to README 26Jan07 - added new getblkcount() method for 32/64 bit filesystem block-count added unit-test for relationship between BLKGETSIZE64 & BLKGETSIZE 25Jan07 - changed block-start/length & iv-offset to int64 type to support v.large filesystems 05Nov06 - automated translation of install-paths in debian setup 15Oct06 - *** cryptmount-1.2 released 15Oct06 - added debian/* entries to default distribution 10Oct06 - augmented initscript to automatically include pathname of executable 05Oct06 - adjusted is_mounted() to use device-IDs rather than pathnames 01Oct06 - enhanced checking for missing command-line parameters 30Sep06 - added support for reading config-info from command-line via stream added separate unit-test for locks on privileged operations 02Sep06 - added support for 'pri=' flag in fsoptions for crypto-swap patched is_mounted() to mitigate pathname canonicalization in /etc/mtab added tests for pathname oddities in testing script 29Aug06 - incorporated Erich Schubert's patch for posix-compliant init script 14Aug06 - *** cryptmount-1.1 released 06Aug06 - added /etc/init.d script for setting up swap/filesystems at boot-up 30Jul06 - added '--enable-swap' option to configure.ac for crypto-swap 17Jul06 - *** cryptmount-1.1_beta released 16Jul06 - added support for encrypted swap partitions via '--swapon' option 08Jul06 - incorporated Baruch Even's '\-' patches into man-pages 30Jun06 - added unit-test for keyfile r/w across all key formats 24Jun06 - added support for keyfiles protected by libgcrypt library 18Jun06 - added clarifications to licence relating to OpenSSL linkage 17Jun06 - added simple unit-testing mechanisms for internal routines 16Jun06 - added '--with-openssl' option to configure 14Jun06 - abstracted cipher functions to enable support for multiple crypto-libs 27May06 - added default cipher-algorithm variables to configure.ac 26May06 - patched bug relating to loopbacks on readonly devices 08May06 - *** cryptmount-1.0rc1 forked & released 07May06 - added testing of multiple quasi-simultaneous mounts to testing script 06May06 - added cmstatus file to store user-locks rather than chown() keyfiles 30Apr06 - added argv[0] switches to allow invocation via 'cryptumount' etc 28Apr06 - updated man-page and README to include easier keyfile generation added testing of --change-password to testing script 27Apr06 - added testing of --generate-key to testing script 23Apr06 - added password-changing facilities added user-friendly facility for generating new key-files 21Apr06 - added preliminary French message translations (.po file) 20Apr06 - added French versions of manual pages 16Apr06 - changed delegation and fsck to be enabled by default moved man-pages into separate sub-directory (to prepare to i18n) 14Apr06 - patched rpm .spec file to allow building by non-root user ------ 08Apr06 - *** cryptmount-0.4 released 08Apr06 - added test for user/nouser flags adjusted man-page preprocessing to reflect fsck compilation-flag 07Apr06 - added 'flags' parameter to control privileged actions + auto-fsck 01Apr06 - added optional automatic fsck before mounting 24Mar06 - added optional delegation of (un)mounting to /bin/mount, /bin/umount 22Mar06 - created new fsutils.{h,c} & prepared fsoptions for mount-delegation 14Mar06 - added facility for unprotected (plain) decryption key 11Mar06 - added separate man-page for configuration file improved configure/Makefile expansion of @etcdir@ macro in man-pages 10Mar06 - changed output of --list to go to stdout rather than stderr added testing of --list and null-cmtab to testing script ------ 05Mar06 - *** cryptmount-0.3 released 02Mar06 - added password-changing & fsck examples to man-page 28Feb06 - added debianization scripts 26Feb06 - added test for /etc/mtab updating to testing script 25Feb06 - added connection to syslog for mount/unmount/prepare/release actions neatened configure tests for openssl & libdevmapper 24Feb06 - patched to improve support for LARGEFILEs 22Feb06 - made testing-script more tolerant of miscompiled executable 17Feb06 - changed /etc/mtab entries to use full name of mounted device adjusted unmount/release modes to continue beyond unconfigured targets 11Feb06 - added facilities for multiple-targets & '--all' option on command-line 10Feb06 - added security checks on directory containing cmtab ------ 02Feb06 - *** cryptmount-0.2 released 28Jan06 - added 'loop' parameter test to testing script improved syntax-error catching in cmtab added basic checks on security of target specification 23Jan06 - added 'loop' parameter to cmtab parser added basic checks on security of cmtab 22Jan06 - added rpm spec-file (based on version by Holger Mueller) 21Jan06 - added 'ivoffset' parameter to cmtab parser neatened delegation mechanisms for cmtab token-processing added cryptsetup-compatibility test to testing-script 20Jan06 - moved various security-related routines into new armour.{c,h} 15Jan06 - increased speed of startsector/numsector unit-test with new bingrep.c 14Jan06 - added 'startsector' & 'numsectors' parameters to cmtab parser ------ 06Jan06 - *** cryptmount-0.1 released 04Jan06 - added more informative error-messages for (un)mount failures 25Dec05 - patched command-line options to prefer 'unmount' over 'umount' added option-synonym test to testing-script 23Dec05 - patched to ease compilation on FedoraCore-4 (+ kernel-2.4 headers) 22Dec05 - neatened usage examples in README & man-page 18Dec05 - added mechanisms for updating /etc/mtab on (un)mounting ------ 16Dec05 - *** cryptmount-0.0.3 released 16Dec05 - allowed for automatic creation of device-nodes by libdevmapper 15Dec05 - added key-decryption failure detection 14Dec05 - patched bug in handling non-default keycipher & keyhash algorithms 12Dec05 - informative return-codes wired-in automatic testing script ("mudslinger") created ------ 09Dec05 - *** cryptmount-0.0.2 released 06Dec05 - added basic man-page added locking mechanism to avoid unmounting by different user 04Dec05 - added facility for configuring devices without mounting 03Dec05 - config-files below ${sysconfdir}/cryptmount/ improved error-handling & debris-removal on mount-failures ------ 02Dec05 - *** cryptmount-0.0.1 released cryptmount-5.2/armour.h0000644000175000017500000001027612612065221012206 00000000000000/* * Declarations for encryption/security mechanisms for cryptmount * (C)Copyright 2005-2015, RW Penney */ /* This file is part of cryptmount cryptmount is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. cryptmount is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. */ #ifndef _ARMOUR_H #define _ARMOUR_H #include "cryptmount.h" /*! \addtogroup keymgrs * @{ */ struct keyinfo; struct bound_tgtdefn; struct cm_testinfo; struct km_pw_context; struct km_overrides; /*! @brief Abstract interface to manager of filesystem access keys. * * This structure consists of a set of function points, * defining mechanisms through which filesystem keys * can be read from, or written to, a secure key container. * Different key-managers may use different approaches * to key security, e.g. using libgcrypt for a stand-alone key, * or LUKS for key storage within a filesystem header. */ typedef struct keymanager { const char *ident; unsigned initialized; /*! Initialize any underlying cryptographic libraries */ int (*init_algs)(void); /*! Close-down any underlying cryptographic libraries */ int (*free_algs)(void); /*! Attempt to attach to particular target, installing default fields in target-definition */ int (*bind)(struct bound_tgtdefn *boundtgt, FILE *fp_key); /*! Get properties, e.g. whether a password is needed for access: */ unsigned (*get_properties)(const struct bound_tgtdefn *boundtgt); /*! Extract encrypted key from file: */ int (*get_key)(struct bound_tgtdefn *boundtgt, const struct km_pw_context *pw_ctxt, uint8_t **key, int *keylen, FILE *fp_key); /*! Write encrypted key into file: */ int (*put_key)(struct bound_tgtdefn *boundtgt, const struct km_pw_context *pw_ctxt, const uint8_t *key, const int keylen, FILE *fp_key); /*! Linked-list scaffolding: */ struct keymanager *next; #ifdef TESTING void (*install_testctxt)(struct cm_testinfo *context); int (*run_tests)(void); unsigned test_flags; #endif } keymanager_t; /*! Key-manager initialization status flags: */ enum { KM_INIT_ALGS = 0x001, KM_TESTED = 0x800 }; /*! Key-manager key-properties flags: */ enum { KM_PROP_HASPASSWD = 0x001, /*!< Password needed to access key */ KM_PROP_NEEDSKEYFILE = 0x002, /*!< Key-file must be present */ KM_PROP_FIXEDLOC = 0x004, /*!< Key-file cannot be renamed */ KM_PROP_FORMATTED = 0x008 /*!< Key-file has been formatted */ }; /*! Association of user-defined target-data & particular key-manager: */ typedef struct bound_tgtdefn { tgtdefn_t *tgt; const keymanager_t *keymgr; void *km_data; } bound_tgtdefn_t; const char **get_keymgr_list(void); int free_keymanagers(void); bound_tgtdefn_t *bind_tgtdefn(const tgtdefn_t *tgt); void free_boundtgt(bound_tgtdefn_t *boundtgt); unsigned cm_get_keyproperties(const bound_tgtdefn_t *boundtgt); int cm_get_key(bound_tgtdefn_t *boundtgt, const struct km_pw_context *pw_ctxt, uint8_t **key, int *keylen); int cm_put_key(bound_tgtdefn_t *boundtgt, const struct km_pw_context *pw_ctxt, const uint8_t *key, const int keylen, FILE *fp_key); size_t mk_key_string(const uint8_t *key, const size_t keylen, char *buff); int sycheck_directory(const char *dirname); int sycheck_cmtab(const char *cmtab); int sycheck_target(const struct tgtdefn *ent); int cm_mutex_lock(void); int cm_mutex_unlock(void); /** @} */ #endif /* _ARMOUR_H */ /* * (C)Copyright 2005-2015, RW Penney */ cryptmount-5.2/delegates.h.in0000644000175000017500000000371212612111565013243 00000000000000/* * delegation-related declations for cryptmount * (C)Copyright 2006-2015, RW Penney */ /* This file is part of cryptmount cryptmount is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. cryptmount is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. */ #ifndef _DELEGATES_H #define _DELEGATES_H /*! Default PATH to use when running subprocesses as root */ #define CM_DEFAULT_SUPATH "@CM_DEFAULT_SUPATH@" /* Whether to use internal substitutes for mount(8) or umount(8): */ #ifndef ERSATZ_MOUNT # define ERSATZ_MOUNT @ERSATZ_MOUNT@ #endif #ifndef ERSATZ_UMOUNT # define ERSATZ_UMOUNT @ERSATZ_UMOUNT@ #endif /* whether to enable crypto-swap support: */ #ifndef WITH_CSWAP # define WITH_CSWAP @WITH_CSWAP@ #endif /* whether to automatically check filesystem before mounting: */ #ifndef WITH_FSCK # define WITH_FSCK @WITH_FSCK@ #endif #if !ERSATZ_MOUNT /* path of mount(8), e.g. from util-linux package: */ # define DLGT_MOUNT "@PATH_MOUNT@" #endif #if !ERSATZ_UMOUNT /* path of umount(8), e.g. from util-linux package: */ # define DLGT_UMOUNT "@PATH_UMOUNT@" #endif #if WITH_CSWAP /* path of mkswap(8), e.g. from util-linux package: */ # define DLGT_MKSWAP "@PATH_MKSWAP@" #endif #if WITH_FSCK /* path of fsck(8), e.g. from e2fsprogs package: */ # define DLGT_FSCK "@PATH_FSCK@" #endif #endif /* _DELEGATES_H */ /* * (C)Copyright 2006-2013, RW Penney */ cryptmount-5.2/config.sub0000755000175000017500000007547011216245452012527 00000000000000#! /bin/sh # Configuration validation subroutine script. # Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, # 2000, 2001, 2002, 2003, 2004, 2005 Free Software Foundation, Inc. timestamp='2005-04-22' # This file is (in principle) common to ALL GNU software. # The presence of a machine in this file suggests that SOME GNU software # can handle that machine. It does not imply ALL GNU software can. # # This file is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 59 Temple Place - Suite 330, # Boston, MA 02111-1307, USA. # As a special exception to the GNU General Public License, if you # distribute this file as part of a program that contains a # configuration script generated by Autoconf, you may include it under # the same distribution terms that you use for the rest of that program. # Please send patches to . Submit a context # diff and a properly formatted ChangeLog entry. # # Configuration subroutine to validate and canonicalize a configuration type. # Supply the specified configuration type as an argument. # If it is invalid, we print an error message on stderr and exit with code 1. # Otherwise, we print the canonical config type on stdout and succeed. # This file is supposed to be the same for all GNU packages # and recognize all the CPU types, system types and aliases # that are meaningful with *any* GNU software. # Each package is responsible for reporting which valid configurations # it does not support. The user should be able to distinguish # a failure to support a valid configuration from a meaningless # configuration. # The goal of this file is to map all the various variations of a given # machine specification into a single specification in the form: # CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM # or in some cases, the newer four-part form: # CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM # It is wrong to echo any other type of specification. me=`echo "$0" | sed -e 's,.*/,,'` usage="\ Usage: $0 [OPTION] CPU-MFR-OPSYS $0 [OPTION] ALIAS Canonicalize a configuration name. Operation modes: -h, --help print this help, then exit -t, --time-stamp print date of last modification, then exit -v, --version print version number, then exit Report bugs and patches to ." version="\ GNU config.sub ($timestamp) Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005 Free Software Foundation, Inc. This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE." help=" Try \`$me --help' for more information." # Parse command line while test $# -gt 0 ; do case $1 in --time-stamp | --time* | -t ) echo "$timestamp" ; exit 0 ;; --version | -v ) echo "$version" ; exit 0 ;; --help | --h* | -h ) echo "$usage"; exit 0 ;; -- ) # Stop option processing shift; break ;; - ) # Use stdin as input. break ;; -* ) echo "$me: invalid option $1$help" exit 1 ;; *local*) # First pass through any local machine types. echo $1 exit 0;; * ) break ;; esac done case $# in 0) echo "$me: missing argument$help" >&2 exit 1;; 1) ;; *) echo "$me: too many arguments$help" >&2 exit 1;; esac # Separate what the user gave into CPU-COMPANY and OS or KERNEL-OS (if any). # Here we must recognize all the valid KERNEL-OS combinations. maybe_os=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\2/'` case $maybe_os in nto-qnx* | linux-gnu* | linux-dietlibc | linux-uclibc* | uclinux-uclibc* | uclinux-gnu* | \ kfreebsd*-gnu* | knetbsd*-gnu* | netbsd*-gnu* | storm-chaos* | os2-emx* | rtmk-nova*) os=-$maybe_os basic_machine=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\1/'` ;; *) basic_machine=`echo $1 | sed 's/-[^-]*$//'` if [ $basic_machine != $1 ] then os=`echo $1 | sed 's/.*-/-/'` else os=; fi ;; esac ### Let's recognize common machines as not being operating systems so ### that things like config.sub decstation-3100 work. We also ### recognize some manufacturers as not being operating systems, so we ### can provide default operating systems below. case $os in -sun*os*) # Prevent following clause from handling this invalid input. ;; -dec* | -mips* | -sequent* | -encore* | -pc532* | -sgi* | -sony* | \ -att* | -7300* | -3300* | -delta* | -motorola* | -sun[234]* | \ -unicom* | -ibm* | -next | -hp | -isi* | -apollo | -altos* | \ -convergent* | -ncr* | -news | -32* | -3600* | -3100* | -hitachi* |\ -c[123]* | -convex* | -sun | -crds | -omron* | -dg | -ultra | -tti* | \ -harris | -dolphin | -highlevel | -gould | -cbm | -ns | -masscomp | \ -apple | -axis | -knuth | -cray) os= basic_machine=$1 ;; -sim | -cisco | -oki | -wec | -winbond) os= basic_machine=$1 ;; -scout) ;; -wrs) os=-vxworks basic_machine=$1 ;; -chorusos*) os=-chorusos basic_machine=$1 ;; -chorusrdb) os=-chorusrdb basic_machine=$1 ;; -hiux*) os=-hiuxwe2 ;; -sco5) os=-sco3.2v5 basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -sco4) os=-sco3.2v4 basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -sco3.2.[4-9]*) os=`echo $os | sed -e 's/sco3.2./sco3.2v/'` basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -sco3.2v[4-9]*) # Don't forget version if it is 3.2v4 or newer. basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -sco*) os=-sco3.2v2 basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -udk*) basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -isc) os=-isc2.2 basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -clix*) basic_machine=clipper-intergraph ;; -isc*) basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -lynx*) os=-lynxos ;; -ptx*) basic_machine=`echo $1 | sed -e 's/86-.*/86-sequent/'` ;; -windowsnt*) os=`echo $os | sed -e 's/windowsnt/winnt/'` ;; -psos*) os=-psos ;; -mint | -mint[0-9]*) basic_machine=m68k-atari os=-mint ;; esac # Decode aliases for certain CPU-COMPANY combinations. case $basic_machine in # Recognize the basic CPU types without company name. # Some are omitted here because they have special meanings below. 1750a | 580 \ | a29k \ | alpha | alphaev[4-8] | alphaev56 | alphaev6[78] | alphapca5[67] \ | alpha64 | alpha64ev[4-8] | alpha64ev56 | alpha64ev6[78] | alpha64pca5[67] \ | am33_2.0 \ | arc | arm | arm[bl]e | arme[lb] | armv[2345] | armv[345][lb] | avr \ | bfin \ | c4x | clipper \ | d10v | d30v | dlx | dsp16xx \ | fr30 | frv \ | h8300 | h8500 | hppa | hppa1.[01] | hppa2.0 | hppa2.0[nw] | hppa64 \ | i370 | i860 | i960 | ia64 \ | ip2k | iq2000 \ | m32r | m32rle | m68000 | m68k | m88k | maxq | mcore \ | mips | mipsbe | mipseb | mipsel | mipsle \ | mips16 \ | mips64 | mips64el \ | mips64vr | mips64vrel \ | mips64orion | mips64orionel \ | mips64vr4100 | mips64vr4100el \ | mips64vr4300 | mips64vr4300el \ | mips64vr5000 | mips64vr5000el \ | mipsisa32 | mipsisa32el \ | mipsisa32r2 | mipsisa32r2el \ | mipsisa64 | mipsisa64el \ | mipsisa64r2 | mipsisa64r2el \ | mipsisa64sb1 | mipsisa64sb1el \ | mipsisa64sr71k | mipsisa64sr71kel \ | mipstx39 | mipstx39el \ | mn10200 | mn10300 \ | msp430 \ | ns16k | ns32k \ | openrisc | or32 \ | pdp10 | pdp11 | pj | pjl \ | powerpc | powerpc64 | powerpc64le | powerpcle | ppcbe \ | pyramid \ | sh | sh[1234] | sh[23]e | sh[34]eb | shbe | shle | sh[1234]le | sh3ele \ | sh64 | sh64le \ | sparc | sparc64 | sparc64b | sparc86x | sparclet | sparclite \ | sparcv8 | sparcv9 | sparcv9b \ | strongarm \ | tahoe | thumb | tic4x | tic80 | tron \ | v850 | v850e \ | we32k \ | x86 | xscale | xscalee[bl] | xstormy16 | xtensa \ | z8k) basic_machine=$basic_machine-unknown ;; m6811 | m68hc11 | m6812 | m68hc12) # Motorola 68HC11/12. basic_machine=$basic_machine-unknown os=-none ;; m88110 | m680[12346]0 | m683?2 | m68360 | m5200 | v70 | w65 | z8k) ;; # We use `pc' rather than `unknown' # because (1) that's what they normally are, and # (2) the word "unknown" tends to confuse beginning users. i*86 | x86_64) basic_machine=$basic_machine-pc ;; # Object if more than one company name word. *-*-*) echo Invalid configuration \`$1\': machine \`$basic_machine\' not recognized 1>&2 exit 1 ;; # Recognize the basic CPU types with company name. 580-* \ | a29k-* \ | alpha-* | alphaev[4-8]-* | alphaev56-* | alphaev6[78]-* \ | alpha64-* | alpha64ev[4-8]-* | alpha64ev56-* | alpha64ev6[78]-* \ | alphapca5[67]-* | alpha64pca5[67]-* | arc-* \ | arm-* | armbe-* | armle-* | armeb-* | armv*-* \ | avr-* \ | bfin-* | bs2000-* \ | c[123]* | c30-* | [cjt]90-* | c4x-* | c54x-* | c55x-* | c6x-* \ | clipper-* | craynv-* | cydra-* \ | d10v-* | d30v-* | dlx-* \ | elxsi-* \ | f30[01]-* | f700-* | fr30-* | frv-* | fx80-* \ | h8300-* | h8500-* \ | hppa-* | hppa1.[01]-* | hppa2.0-* | hppa2.0[nw]-* | hppa64-* \ | i*86-* | i860-* | i960-* | ia64-* \ | ip2k-* | iq2000-* \ | m32r-* | m32rle-* \ | m68000-* | m680[012346]0-* | m68360-* | m683?2-* | m68k-* \ | m88110-* | m88k-* | maxq-* | mcore-* \ | mips-* | mipsbe-* | mipseb-* | mipsel-* | mipsle-* \ | mips16-* \ | mips64-* | mips64el-* \ | mips64vr-* | mips64vrel-* \ | mips64orion-* | mips64orionel-* \ | mips64vr4100-* | mips64vr4100el-* \ | mips64vr4300-* | mips64vr4300el-* \ | mips64vr5000-* | mips64vr5000el-* \ | mipsisa32-* | mipsisa32el-* \ | mipsisa32r2-* | mipsisa32r2el-* \ | mipsisa64-* | mipsisa64el-* \ | mipsisa64r2-* | mipsisa64r2el-* \ | mipsisa64sb1-* | mipsisa64sb1el-* \ | mipsisa64sr71k-* | mipsisa64sr71kel-* \ | mipstx39-* | mipstx39el-* \ | mmix-* \ | msp430-* \ | none-* | np1-* | ns16k-* | ns32k-* \ | orion-* \ | pdp10-* | pdp11-* | pj-* | pjl-* | pn-* | power-* \ | powerpc-* | powerpc64-* | powerpc64le-* | powerpcle-* | ppcbe-* \ | pyramid-* \ | romp-* | rs6000-* \ | sh-* | sh[1234]-* | sh[23]e-* | sh[34]eb-* | shbe-* \ | shle-* | sh[1234]le-* | sh3ele-* | sh64-* | sh64le-* \ | sparc-* | sparc64-* | sparc64b-* | sparc86x-* | sparclet-* \ | sparclite-* \ | sparcv8-* | sparcv9-* | sparcv9b-* | strongarm-* | sv1-* | sx?-* \ | tahoe-* | thumb-* \ | tic30-* | tic4x-* | tic54x-* | tic55x-* | tic6x-* | tic80-* \ | tron-* \ | v850-* | v850e-* | vax-* \ | we32k-* \ | x86-* | x86_64-* | xps100-* | xscale-* | xscalee[bl]-* \ | xstormy16-* | xtensa-* \ | ymp-* \ | z8k-*) ;; # Recognize the various machine names and aliases which stand # for a CPU type and a company and sometimes even an OS. 386bsd) basic_machine=i386-unknown os=-bsd ;; 3b1 | 7300 | 7300-att | att-7300 | pc7300 | safari | unixpc) basic_machine=m68000-att ;; 3b*) basic_machine=we32k-att ;; a29khif) basic_machine=a29k-amd os=-udi ;; abacus) basic_machine=abacus-unknown ;; adobe68k) basic_machine=m68010-adobe os=-scout ;; alliant | fx80) basic_machine=fx80-alliant ;; altos | altos3068) basic_machine=m68k-altos ;; am29k) basic_machine=a29k-none os=-bsd ;; amd64) basic_machine=x86_64-pc ;; amd64-*) basic_machine=x86_64-`echo $basic_machine | sed 's/^[^-]*-//'` ;; amdahl) basic_machine=580-amdahl os=-sysv ;; amiga | amiga-*) basic_machine=m68k-unknown ;; amigaos | amigados) basic_machine=m68k-unknown os=-amigaos ;; amigaunix | amix) basic_machine=m68k-unknown os=-sysv4 ;; apollo68) basic_machine=m68k-apollo os=-sysv ;; apollo68bsd) basic_machine=m68k-apollo os=-bsd ;; aux) basic_machine=m68k-apple os=-aux ;; balance) basic_machine=ns32k-sequent os=-dynix ;; c90) basic_machine=c90-cray os=-unicos ;; convex-c1) basic_machine=c1-convex os=-bsd ;; convex-c2) basic_machine=c2-convex os=-bsd ;; convex-c32) basic_machine=c32-convex os=-bsd ;; convex-c34) basic_machine=c34-convex os=-bsd ;; convex-c38) basic_machine=c38-convex os=-bsd ;; cray | j90) basic_machine=j90-cray os=-unicos ;; craynv) basic_machine=craynv-cray os=-unicosmp ;; cr16c) basic_machine=cr16c-unknown os=-elf ;; crds | unos) basic_machine=m68k-crds ;; crisv32 | crisv32-* | etraxfs*) basic_machine=crisv32-axis ;; cris | cris-* | etrax*) basic_machine=cris-axis ;; crx) basic_machine=crx-unknown os=-elf ;; da30 | da30-*) basic_machine=m68k-da30 ;; decstation | decstation-3100 | pmax | pmax-* | pmin | dec3100 | decstatn) basic_machine=mips-dec ;; decsystem10* | dec10*) basic_machine=pdp10-dec os=-tops10 ;; decsystem20* | dec20*) basic_machine=pdp10-dec os=-tops20 ;; delta | 3300 | motorola-3300 | motorola-delta \ | 3300-motorola | delta-motorola) basic_machine=m68k-motorola ;; delta88) basic_machine=m88k-motorola os=-sysv3 ;; djgpp) basic_machine=i586-pc os=-msdosdjgpp ;; dpx20 | dpx20-*) basic_machine=rs6000-bull os=-bosx ;; dpx2* | dpx2*-bull) basic_machine=m68k-bull os=-sysv3 ;; ebmon29k) basic_machine=a29k-amd os=-ebmon ;; elxsi) basic_machine=elxsi-elxsi os=-bsd ;; encore | umax | mmax) basic_machine=ns32k-encore ;; es1800 | OSE68k | ose68k | ose | OSE) basic_machine=m68k-ericsson os=-ose ;; fx2800) basic_machine=i860-alliant ;; genix) basic_machine=ns32k-ns ;; gmicro) basic_machine=tron-gmicro os=-sysv ;; go32) basic_machine=i386-pc os=-go32 ;; h3050r* | hiux*) basic_machine=hppa1.1-hitachi os=-hiuxwe2 ;; h8300hms) basic_machine=h8300-hitachi os=-hms ;; h8300xray) basic_machine=h8300-hitachi os=-xray ;; h8500hms) basic_machine=h8500-hitachi os=-hms ;; harris) basic_machine=m88k-harris os=-sysv3 ;; hp300-*) basic_machine=m68k-hp ;; hp300bsd) basic_machine=m68k-hp os=-bsd ;; hp300hpux) basic_machine=m68k-hp os=-hpux ;; hp3k9[0-9][0-9] | hp9[0-9][0-9]) basic_machine=hppa1.0-hp ;; hp9k2[0-9][0-9] | hp9k31[0-9]) basic_machine=m68000-hp ;; hp9k3[2-9][0-9]) basic_machine=m68k-hp ;; hp9k6[0-9][0-9] | hp6[0-9][0-9]) basic_machine=hppa1.0-hp ;; hp9k7[0-79][0-9] | hp7[0-79][0-9]) basic_machine=hppa1.1-hp ;; hp9k78[0-9] | hp78[0-9]) # FIXME: really hppa2.0-hp basic_machine=hppa1.1-hp ;; hp9k8[67]1 | hp8[67]1 | hp9k80[24] | hp80[24] | hp9k8[78]9 | hp8[78]9 | hp9k893 | hp893) # FIXME: really hppa2.0-hp basic_machine=hppa1.1-hp ;; hp9k8[0-9][13679] | hp8[0-9][13679]) basic_machine=hppa1.1-hp ;; hp9k8[0-9][0-9] | hp8[0-9][0-9]) basic_machine=hppa1.0-hp ;; hppa-next) os=-nextstep3 ;; hppaosf) basic_machine=hppa1.1-hp os=-osf ;; hppro) basic_machine=hppa1.1-hp os=-proelf ;; i370-ibm* | ibm*) basic_machine=i370-ibm ;; # I'm not sure what "Sysv32" means. Should this be sysv3.2? i*86v32) basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` os=-sysv32 ;; i*86v4*) basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` os=-sysv4 ;; i*86v) basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` os=-sysv ;; i*86sol2) basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` os=-solaris2 ;; i386mach) basic_machine=i386-mach os=-mach ;; i386-vsta | vsta) basic_machine=i386-unknown os=-vsta ;; iris | iris4d) basic_machine=mips-sgi case $os in -irix*) ;; *) os=-irix4 ;; esac ;; isi68 | isi) basic_machine=m68k-isi os=-sysv ;; m88k-omron*) basic_machine=m88k-omron ;; magnum | m3230) basic_machine=mips-mips os=-sysv ;; merlin) basic_machine=ns32k-utek os=-sysv ;; mingw32) basic_machine=i386-pc os=-mingw32 ;; miniframe) basic_machine=m68000-convergent ;; *mint | -mint[0-9]* | *MiNT | *MiNT[0-9]*) basic_machine=m68k-atari os=-mint ;; mips3*-*) basic_machine=`echo $basic_machine | sed -e 's/mips3/mips64/'` ;; mips3*) basic_machine=`echo $basic_machine | sed -e 's/mips3/mips64/'`-unknown ;; monitor) basic_machine=m68k-rom68k os=-coff ;; morphos) basic_machine=powerpc-unknown os=-morphos ;; msdos) basic_machine=i386-pc os=-msdos ;; mvs) basic_machine=i370-ibm os=-mvs ;; ncr3000) basic_machine=i486-ncr os=-sysv4 ;; netbsd386) basic_machine=i386-unknown os=-netbsd ;; netwinder) basic_machine=armv4l-rebel os=-linux ;; news | news700 | news800 | news900) basic_machine=m68k-sony os=-newsos ;; news1000) basic_machine=m68030-sony os=-newsos ;; news-3600 | risc-news) basic_machine=mips-sony os=-newsos ;; necv70) basic_machine=v70-nec os=-sysv ;; next | m*-next ) basic_machine=m68k-next case $os in -nextstep* ) ;; -ns2*) os=-nextstep2 ;; *) os=-nextstep3 ;; esac ;; nh3000) basic_machine=m68k-harris os=-cxux ;; nh[45]000) basic_machine=m88k-harris os=-cxux ;; nindy960) basic_machine=i960-intel os=-nindy ;; mon960) basic_machine=i960-intel os=-mon960 ;; nonstopux) basic_machine=mips-compaq os=-nonstopux ;; np1) basic_machine=np1-gould ;; nsr-tandem) basic_machine=nsr-tandem ;; op50n-* | op60c-*) basic_machine=hppa1.1-oki os=-proelf ;; or32 | or32-*) basic_machine=or32-unknown os=-coff ;; os400) basic_machine=powerpc-ibm os=-os400 ;; OSE68000 | ose68000) basic_machine=m68000-ericsson os=-ose ;; os68k) basic_machine=m68k-none os=-os68k ;; pa-hitachi) basic_machine=hppa1.1-hitachi os=-hiuxwe2 ;; paragon) basic_machine=i860-intel os=-osf ;; pbd) basic_machine=sparc-tti ;; pbb) basic_machine=m68k-tti ;; pc532 | pc532-*) basic_machine=ns32k-pc532 ;; pentium | p5 | k5 | k6 | nexgen | viac3) basic_machine=i586-pc ;; pentiumpro | p6 | 6x86 | athlon | athlon_*) basic_machine=i686-pc ;; pentiumii | pentium2 | pentiumiii | pentium3) basic_machine=i686-pc ;; pentium4) basic_machine=i786-pc ;; pentium-* | p5-* | k5-* | k6-* | nexgen-* | viac3-*) basic_machine=i586-`echo $basic_machine | sed 's/^[^-]*-//'` ;; pentiumpro-* | p6-* | 6x86-* | athlon-*) basic_machine=i686-`echo $basic_machine | sed 's/^[^-]*-//'` ;; pentiumii-* | pentium2-* | pentiumiii-* | pentium3-*) basic_machine=i686-`echo $basic_machine | sed 's/^[^-]*-//'` ;; pentium4-*) basic_machine=i786-`echo $basic_machine | sed 's/^[^-]*-//'` ;; pn) basic_machine=pn-gould ;; power) basic_machine=power-ibm ;; ppc) basic_machine=powerpc-unknown ;; ppc-*) basic_machine=powerpc-`echo $basic_machine | sed 's/^[^-]*-//'` ;; ppcle | powerpclittle | ppc-le | powerpc-little) basic_machine=powerpcle-unknown ;; ppcle-* | powerpclittle-*) basic_machine=powerpcle-`echo $basic_machine | sed 's/^[^-]*-//'` ;; ppc64) basic_machine=powerpc64-unknown ;; ppc64-*) basic_machine=powerpc64-`echo $basic_machine | sed 's/^[^-]*-//'` ;; ppc64le | powerpc64little | ppc64-le | powerpc64-little) basic_machine=powerpc64le-unknown ;; ppc64le-* | powerpc64little-*) basic_machine=powerpc64le-`echo $basic_machine | sed 's/^[^-]*-//'` ;; ps2) basic_machine=i386-ibm ;; pw32) basic_machine=i586-unknown os=-pw32 ;; rom68k) basic_machine=m68k-rom68k os=-coff ;; rm[46]00) basic_machine=mips-siemens ;; rtpc | rtpc-*) basic_machine=romp-ibm ;; s390 | s390-*) basic_machine=s390-ibm ;; s390x | s390x-*) basic_machine=s390x-ibm ;; sa29200) basic_machine=a29k-amd os=-udi ;; sb1) basic_machine=mipsisa64sb1-unknown ;; sb1el) basic_machine=mipsisa64sb1el-unknown ;; sei) basic_machine=mips-sei os=-seiux ;; sequent) basic_machine=i386-sequent ;; sh) basic_machine=sh-hitachi os=-hms ;; sh64) basic_machine=sh64-unknown ;; sparclite-wrs | simso-wrs) basic_machine=sparclite-wrs os=-vxworks ;; sps7) basic_machine=m68k-bull os=-sysv2 ;; spur) basic_machine=spur-unknown ;; st2000) basic_machine=m68k-tandem ;; stratus) basic_machine=i860-stratus os=-sysv4 ;; sun2) basic_machine=m68000-sun ;; sun2os3) basic_machine=m68000-sun os=-sunos3 ;; sun2os4) basic_machine=m68000-sun os=-sunos4 ;; sun3os3) basic_machine=m68k-sun os=-sunos3 ;; sun3os4) basic_machine=m68k-sun os=-sunos4 ;; sun4os3) basic_machine=sparc-sun os=-sunos3 ;; sun4os4) basic_machine=sparc-sun os=-sunos4 ;; sun4sol2) basic_machine=sparc-sun os=-solaris2 ;; sun3 | sun3-*) basic_machine=m68k-sun ;; sun4) basic_machine=sparc-sun ;; sun386 | sun386i | roadrunner) basic_machine=i386-sun ;; sv1) basic_machine=sv1-cray os=-unicos ;; symmetry) basic_machine=i386-sequent os=-dynix ;; t3e) basic_machine=alphaev5-cray os=-unicos ;; t90) basic_machine=t90-cray os=-unicos ;; tic54x | c54x*) basic_machine=tic54x-unknown os=-coff ;; tic55x | c55x*) basic_machine=tic55x-unknown os=-coff ;; tic6x | c6x*) basic_machine=tic6x-unknown os=-coff ;; tx39) basic_machine=mipstx39-unknown ;; tx39el) basic_machine=mipstx39el-unknown ;; toad1) basic_machine=pdp10-xkl os=-tops20 ;; tower | tower-32) basic_machine=m68k-ncr ;; tpf) basic_machine=s390x-ibm os=-tpf ;; udi29k) basic_machine=a29k-amd os=-udi ;; ultra3) basic_machine=a29k-nyu os=-sym1 ;; v810 | necv810) basic_machine=v810-nec os=-none ;; vaxv) basic_machine=vax-dec os=-sysv ;; vms) basic_machine=vax-dec os=-vms ;; vpp*|vx|vx-*) basic_machine=f301-fujitsu ;; vxworks960) basic_machine=i960-wrs os=-vxworks ;; vxworks68) basic_machine=m68k-wrs os=-vxworks ;; vxworks29k) basic_machine=a29k-wrs os=-vxworks ;; w65*) basic_machine=w65-wdc os=-none ;; w89k-*) basic_machine=hppa1.1-winbond os=-proelf ;; xbox) basic_machine=i686-pc os=-mingw32 ;; xps | xps100) basic_machine=xps100-honeywell ;; ymp) basic_machine=ymp-cray os=-unicos ;; z8k-*-coff) basic_machine=z8k-unknown os=-sim ;; none) basic_machine=none-none os=-none ;; # Here we handle the default manufacturer of certain CPU types. It is in # some cases the only manufacturer, in others, it is the most popular. w89k) basic_machine=hppa1.1-winbond ;; op50n) basic_machine=hppa1.1-oki ;; op60c) basic_machine=hppa1.1-oki ;; romp) basic_machine=romp-ibm ;; mmix) basic_machine=mmix-knuth ;; rs6000) basic_machine=rs6000-ibm ;; vax) basic_machine=vax-dec ;; pdp10) # there are many clones, so DEC is not a safe bet basic_machine=pdp10-unknown ;; pdp11) basic_machine=pdp11-dec ;; we32k) basic_machine=we32k-att ;; sh3 | sh4 | sh[34]eb | sh[1234]le | sh[23]ele) basic_machine=sh-unknown ;; sh64) basic_machine=sh64-unknown ;; sparc | sparcv8 | sparcv9 | sparcv9b) basic_machine=sparc-sun ;; cydra) basic_machine=cydra-cydrome ;; orion) basic_machine=orion-highlevel ;; orion105) basic_machine=clipper-highlevel ;; mac | mpw | mac-mpw) basic_machine=m68k-apple ;; pmac | pmac-mpw) basic_machine=powerpc-apple ;; *-unknown) # Make sure to match an already-canonicalized machine name. ;; *) echo Invalid configuration \`$1\': machine \`$basic_machine\' not recognized 1>&2 exit 1 ;; esac # Here we canonicalize certain aliases for manufacturers. case $basic_machine in *-digital*) basic_machine=`echo $basic_machine | sed 's/digital.*/dec/'` ;; *-commodore*) basic_machine=`echo $basic_machine | sed 's/commodore.*/cbm/'` ;; *) ;; esac # Decode manufacturer-specific aliases for certain operating systems. if [ x"$os" != x"" ] then case $os in # First match some system type aliases # that might get confused with valid system types. # -solaris* is a basic system type, with this one exception. -solaris1 | -solaris1.*) os=`echo $os | sed -e 's|solaris1|sunos4|'` ;; -solaris) os=-solaris2 ;; -svr4*) os=-sysv4 ;; -unixware*) os=-sysv4.2uw ;; -gnu/linux*) os=`echo $os | sed -e 's|gnu/linux|linux-gnu|'` ;; # First accept the basic system types. # The portable systems comes first. # Each alternative MUST END IN A *, to match a version number. # -sysv* is not here because it comes later, after sysvr4. -gnu* | -bsd* | -mach* | -minix* | -genix* | -ultrix* | -irix* \ | -*vms* | -sco* | -esix* | -isc* | -aix* | -sunos | -sunos[34]*\ | -hpux* | -unos* | -osf* | -luna* | -dgux* | -solaris* | -sym* \ | -amigaos* | -amigados* | -msdos* | -newsos* | -unicos* | -aof* \ | -aos* \ | -nindy* | -vxsim* | -vxworks* | -ebmon* | -hms* | -mvs* \ | -clix* | -riscos* | -uniplus* | -iris* | -rtu* | -xenix* \ | -hiux* | -386bsd* | -knetbsd* | -mirbsd* | -netbsd* | -openbsd* \ | -ekkobsd* | -kfreebsd* | -freebsd* | -riscix* | -lynxos* \ | -bosx* | -nextstep* | -cxux* | -aout* | -elf* | -oabi* \ | -ptx* | -coff* | -ecoff* | -winnt* | -domain* | -vsta* \ | -udi* | -eabi* | -lites* | -ieee* | -go32* | -aux* \ | -chorusos* | -chorusrdb* \ | -cygwin* | -pe* | -psos* | -moss* | -proelf* | -rtems* \ | -mingw32* | -linux-gnu* | -linux-uclibc* | -uxpv* | -beos* | -mpeix* | -udk* \ | -interix* | -uwin* | -mks* | -rhapsody* | -darwin* | -opened* \ | -openstep* | -oskit* | -conix* | -pw32* | -nonstopux* \ | -storm-chaos* | -tops10* | -tenex* | -tops20* | -its* \ | -os2* | -vos* | -palmos* | -uclinux* | -nucleus* \ | -morphos* | -superux* | -rtmk* | -rtmk-nova* | -windiss* \ | -powermax* | -dnix* | -nx6 | -nx7 | -sei* | -dragonfly*) # Remember, each alternative MUST END IN *, to match a version number. ;; -qnx*) case $basic_machine in x86-* | i*86-*) ;; *) os=-nto$os ;; esac ;; -nto-qnx*) ;; -nto*) os=`echo $os | sed -e 's|nto|nto-qnx|'` ;; -sim | -es1800* | -hms* | -xray | -os68k* | -none* | -v88r* \ | -windows* | -osx | -abug | -netware* | -os9* | -beos* \ | -macos* | -mpw* | -magic* | -mmixware* | -mon960* | -lnews*) ;; -mac*) os=`echo $os | sed -e 's|mac|macos|'` ;; -linux-dietlibc) os=-linux-dietlibc ;; -linux*) os=`echo $os | sed -e 's|linux|linux-gnu|'` ;; -sunos5*) os=`echo $os | sed -e 's|sunos5|solaris2|'` ;; -sunos6*) os=`echo $os | sed -e 's|sunos6|solaris3|'` ;; -opened*) os=-openedition ;; -os400*) os=-os400 ;; -wince*) os=-wince ;; -osfrose*) os=-osfrose ;; -osf*) os=-osf ;; -utek*) os=-bsd ;; -dynix*) os=-bsd ;; -acis*) os=-aos ;; -atheos*) os=-atheos ;; -syllable*) os=-syllable ;; -386bsd) os=-bsd ;; -ctix* | -uts*) os=-sysv ;; -nova*) os=-rtmk-nova ;; -ns2 ) os=-nextstep2 ;; -nsk*) os=-nsk ;; # Preserve the version number of sinix5. -sinix5.*) os=`echo $os | sed -e 's|sinix|sysv|'` ;; -sinix*) os=-sysv4 ;; -tpf*) os=-tpf ;; -triton*) os=-sysv3 ;; -oss*) os=-sysv3 ;; -svr4) os=-sysv4 ;; -svr3) os=-sysv3 ;; -sysvr4) os=-sysv4 ;; # This must come after -sysvr4. -sysv*) ;; -ose*) os=-ose ;; -es1800*) os=-ose ;; -xenix) os=-xenix ;; -*mint | -mint[0-9]* | -*MiNT | -MiNT[0-9]*) os=-mint ;; -aros*) os=-aros ;; -kaos*) os=-kaos ;; -zvmoe) os=-zvmoe ;; -none) ;; *) # Get rid of the `-' at the beginning of $os. os=`echo $os | sed 's/[^-]*-//'` echo Invalid configuration \`$1\': system \`$os\' not recognized 1>&2 exit 1 ;; esac else # Here we handle the default operating systems that come with various machines. # The value should be what the vendor currently ships out the door with their # machine or put another way, the most popular os provided with the machine. # Note that if you're going to try to match "-MANUFACTURER" here (say, # "-sun"), then you have to tell the case statement up towards the top # that MANUFACTURER isn't an operating system. Otherwise, code above # will signal an error saying that MANUFACTURER isn't an operating # system, and we'll never get to this point. case $basic_machine in *-acorn) os=-riscix1.2 ;; arm*-rebel) os=-linux ;; arm*-semi) os=-aout ;; c4x-* | tic4x-*) os=-coff ;; # This must come before the *-dec entry. pdp10-*) os=-tops20 ;; pdp11-*) os=-none ;; *-dec | vax-*) os=-ultrix4.2 ;; m68*-apollo) os=-domain ;; i386-sun) os=-sunos4.0.2 ;; m68000-sun) os=-sunos3 # This also exists in the configure program, but was not the # default. # os=-sunos4 ;; m68*-cisco) os=-aout ;; mips*-cisco) os=-elf ;; mips*-*) os=-elf ;; or32-*) os=-coff ;; *-tti) # must be before sparc entry or we get the wrong os. os=-sysv3 ;; sparc-* | *-sun) os=-sunos4.1.1 ;; *-be) os=-beos ;; *-ibm) os=-aix ;; *-knuth) os=-mmixware ;; *-wec) os=-proelf ;; *-winbond) os=-proelf ;; *-oki) os=-proelf ;; *-hp) os=-hpux ;; *-hitachi) os=-hiux ;; i860-* | *-att | *-ncr | *-altos | *-motorola | *-convergent) os=-sysv ;; *-cbm) os=-amigaos ;; *-dg) os=-dgux ;; *-dolphin) os=-sysv3 ;; m68k-ccur) os=-rtu ;; m88k-omron*) os=-luna ;; *-next ) os=-nextstep ;; *-sequent) os=-ptx ;; *-crds) os=-unos ;; *-ns) os=-genix ;; i370-*) os=-mvs ;; *-next) os=-nextstep3 ;; *-gould) os=-sysv ;; *-highlevel) os=-bsd ;; *-encore) os=-bsd ;; *-sgi) os=-irix ;; *-siemens) os=-sysv4 ;; *-masscomp) os=-rtu ;; f30[01]-fujitsu | f700-fujitsu) os=-uxpv ;; *-rom68k) os=-coff ;; *-*bug) os=-coff ;; *-apple) os=-macos ;; *-atari*) os=-mint ;; *) os=-none ;; esac fi # Here we handle the case where we know the os, and the CPU type, but not the # manufacturer. We pick the logical manufacturer. vendor=unknown case $basic_machine in *-unknown) case $os in -riscix*) vendor=acorn ;; -sunos*) vendor=sun ;; -aix*) vendor=ibm ;; -beos*) vendor=be ;; -hpux*) vendor=hp ;; -mpeix*) vendor=hp ;; -hiux*) vendor=hitachi ;; -unos*) vendor=crds ;; -dgux*) vendor=dg ;; -luna*) vendor=omron ;; -genix*) vendor=ns ;; -mvs* | -opened*) vendor=ibm ;; -os400*) vendor=ibm ;; -ptx*) vendor=sequent ;; -tpf*) vendor=ibm ;; -vxsim* | -vxworks* | -windiss*) vendor=wrs ;; -aux*) vendor=apple ;; -hms*) vendor=hitachi ;; -mpw* | -macos*) vendor=apple ;; -*mint | -mint[0-9]* | -*MiNT | -MiNT[0-9]*) vendor=atari ;; -vos*) vendor=stratus ;; esac basic_machine=`echo $basic_machine | sed "s/unknown/$vendor/"` ;; esac echo $basic_machine$os exit 0 # Local variables: # eval: (add-hook 'write-file-hooks 'time-stamp) # time-stamp-start: "timestamp='" # time-stamp-format: "%:y-%02m-%02d" # time-stamp-end: "'" # End: cryptmount-5.2/blowfish.h0000644000175000017500000000111612612065221012507 00000000000000/* * Declarations for "Blowfish" cipher algorithm * (Based on Bruce Schneier's implementation at http://www.schneier.com * subsequently edited by RW Penney for "cryptmount") */ /* This file is part of cryptmount */ #include typedef struct cm_bf_ctxt { uint32_t p[18]; uint32_t sbox[4][256]; } cm_bf_ctxt_t; cm_bf_ctxt_t *cm_bf_init(uint8_t *key, size_t keybytes); void cm_bf_encipher(const cm_bf_ctxt_t *ctxt, uint32_t *xl, uint32_t *xr); void cm_bf_decipher(const cm_bf_ctxt_t *ctxt, uint32_t *xl, uint32_t *xr); void cm_bf_free(cm_bf_ctxt_t *ctxt); cryptmount-5.2/compile0000755000175000017500000001624512521463357012123 00000000000000#! /bin/sh # Wrapper for compilers which do not understand '-c -o'. scriptversion=2012-10-14.11; # UTC # Copyright (C) 1999-2013 Free Software Foundation, Inc. # Written by Tom Tromey . # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2, or (at your option) # any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see . # As a special exception to the GNU General Public License, if you # distribute this file as part of a program that contains a # configuration script generated by Autoconf, you may include it under # the same distribution terms that you use for the rest of that program. # This file is maintained in Automake, please report # bugs to or send patches to # . nl=' ' # We need space, tab and new line, in precisely that order. Quoting is # there to prevent tools from complaining about whitespace usage. IFS=" "" $nl" file_conv= # func_file_conv build_file lazy # Convert a $build file to $host form and store it in $file # Currently only supports Windows hosts. If the determined conversion # type is listed in (the comma separated) LAZY, no conversion will # take place. func_file_conv () { file=$1 case $file in / | /[!/]*) # absolute file, and not a UNC file if test -z "$file_conv"; then # lazily determine how to convert abs files case `uname -s` in MINGW*) file_conv=mingw ;; CYGWIN*) file_conv=cygwin ;; *) file_conv=wine ;; esac fi case $file_conv/,$2, in *,$file_conv,*) ;; mingw/*) file=`cmd //C echo "$file " | sed -e 's/"\(.*\) " *$/\1/'` ;; cygwin/*) file=`cygpath -m "$file" || echo "$file"` ;; wine/*) file=`winepath -w "$file" || echo "$file"` ;; esac ;; esac } # func_cl_dashL linkdir # Make cl look for libraries in LINKDIR func_cl_dashL () { func_file_conv "$1" if test -z "$lib_path"; then lib_path=$file else lib_path="$lib_path;$file" fi linker_opts="$linker_opts -LIBPATH:$file" } # func_cl_dashl library # Do a library search-path lookup for cl func_cl_dashl () { lib=$1 found=no save_IFS=$IFS IFS=';' for dir in $lib_path $LIB do IFS=$save_IFS if $shared && test -f "$dir/$lib.dll.lib"; then found=yes lib=$dir/$lib.dll.lib break fi if test -f "$dir/$lib.lib"; then found=yes lib=$dir/$lib.lib break fi if test -f "$dir/lib$lib.a"; then found=yes lib=$dir/lib$lib.a break fi done IFS=$save_IFS if test "$found" != yes; then lib=$lib.lib fi } # func_cl_wrapper cl arg... # Adjust compile command to suit cl func_cl_wrapper () { # Assume a capable shell lib_path= shared=: linker_opts= for arg do if test -n "$eat"; then eat= else case $1 in -o) # configure might choose to run compile as 'compile cc -o foo foo.c'. eat=1 case $2 in *.o | *.[oO][bB][jJ]) func_file_conv "$2" set x "$@" -Fo"$file" shift ;; *) func_file_conv "$2" set x "$@" -Fe"$file" shift ;; esac ;; -I) eat=1 func_file_conv "$2" mingw set x "$@" -I"$file" shift ;; -I*) func_file_conv "${1#-I}" mingw set x "$@" -I"$file" shift ;; -l) eat=1 func_cl_dashl "$2" set x "$@" "$lib" shift ;; -l*) func_cl_dashl "${1#-l}" set x "$@" "$lib" shift ;; -L) eat=1 func_cl_dashL "$2" ;; -L*) func_cl_dashL "${1#-L}" ;; -static) shared=false ;; -Wl,*) arg=${1#-Wl,} save_ifs="$IFS"; IFS=',' for flag in $arg; do IFS="$save_ifs" linker_opts="$linker_opts $flag" done IFS="$save_ifs" ;; -Xlinker) eat=1 linker_opts="$linker_opts $2" ;; -*) set x "$@" "$1" shift ;; *.cc | *.CC | *.cxx | *.CXX | *.[cC]++) func_file_conv "$1" set x "$@" -Tp"$file" shift ;; *.c | *.cpp | *.CPP | *.lib | *.LIB | *.Lib | *.OBJ | *.obj | *.[oO]) func_file_conv "$1" mingw set x "$@" "$file" shift ;; *) set x "$@" "$1" shift ;; esac fi shift done if test -n "$linker_opts"; then linker_opts="-link$linker_opts" fi exec "$@" $linker_opts exit 1 } eat= case $1 in '') echo "$0: No command. Try '$0 --help' for more information." 1>&2 exit 1; ;; -h | --h*) cat <<\EOF Usage: compile [--help] [--version] PROGRAM [ARGS] Wrapper for compilers which do not understand '-c -o'. Remove '-o dest.o' from ARGS, run PROGRAM with the remaining arguments, and rename the output as expected. If you are trying to build a whole package this is not the right script to run: please start by reading the file 'INSTALL'. Report bugs to . EOF exit $? ;; -v | --v*) echo "compile $scriptversion" exit $? ;; cl | *[/\\]cl | cl.exe | *[/\\]cl.exe ) func_cl_wrapper "$@" # Doesn't return... ;; esac ofile= cfile= for arg do if test -n "$eat"; then eat= else case $1 in -o) # configure might choose to run compile as 'compile cc -o foo foo.c'. # So we strip '-o arg' only if arg is an object. eat=1 case $2 in *.o | *.obj) ofile=$2 ;; *) set x "$@" -o "$2" shift ;; esac ;; *.c) cfile=$1 set x "$@" "$1" shift ;; *) set x "$@" "$1" shift ;; esac fi shift done if test -z "$ofile" || test -z "$cfile"; then # If no '-o' option was seen then we might have been invoked from a # pattern rule where we don't need one. That is ok -- this is a # normal compilation that the losing compiler can handle. If no # '.c' file was seen then we are probably linking. That is also # ok. exec "$@" fi # Name of file we expect compiler to create. cofile=`echo "$cfile" | sed 's|^.*[\\/]||; s|^[a-zA-Z]:||; s/\.c$/.o/'` # Create the lock directory. # Note: use '[/\\:.-]' here to ensure that we don't use the same name # that we are using for the .o file. Also, base the name on the expected # object file name, since that is what matters with a parallel build. lockdir=`echo "$cofile" | sed -e 's|[/\\:.-]|_|g'`.d while true; do if mkdir "$lockdir" >/dev/null 2>&1; then break fi sleep 1 done # FIXME: race condition here if user kills between mkdir and trap. trap "rmdir '$lockdir'; exit 1" 1 2 15 # Run the compile. "$@" ret=$? if test -f "$cofile"; then test "$cofile" = "$ofile" || mv "$cofile" "$ofile" elif test -f "${cofile}bj"; then test "${cofile}bj" = "$ofile" || mv "${cofile}bj" "$ofile" fi rmdir "$lockdir" exit $ret # Local Variables: # mode: shell-script # sh-indentation: 2 # eval: (add-hook 'write-file-hooks 'time-stamp) # time-stamp-start: "scriptversion=" # time-stamp-format: "%:y-%02m-%02d.%02H" # time-stamp-time-zone: "UTC" # time-stamp-end: "; # UTC" # End: cryptmount-5.2/po/0000755000175000017500000000000012613166774011240 500000000000000cryptmount-5.2/po/quot.sed0000644000175000017500000000023111216245452012626 00000000000000s/"\([^"]*\)"/“\1â€/g s/`\([^`']*\)'/‘\1’/g s/ '\([^`']*\)' / ‘\1’ /g s/ '\([^`']*\)'$/ ‘\1’/g s/^'\([^`']*\)' /‘\1’ /g s/“â€/""/g cryptmount-5.2/po/en@quot.header0000644000175000017500000000226311216245452013735 00000000000000# All this catalog "translates" are quotation characters. # The msgids must be ASCII and therefore cannot contain real quotation # characters, only substitutes like grave accent (0x60), apostrophe (0x27) # and double quote (0x22). These substitutes look strange; see # http://www.cl.cam.ac.uk/~mgk25/ucs/quotes.html # # This catalog translates grave accent (0x60) and apostrophe (0x27) to # left single quotation mark (U+2018) and right single quotation mark (U+2019). # It also translates pairs of apostrophe (0x27) to # left single quotation mark (U+2018) and right single quotation mark (U+2019) # and pairs of quotation mark (0x22) to # left double quotation mark (U+201C) and right double quotation mark (U+201D). # # When output to an UTF-8 terminal, the quotation characters appear perfectly. # When output to an ISO-8859-1 terminal, the single quotation marks are # transliterated to apostrophes (by iconv in glibc 2.2 or newer) or to # grave/acute accent (by libiconv), and the double quotation marks are # transliterated to 0x22. # When output to an ASCII terminal, the single quotation marks are # transliterated to apostrophes, and the double quotation marks are # transliterated to 0x22. # cryptmount-5.2/po/Rules-quot0000644000175000017500000000337611216245452013161 00000000000000# Special Makefile rules for English message catalogs with quotation marks. DISTFILES.common.extra1 = quot.sed boldquot.sed en@quot.header en@boldquot.header insert-header.sin Rules-quot .SUFFIXES: .insert-header .po-update-en en@quot.po-create: $(MAKE) en@quot.po-update en@boldquot.po-create: $(MAKE) en@boldquot.po-update en@quot.po-update: en@quot.po-update-en en@boldquot.po-update: en@boldquot.po-update-en .insert-header.po-update-en: @lang=`echo $@ | sed -e 's/\.po-update-en$$//'`; \ if test "$(PACKAGE)" = "gettext"; then PATH=`pwd`/../src:$$PATH; GETTEXTLIBDIR=`cd $(top_srcdir)/src && pwd`; export GETTEXTLIBDIR; fi; \ tmpdir=`pwd`; \ echo "$$lang:"; \ ll=`echo $$lang | sed -e 's/@.*//'`; \ LC_ALL=C; export LC_ALL; \ cd $(srcdir); \ if $(MSGINIT) -i $(DOMAIN).pot --no-translator -l $$ll -o - 2>/dev/null | sed -f $$tmpdir/$$lang.insert-header | $(MSGCONV) -t UTF-8 | $(MSGFILTER) sed -f `echo $$lang | sed -e 's/.*@//'`.sed 2>/dev/null > $$tmpdir/$$lang.new.po; then \ if cmp $$lang.po $$tmpdir/$$lang.new.po >/dev/null 2>&1; then \ rm -f $$tmpdir/$$lang.new.po; \ else \ if mv -f $$tmpdir/$$lang.new.po $$lang.po; then \ :; \ else \ echo "creation of $$lang.po failed: cannot move $$tmpdir/$$lang.new.po to $$lang.po" 1>&2; \ exit 1; \ fi; \ fi; \ else \ echo "creation of $$lang.po failed!" 1>&2; \ rm -f $$tmpdir/$$lang.new.po; \ fi en@quot.insert-header: insert-header.sin sed -e '/^#/d' -e 's/HEADER/en@quot.header/g' $(srcdir)/insert-header.sin > en@quot.insert-header en@boldquot.insert-header: insert-header.sin sed -e '/^#/d' -e 's/HEADER/en@boldquot.header/g' $(srcdir)/insert-header.sin > en@boldquot.insert-header mostlyclean: mostlyclean-quot mostlyclean-quot: rm -f *.insert-header cryptmount-5.2/po/stamp-po0000644000175000017500000000001212613124602012614 00000000000000timestamp cryptmount-5.2/po/boldquot.sed0000644000175000017500000000033111216245452013470 00000000000000s/"\([^"]*\)"/“\1â€/g s/`\([^`']*\)'/‘\1’/g s/ '\([^`']*\)' / ‘\1’ /g s/ '\([^`']*\)'$/ ‘\1’/g s/^'\([^`']*\)' /‘\1’ /g s/“â€/""/g s/“/“/g s/â€/â€/g s/‘/‘/g s/’/’/g cryptmount-5.2/po/remove-potcdate.sin0000644000175000017500000000066011216245452014760 00000000000000# Sed script that remove the POT-Creation-Date line in the header entry # from a POT file. # # The distinction between the first and the following occurrences of the # pattern is achieved by looking at the hold space. /^"POT-Creation-Date: .*"$/{ x # Test if the hold space is empty. s/P/P/ ta # Yes it was empty. First occurrence. Remove the line. g d bb :a # The hold space was nonempty. Following occurrences. Do nothing. x :b } cryptmount-5.2/po/insert-header.sin0000644000175000017500000000124011216245452014407 00000000000000# Sed script that inserts the file called HEADER before the header entry. # # At each occurrence of a line starting with "msgid ", we execute the following # commands. At the first occurrence, insert the file. At the following # occurrences, do nothing. The distinction between the first and the following # occurrences is achieved by looking at the hold space. /^msgid /{ x # Test if the hold space is empty. s/m/m/ ta # Yes it was empty. First occurrence. Read the file. r HEADER # Output the file's contents by reading the next line. But don't lose the # current line while doing this. g N bb :a # The hold space was nonempty. Following occurrences. Do nothing. x :b } cryptmount-5.2/po/de.gmo0000644000175000017500000003727612613124602012253 00000000000000Þ•t¼\Ð @Ñ 0 &C 3j (ž <Ç  *% "P s ·Œ 2D &w "ž 0Á ò  + D $d -‰ · (Õ þ #.5=d¢Â$Õ$ú0@PU‘.çÇ-Þ $- R!s&•#¼à/ÿ/Mlˆ,¤+Ñ0ý8."g1Š,¼Féa0’'©%Ñ÷-+Eq$޳ Í'î5Kg…¤Ä&×Hþ.G6v#­Ñ$ã=AF-ˆ*¶á#!%²Gú2ˆs»5/ˆeîfÿ:f¡-¼%ê#=4@rD³-ø&D>.ƒ²·ºÁ‚ÅUH!Nž!0í!:"0Y"LŠ"&×"4þ"03#d#y#C$:Ô$@%>P%'%"·%$Ú%,ÿ%1,&E^&)¤&3Î&)'*,'(W'L€'\Í' *(K(.b(+‘(3½(Hñ(l:);§)ýã)Gá*A)+=k+7©+9á+<,@X,3™,BÍ,--'>--f-+”-AÀ-6.>9.Nx..Ç.Bö.69/Zp/tË/@0:Y0;”02Ð0?1:C13~1,²1-ß1( 2/62%f2Œ2#¤2$È2+í2<3"V3>y3d¸394AW49™4Ó44æ4D5X`5,¹54æ5%6%A6$g6ãŒ6¬p708’N85á8¤9U¼9–;]©;$<1,<-^<+Œ<K¸<N=qS=1Å=÷=K><a>ž>§>¬>»>;s jRA(n?N [q-p:T2) ,1S>7oDmd@tfY*J 3=cOUiFHeKQI]!_/8&^#46C+V'L0E 5aP\$WG.9<"lkZXrBgMbh`% - Adding an extra entry ("${TargetName}") in ${CM_CFGDIR}/cmtab - Creating a ${fs_size}MB file, "${crypto_dev}" - Creating a key-file ("${key_file}") - Creating an ext3 filingsystem on "${crypto_dev}" - Creating the directory "${mount_dir}" - Overwriting the backup configuration-file "${bckp_cmtab}"${fs_size} is not a valid number${mount_dir} is not a valid directory name%-16s [to mount on "%s" as "%s"] Abandoning $ProgName ...Access to your encrypted filesystem is protected by a key that is kept in a separate small file. The key is locked by a password that you must enter whenever you mount the filesystem.After you have finished using the filesystem, try:Are you sure? (Type "%s" to proceed): Backup of previous key is in "%s" Bad device type (%x) for "%s" (need block/file) Bad device-mapper start/lengthBad file-descriptor (%d) Bad key-length parameterBad keyfile format (libgcrypt) Bad keyfile format (openssl-compat) Cannot find key-manager to match target "%s" Cannot open "%s" for writing Cannot open device "%s" for target "%s" Cannot read stdinCannot read stdin Cannot stat "%s" Checksum mismatch in keyfile (gcry, %x != %x) Checksum mismatch in keyfile (openssl-compat, ofs=%u,idx=%u) Configuration error near %s:%d Confirm password: Couldn't find libgcrypt cipher "%s" Couldn't find libgcrypt digest "%s" Creating filesystem container (${crypto_dev})...Crypto-swap is not supported by this installation of cryptmount Device "%s" appears to contain data (entropy=%.3g,%.3g) - please run mkswap manually Device-mapper target-creation failed for "%s" Each cryptmount filesystem is identifed by a short name which is used when mounting or configuring that filesystem. This name should be a single word (without spaces), such as "${DefaultTargetName}".Enter a filename for your encrypted containerEnter a location for the keyfileEnter new password for target "%s": Enter password for target "%s": Enter the filesystem size (in MB)Failed to create LUKS header for "%s" Failed to create LUKS key for "%s" Failed to create new key file Failed to extract LUKS key for "%s" (errno=%d) Failed to extract cipher key Failed to free device (%d,%d) Failed to generate new key Failed to get size of "%s" Failed to open keyfile "%s" for target "%s" Failed to remove device-mapper target "%s" Failed to turn off keyboard echoing on terminal Formatting "%s", will probably destroy all existing dataFormatting encrypted filesystem...Generating filesystem access key (${key_file})...Generating random key; please be patient... If you do not wish to proceed, no changes will be made to your system.In order to access the ${TargetName} filesystem, it must be mounted on top of an empty directory.Installation abandonedInstallation of new keyfile "%s" failedInstalling new key (%s -> %s) failed Key-extraction failed for "%s" Key-file "%s" already exists for target "%s" Key-file for "%s" isn't password-protected Key-writing failed for "%s" Making mount-point (${mount_dir})...Memory-locking failed... Missing keyfile for target "%s" Missing output keyfile for target "%s" No available loopback devices No targets specified Only "%s" can unmount "%s" Only root can configure "%s" Only root can use option "%s" Only user-%lu can unmount "%s" Password mismatch Password mismatch when extracting key Please confirm that you want to proceed (enter "${AffirmativeResponse}")Please enter a target name for your filesystemPlease specify where "${TargetName}" should be mountedRetiring old key (%s -> %s) failed Security failure Setting password on LUKS keyslot-%u Specification for target "%s" contains non-absolute pathname Taking backup of cryptmount master config-file (${bckp_cmtab})...Target "%s" does not appear to be configured Target "%s" does not appear to be mounted Target "%s" is already mounted Target name "%s" is not recognized Target security failure for "%s" The ${TargetName} filesystem can be configured to be owned by a nominated user, who will be able to create top-level files & directories without needing to involve the superuser.The actual encrypted filesystem will be stored in a special file, which needs to be large enough to contain your entire encrypted filesystem.The following target names have already been used:The maximum available size of your filesystem needs to be chosen so that enough space can be reserved on your disk.The target-name "${TargetName}" has already been usedThis is free software, and you are welcome to redistribute it under certain conditions - see the file 'COPYING' in the source directory.This program will allow you to setup a secure filing-system that will be managed by "cryptmount". You will be able to select basic features such as the location and size of the filesystem - if you want more advanced features, you should consult the cryptmount manual page.This script must be run with superuser privileges - please try again, e.g. using one of the following:Trailing command-line arguments given with '--all' option Unable to allocate memory Unsuitable filesystem type "%s" for swapping WARNING: ${crypto_dev} already existsWARNING: ${key_file} already existsWhich user should own the filesystem (leave blank for "root")Your filing system is now ready to be built - this will involve:Your new encrypted filesystem is now ready for use - to access, try:cryptmount comes with ABSOLUTELY NO WARRANTY.cryptmount setup scriptcryptmount: please replace "fsoptions" with "mountoptions" in cmtab cryptmount: unrecognized option "%s" in cmtab donenoopaqueyesProject-Id-Version: cryptmount 4.2-1 Report-Msgid-Bugs-To: rwpenney@users.sourceforge.net POT-Creation-Date: 2015-10-25 05:25+0000 PO-Revision-Date: 2011-06-12 12:07+0200 Last-Translator: Kai Wasserbäch Language-Team: German Language: de MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Hinzufügen eines zusätzlichen Eintrags (»${TargetName}«) in ${CM_CFGDIR}/cmtab - Erstellen einer ${fs_size} MB großen Datei mit dem Namen »${crypto_dev}« - Erstellen der Schlüsseldatei »${key_file}« - Erstellen eines ext3-Dateisystems auf »${crypto_dev}« - Erstellen des Verzeichnisses »${mount_dir}« - Überschreiben der Sicherheitskopie der Konfigurationsdatei ${bckp_cmtab}»${fs_size}« ist keine gültige Zahl»${mount_dir}« ist kein gültiger Verzeichnisname.%-16s [um »%3$s« unter »%2$s« einzuhängen] Beende $ProgName ...Der Zugriff auf Ihr verschlüsseltes Dateisystem wird durch einen Schlüssel geschützt, der in einer kleinen, separaten Datei gespeichert wird. Der Schlüssel wird durch ein Passwort gesichert, welches Sie jedes Mal eingeben müssen, wenn Sie das Dateisystem einhängen wollen.Nach der Benutzung des Dateisystems, geben Sie bitte Folgendes ein:Sind Sie sicher? (Geben Sie »%s« ein, um fortzufahren): Eine Sicherheitskopie des vorherigen Schlüssels ist in »%s«. Falscher Gerätetyp (%x) für »%s« (Block/Datei benötigt). Falsche(r) device-mapper-Beginn/Länge.Fehlerhafter Dateideskriptor (%d) Falscher Schlüssellängen-ParameterFalsches Schlüsseldateiformat (libgcrypt). Falsches Schlüsseldateiformat (openssl-compat). Kann keinen für das Ziel »%s« passenden Schlüsselmanager finden. Kann »%s« nicht zum Schreiben öffnen. Kann Gerät »%s« für Ziel »%s« nicht öffnen. Kann nicht von der Standardeingabe lesen.Kann nicht von der Standardeingabe lesen. Kann Status für »%s« nicht abfragen. Nicht übereinstimmende Prüfsumme in der Schlüsseldatei (gcry, %x != %x). Nicht übereinstimmende Prüfsumme in der Schlüsseldatei (openssl-compat, ofs=%u, idx=%u). Konfigurationsfehler nahe %s:%d Passwort bestätigen: Konnte libgcrypt-Chiffre »%s« nicht finden. Konnte libgcrypt-Hash »%s« nicht finden. Erstelle Dateisystemcontainer »${crypto_dev}« ...Crypto-swap wird von dieser cryptmount-Installation nicht unterstützt. Das Gerät »%s« scheint Daten zu enthalten (Entropie=%.3g,%.3g) – bitte führen Sie mkswap manuell aus. Erstellen des device-mapper-Ziels für »%s« schlug fehl. Jedes cryptmount-Dateisystem wird durch einen Kurznamen identifiziert, der verwandt wird, wenn das Dateisystem eingehängt oder konfiguriert wird. Dieser Name sollte ein einzelnes Wort (ohne Leerzeichen) wie beispielsweise »${DefaultTargetName}« sein.Bitte geben Sie einen Dateinamen für den verschlüsselten Container anBitte geben Sie einen Speicherplatz für die Schlüsseldatei ein.Bitte geben Sie ein neues Passwort für das Ziel »%s« ein: Bitte geben Sie das Passwort für das Ziel »%s« ein: Bitte geben Sie die Größe des Dateisystems ein (in MB).Erstellen eines neuen LUKS-Headers für »%s« schlug fehl. Erstellen eines neuen LUKS-Schlüssels für »%s« schlug fehl. Erstellen einer neuen Schlüsseldatei schlug fehl. Auslesen des LUKS-Schlüssels für »%s« schlug fehl (errno=%d). Auslesen des Chiffreschlüssels schlug fehl. Konnte Gerät (%d,%d) nicht freigeben. Generieren des neuen Schlüssels schlug fehl Konnte Größe von »%s« nicht ermitteln. Öffnen der Schlüsseldatei »%s« für Ziel »%s« schlug fehl. Entfernen des device-mapper-Ziels »%s« schlug fehl. Konnte die Wiedergabe der Tastatureingabe nicht deaktivieren. Formatiere »%s«, dies wird wahrscheinlich alle bestehenden Daten zerstören.Formatiere das verschlüsselte Dateisystem ...Erstelle Zugriffsschlüssel (${key_file}) für das Dateisystem ...Erstelle zufälligen Schlüssel; bitte warten Sie ... Falls Sie nicht fortfahren möchten, werden keine Änderungen an Ihrem System vorgenommen.Um auf das Dateisystem »${TargetName}« zugreifen zu können, muss es in ein leeres Verzeichnis eingehängt werden.Installation abgebrochenInstallation der neuen Schlüsseldatei »%s« schlug fehl.Installation des neuen Schlüssels (%s -> %s) schlug fehl. Auslesen des Schlüssels für »%s« schlug fehl. Schlüsseldatei »%s« existiert für das Ziel »%s« bereits. Schlüsseldatei für »%s« ist nicht passwortgeschützt. Schreiben des Schlüssels für »%s« schlug fehl. Erstelle Einhängepunkt »${mount_dir}« ...Sperren des Arbeitsspeichers schlug fehl ... Schlüsseldatei für Ziel »%s« fehlt. Schlüsselausgabedatei für Ziel »%s« fehlt. Keine verfügbaren Loopback-Geräte. Keine Ziele angegeben. Nur »%s« kann »%s« aushängen. Nur root kann »%s« konfigurieren. Nur root kann die Option »%s« verwenden. Nur der Benutzer mit der ID »%lu« kann »%s« aushängen. Passworte stimmen nicht überein. Fehlerhaftes Passwort während des Auslesens des Schlüssels. Bitte bestätigen Sie, dass Sie fortfahren möchten (geben Sie bitte »${AffirmativeResponse}« ein)Bitte geben Sie einen Zielnamen für Ihr Dateisystem ein.Bitte geben Sie an, wo »${TargetName}« eingehängt werden soll.Ausmustern des alten Schlüssels (%s -> %s) schlug fehl. Sicherheitsfehler Setze Passwort für den LUKS-Schlüsselplatz »%u« Die Zielangabe für »%s« enthält eine nicht-absolute Pfadangabe. Erstelle Sicherheitskopie der Haupt-Cryptmount-Konfigurationsdatei »${bckp_cmtab}« ...Ziel »%s« scheint unkonfiguriert zu sein. Ziel »%s« scheint noch nicht eingehängt zu sein. Ziel »%s« ist bereits eingehängt. Zielname »%s« wurde nicht erkannt. Sicherheitsfehler für Ziel »%s«. Das Dateisystem mit dem Namen »${TargetName}« kann so konfiguriert werden, dass es einem bestimmten Benutzer gehört, der dann ohne den Superuser im Wurzelverzeichnis des Dateisystems Dateien und Verzeichnisse erstellen kann.Das eigentliche verschlüsselte Dateisystem wird in einer speziellen Datei abgelegt, die groß genug sein muss, um Ihr komplettes verschlüsseltes Dateisystem zu enthalten.Die folgenden Zielnamen werden bereits verwandt:Die maximal verfügbare Größe des Dateisystems muss angegeben werden, damit auf der Festplatte ausreichend Speicherplatz reserviert werden kann.Der Zielname »${TargetName}« wird bereits verwandt.Dies ist freie Software und Sie dürfen sie unter bestimmten Bedingungen weiterverbreiten - die Details finden Sie in der Datei »COPYING« im Quellcodeverzeichnis.Dieses Programm erlaubt es Ihnen, ein verschlüsseltes Dateisystem zu erstellen, welches von »cryptmount« verwaltet wird. Sie können grundlegende Eigenschaften wie Speicherort und Größe des Dateisystems einstellen. Wollen Sie weitere fortgeschrittenere Eigenschaften beeinflussen, sollten Sie die Handbuchseite von »cryptmount« lesen.Dieses Skript muss mit den Rechten von root (superuser) ausgeführt werden - bitte versuchen Sie es z.B. mit einem der folgenden Benutzernamen erneut:Abschließende Kommandozeilen-Argumente; wurden zusammen mit der Option »--all« angegeben. Konnte keinen Speicher reservieren. Unpassender Dateisystemtyp »%s« zum Auslagern. WARNUNG: »${crypto_dev}« existiert bereits.WARNUNG: »${key_file}« existiert bereits.Welchem Benutzer soll das Dateisystem gehören (leer lassen für »root«)?Ihr Dateisystem kann nun erstellt werden, dies umfasst die folgenden Schritte:Ihr neues, verschlüsseltes Dateisystem kann nun verwandt werden. Um darauf zuzugreifen, versuchen Sie Folgendes:cryptmount wird OHNE JEDWEDE GARANTIEN angeboten.cryptmount-Einrichtungsskriptcryptmount: Bitte ersetzen »fsoptions« mit »mountoptions« in der cmtab cryptmount: Nicht unterstützte Option »%s« in der cmtab. erledigtneinundurchlässigjacryptmount-5.2/po/cryptmount.pot0000644000175000017500000003425612613124531014123 00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR RW Penney # This file is distributed under the same license as the PACKAGE package. # FIRST AUTHOR , YEAR. # #, fuzzy msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: rwpenney@users.sourceforge.net\n" "POT-Creation-Date: 2015-10-25 05:25+0000\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" "Language: \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=CHARSET\n" "Content-Transfer-Encoding: 8bit\n" #: armour.c:154 armour-builtin.c:300 armour-gcry.c:546 armour-gcry.c:702 #, c-format msgid "Key-extraction failed for \"%s\"\n" msgstr "" #: armour.c:176 #, c-format msgid "Key-writing failed for \"%s\"\n" msgstr "" #: armour.c:361 #, c-format msgid "Failed to open keyfile \"%s\" for target \"%s\"\n" msgstr "" #: armour.c:369 #, c-format msgid "Missing keyfile for target \"%s\"\n" msgstr "" #: armour.c:396 #, c-format msgid "Missing output keyfile for target \"%s\"\n" msgstr "" #: armour.c:778 #, c-format msgid "Specification for target \"%s\" contains non-absolute pathname\n" msgstr "" #: armour-builtin.c:282 armour-gcry.c:528 armour-gcry.c:683 #, c-format msgid "Password mismatch when extracting key\n" msgstr "" #: armour-builtin.c:398 armour-gcry.c:607 armour-gcry.c:761 #, c-format msgid "Failed to create new key file\n" msgstr "" #: armour-gcry.c:166 #, c-format msgid "Couldn't find libgcrypt cipher \"%s\"\n" msgstr "" #: armour-gcry.c:178 #, c-format msgid "Couldn't find libgcrypt digest \"%s\"\n" msgstr "" #: armour-gcry.c:489 #, c-format msgid "Bad keyfile format (libgcrypt)\n" msgstr "" #: armour-gcry.c:532 #, c-format msgid "Checksum mismatch in keyfile (gcry, %x != %x)\n" msgstr "" #: armour-gcry.c:648 #, c-format msgid "Bad keyfile format (openssl-compat)\n" msgstr "" #: armour-gcry.c:687 #, c-format msgid "Checksum mismatch in keyfile (openssl-compat, ofs=%u,idx=%u)\n" msgstr "" #: armour-luks.c:278 armour-luks.c:362 #, c-format msgid "Failed to initialize device for LUKS keyfile\n" msgstr "" #: armour-luks.c:288 #, c-format msgid "Failed to extract LUKS key for \"%s\" (errno=%d)\n" msgstr "" #: armour-luks.c:349 #, c-format msgid "Formatting \"%s\", will probably destroy all existing data" msgstr "" #: armour-luks.c:378 #, c-format msgid "Failed to create LUKS header for \"%s\"\n" msgstr "" #: armour-luks.c:388 #, c-format msgid "Failed to create LUKS key for \"%s\"\n" msgstr "" #: armour-luks.c:399 #, c-format msgid "Setting password on LUKS keyslot-%u\n" msgstr "" #: cryptmount.c:120 msgid "" "usage: cryptmount [OPTION [target ...]]\n" "\n" " available options are as follows:\n" "\n" " -h | --help\n" " -a | --all\n" " -c | --change-password \n" " -k | --key-managers\n" " -l | --list\n" " -S | --status\n" " -m | --mount \n" " -u | --unmount \n" " --generate-key \n" " --reuse-key \n" " --prepare \n" " --release \n" " --config-fd \n" " --passwd-fd \n" " --swapon \n" " --swapoff \n" " --version\n" "\n" " please report bugs to \n" msgstr "" #. TRANSLATORS: this string is marked as 'no-c-format' because #. some localizations may require the mount-point and filesystem type #. to be printed in a different order, but the untranslated string needs #. to remain an ordinary string that can be printed without gettext. #: cryptmount.c:255 #, no-c-format msgid "%-16s [to mount on \"%s\" as \"%s\"]\n" msgstr "" #: cryptmount.c:387 #, c-format msgid "Failed to extract cipher key\n" msgstr "" #: cryptmount.c:396 #, c-format msgid "Cannot open device \"%s\" for target \"%s\"\n" msgstr "" #: cryptmount.c:404 #, c-format msgid "Failed to get size of \"%s\"\n" msgstr "" #: cryptmount.c:414 #, c-format msgid "Bad device-mapper start/length" msgstr "" #: cryptmount.c:441 #, c-format msgid "Device-mapper target-creation failed for \"%s\"\n" msgstr "" #: cryptmount.c:480 cryptmount.c:706 #, c-format msgid "Target \"%s\" does not appear to be configured\n" msgstr "" #: cryptmount.c:495 #, c-format msgid "Cannot stat \"%s\"\n" msgstr "" #: cryptmount.c:503 #, c-format msgid "Failed to remove device-mapper target \"%s\"\n" msgstr "" #: cryptmount.c:536 #, c-format msgid "Target \"%s\" is already mounted\n" msgstr "" #: cryptmount.c:594 #, c-format msgid "Target \"%s\" does not appear to be mounted\n" msgstr "" #: cryptmount.c:604 #, c-format msgid "Only \"%s\" can unmount \"%s\"\n" msgstr "" #. TRANSLATORS: the following expands to include #. the *numerical* user-identity in place of '%lu', #. e.g. giving 'only user-16 can unmount "target"': #: cryptmount.c:610 #, c-format msgid "Only user-%lu can unmount \"%s\"\n" msgstr "" #: cryptmount.c:670 cryptmount.c:726 #, c-format msgid "Crypto-swap is not supported by this installation of cryptmount\n" msgstr "" #: cryptmount.c:758 #, c-format msgid "Key-file for \"%s\" isn't password-protected\n" msgstr "" #: cryptmount.c:784 cryptmount.c:905 #, c-format msgid "Cannot open \"%s\" for writing\n" msgstr "" #: cryptmount.c:799 #, c-format msgid "Retiring old key (%s -> %s) failed\n" msgstr "" #: cryptmount.c:807 #, c-format msgid "Installing new key (%s -> %s) failed\n" msgstr "" #: cryptmount.c:814 #, c-format msgid "Backup of previous key is in \"%s\"\n" msgstr "" #: cryptmount.c:854 cryptmount.c:1521 #, c-format msgid "Target name \"%s\" is not recognized\n" msgstr "" #: cryptmount.c:860 #, c-format msgid "Bad key-length parameter" msgstr "" #: cryptmount.c:872 #, c-format msgid "Key-file \"%s\" already exists for target \"%s\"\n" msgstr "" #: cryptmount.c:882 #, c-format msgid "Generating random key; please be patient...\n" msgstr "" #: cryptmount.c:886 #, c-format msgid "Failed to generate new key\n" msgstr "" #: cryptmount.c:919 #, c-format msgid "Installation of new keyfile \"%s\" failed" msgstr "" #: cryptmount.c:1055 #, c-format msgid "Only root can use option \"%s\"\n" msgstr "" #: cryptmount.c:1068 #, c-format msgid "Only root can configure \"%s\"\n" msgstr "" #: cryptmount.c:1132 #, c-format msgid "Cannot find key-manager to match target \"%s\"\n" msgstr "" #: cryptmount.c:1390 #, c-format msgid "Multiple operating modes not supported\n" msgstr "" #: cryptmount.c:1445 #, c-format msgid "Memory-locking failed...\n" msgstr "" #: cryptmount.c:1473 #, c-format msgid "Bad file-descriptor (%d)\n" msgstr "" #: cryptmount.c:1483 #, c-format msgid "Security failure\n" msgstr "" #: cryptmount.c:1501 #, c-format msgid "Trailing command-line arguments given with '--all' option\n" msgstr "" #: cryptmount.c:1533 #, c-format msgid "Target security failure for \"%s\"\n" msgstr "" #: cryptmount.c:1542 #, c-format msgid "No targets specified\n" msgstr "" #: fsutils.c:264 #, c-format msgid "Unsuitable filesystem type \"%s\" for swapping\n" msgstr "" #: fsutils.c:294 #, c-format msgid "" "Device \"%s\" appears to contain data (entropy=%.3g,%.3g) - please run " "mkswap manually\n" msgstr "" #: looputils.c:222 #, c-format msgid "Failed to free device (%d,%d)\n" msgstr "" #: looputils.c:258 #, c-format msgid "No available loopback devices\n" msgstr "" #: looputils.c:272 #, c-format msgid "Bad device type (%x) for \"%s\" (need block/file)\n" msgstr "" #: tables.c:549 #, c-format msgid "" "cryptmount: please replace \"fsoptions\" with \"mountoptions\" in cmtab\n" msgstr "" #: tables.c:554 #, c-format msgid "cryptmount: unrecognized option \"%s\" in cmtab\n" msgstr "" #: tables.c:637 #, c-format msgid "Configuration error near %s:%d\n" msgstr "" #: utils.c:312 #, c-format msgid "Unable to allocate memory\n" msgstr "" #: utils.c:422 #, c-format msgid "Too few random-number sources found\n" msgstr "" #: utils.c:481 #, c-format msgid "Cannot read stdin" msgstr "" #: utils.c:493 #, c-format msgid "Failed to turn off keyboard echoing on terminal\n" msgstr "" #: utils.c:523 #, c-format msgid "Enter new password for target \"%s\": " msgstr "" #: utils.c:524 #, c-format msgid "Enter password for target \"%s\": " msgstr "" #: utils.c:533 #, c-format msgid "Confirm password: " msgstr "" #: utils.c:536 #, c-format msgid "Password mismatch\n" msgstr "" #: utils.c:575 sysinit/setupscript.sh.in:218 #, sh-format msgid "yes" msgstr "" #: utils.c:582 #, c-format msgid "Are you sure? (Type \"%s\" to proceed): " msgstr "" #: utils.c:585 #, c-format msgid "Cannot read stdin\n" msgstr "" #: sysinit/setupscript.sh.in:41 #, sh-format msgid "Abandoning $ProgName ..." msgstr "" #: sysinit/setupscript.sh.in:49 #, sh-format msgid "" "This script must be run with superuser privileges - please try again, e.g. " "using one of the following:" msgstr "" #: sysinit/setupscript.sh.in:112 #, sh-format msgid "opaque" msgstr "" #: sysinit/setupscript.sh.in:113 #, sh-format msgid "" "Each cryptmount filesystem is identifed by a short name which is used when " "mounting or configuring that filesystem. This name should be a single word " "(without spaces), such as \"${DefaultTargetName}\"." msgstr "" #: sysinit/setupscript.sh.in:114 #, sh-format msgid "The following target names have already been used:" msgstr "" #: sysinit/setupscript.sh.in:121 #, sh-format msgid "Please enter a target name for your filesystem" msgstr "" #: sysinit/setupscript.sh.in:125 #, sh-format msgid "The target-name \"${TargetName}\" has already been used" msgstr "" #: sysinit/setupscript.sh.in:133 #, sh-format msgid "" "The ${TargetName} filesystem can be configured to be owned by a nominated " "user, who will be able to create top-level files & directories without " "needing to involve the superuser." msgstr "" #: sysinit/setupscript.sh.in:135 #, sh-format msgid "Which user should own the filesystem (leave blank for \"root\")" msgstr "" #: sysinit/setupscript.sh.in:141 #, sh-format msgid "" "In order to access the ${TargetName} filesystem, it must be mounted on top " "of an empty directory." msgstr "" #: sysinit/setupscript.sh.in:145 #, sh-format msgid "Please specify where \"${TargetName}\" should be mounted" msgstr "" #: sysinit/setupscript.sh.in:149 #, sh-format msgid "${mount_dir} is not a valid directory name" msgstr "" #: sysinit/setupscript.sh.in:157 #, sh-format msgid "" "The maximum available size of your filesystem needs to be chosen so that " "enough space can be reserved on your disk." msgstr "" #: sysinit/setupscript.sh.in:161 #, sh-format msgid "Enter the filesystem size (in MB)" msgstr "" #: sysinit/setupscript.sh.in:166 #, sh-format msgid "${fs_size} is not a valid number" msgstr "" #: sysinit/setupscript.sh.in:172 #, sh-format msgid "" "The actual encrypted filesystem will be stored in a special file, which " "needs to be large enough to contain your entire encrypted filesystem." msgstr "" #: sysinit/setupscript.sh.in:176 #, sh-format msgid "Enter a filename for your encrypted container" msgstr "" #: sysinit/setupscript.sh.in:180 #, sh-format msgid "WARNING: ${crypto_dev} already exists" msgstr "" #: sysinit/setupscript.sh.in:188 #, sh-format msgid "" "Access to your encrypted filesystem is protected by a key that is kept in a " "separate small file. The key is locked by a password that you must enter " "whenever you mount the filesystem." msgstr "" #: sysinit/setupscript.sh.in:192 #, sh-format msgid "Enter a location for the keyfile" msgstr "" #: sysinit/setupscript.sh.in:196 #, sh-format msgid "WARNING: ${key_file} already exists" msgstr "" #: sysinit/setupscript.sh.in:207 #, sh-format msgid "Your filing system is now ready to be built - this will involve:" msgstr "" #: sysinit/setupscript.sh.in:208 #, sh-format msgid " - Creating the directory \"${mount_dir}\"" msgstr "" #: sysinit/setupscript.sh.in:209 #, sh-format msgid " - Creating a ${fs_size}MB file, \"${crypto_dev}\"" msgstr "" #: sysinit/setupscript.sh.in:210 #, sh-format msgid " - Adding an extra entry (\"${TargetName}\") in ${CM_CFGDIR}/cmtab" msgstr "" #: sysinit/setupscript.sh.in:211 #, sh-format msgid " - Creating a key-file (\"${key_file}\")" msgstr "" #: sysinit/setupscript.sh.in:212 #, sh-format msgid " - Creating an ext3 filingsystem on \"${crypto_dev}\"" msgstr "" #: sysinit/setupscript.sh.in:215 #, sh-format msgid " - Overwriting the backup configuration-file \"${bckp_cmtab}\"" msgstr "" #: sysinit/setupscript.sh.in:217 #, sh-format msgid "If you do not wish to proceed, no changes will be made to your system." msgstr "" #: sysinit/setupscript.sh.in:219 #, sh-format msgid "no" msgstr "" #: sysinit/setupscript.sh.in:220 #, sh-format msgid "" "Please confirm that you want to proceed (enter \"${AffirmativeResponse}\")" msgstr "" #: sysinit/setupscript.sh.in:223 #, sh-format msgid "Installation abandoned" msgstr "" #: sysinit/setupscript.sh.in:227 #, sh-format msgid "done" msgstr "" #: sysinit/setupscript.sh.in:229 #, sh-format msgid "Making mount-point (${mount_dir})..." msgstr "" #: sysinit/setupscript.sh.in:232 #, sh-format msgid "Creating filesystem container (${crypto_dev})..." msgstr "" #: sysinit/setupscript.sh.in:237 #, sh-format msgid "Taking backup of cryptmount master config-file (${bckp_cmtab})..." msgstr "" #: sysinit/setupscript.sh.in:254 #, sh-format msgid "Generating filesystem access key (${key_file})..." msgstr "" #: sysinit/setupscript.sh.in:262 #, sh-format msgid "Formatting encrypted filesystem..." msgstr "" #: sysinit/setupscript.sh.in:291 #, sh-format msgid "cryptmount setup script" msgstr "" #: sysinit/setupscript.sh.in:293 #, sh-format msgid "" "This program will allow you to setup a secure filing-system that will be " "managed by \"cryptmount\". You will be able to select basic features such as " "the location and size of the filesystem - if you want more advanced " "features, you should consult the cryptmount manual page." msgstr "" #: sysinit/setupscript.sh.in:296 #, sh-format msgid "cryptmount comes with ABSOLUTELY NO WARRANTY." msgstr "" #: sysinit/setupscript.sh.in:297 #, sh-format msgid "" "This is free software, and you are welcome to redistribute it under certain " "conditions - see the file 'COPYING' in the source directory." msgstr "" #: sysinit/setupscript.sh.in:323 #, sh-format msgid "Your new encrypted filesystem is now ready for use - to access, try:" msgstr "" #: sysinit/setupscript.sh.in:326 #, sh-format msgid "After you have finished using the filesystem, try:" msgstr "" cryptmount-5.2/po/POTFILES.in0000644000175000017500000000042712612754537012737 00000000000000# List of cryptmount source files containing translatable strings. # RW Penney, April 2006 # main sources: armour.c armour-builtin.c armour-gcry.c armour-luks.c blowfish.c cryptmount.c dmutils.c fsutils.c looputils.c tables.c utils.c # shell-scripts: sysinit/setupscript.sh.in cryptmount-5.2/po/LINGUAS0000644000175000017500000000006711231412134012163 00000000000000# languages available for cryptmount text output de fr cryptmount-5.2/po/fr.po0000644000175000017500000005506512613124531012123 00000000000000# French translations for cryptmount package. # Copyright (C) 2006-2014 RW Penney # This file is distributed under the same license as the cryptmount package. # msgid "" msgstr "" "Project-Id-Version: cryptmount 4.0-1\n" "Report-Msgid-Bugs-To: rwpenney@users.sourceforge.net\n" "POT-Creation-Date: 2015-10-25 05:25+0000\n" "PO-Revision-Date: 2006-04-21 07:51+0100\n" "Last-Translator: RW Penney \n" "Language-Team: French \n" "Language: fr\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=ISO-8859-1\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n > 1);\n" #: armour.c:154 armour-builtin.c:300 armour-gcry.c:546 armour-gcry.c:702 #, c-format msgid "Key-extraction failed for \"%s\"\n" msgstr "Extraction de la clef pour \"%s\" a echouée\n" #: armour.c:176 #, c-format msgid "Key-writing failed for \"%s\"\n" msgstr "Ecriture de la clef pour \"%s\" a echouée\n" #: armour.c:361 #, c-format msgid "Failed to open keyfile \"%s\" for target \"%s\"\n" msgstr "Ouverture du fichier \"%s\" pour la cible \"%s\" a echouée\n" #: armour.c:369 #, c-format msgid "Missing keyfile for target \"%s\"\n" msgstr "Pas de fichier-clef pour la cible \"%s\"\n" #: armour.c:396 #, c-format msgid "Missing output keyfile for target \"%s\"\n" msgstr "Pas de fichier-clef pour la cible \"%s\"\n" #: armour.c:778 #, c-format msgid "Specification for target \"%s\" contains non-absolute pathname\n" msgstr "" #: armour-builtin.c:282 armour-gcry.c:528 armour-gcry.c:683 #, c-format msgid "Password mismatch when extracting key\n" msgstr "Mot de passe n'est pas verifié\n" #: armour-builtin.c:398 armour-gcry.c:607 armour-gcry.c:761 #, c-format msgid "Failed to create new key file\n" msgstr "Génération de nouvelle clef a echouée\n" #: armour-gcry.c:166 #, c-format msgid "Couldn't find libgcrypt cipher \"%s\"\n" msgstr "Chiffre \"%s\" n'est pas reconnu dans libgcrypt\n" #: armour-gcry.c:178 #, c-format msgid "Couldn't find libgcrypt digest \"%s\"\n" msgstr "Hash \"%s\" n'est pas reconnu dans libgcrypt\n" #: armour-gcry.c:489 #, c-format msgid "Bad keyfile format (libgcrypt)\n" msgstr "Mauvais fichier-clef (libcrypt)\n" #: armour-gcry.c:532 #, c-format msgid "Checksum mismatch in keyfile (gcry, %x != %x)\n" msgstr "Mauvais fichier-clef (gcry, %x != %x)\n" #: armour-gcry.c:648 #, c-format msgid "Bad keyfile format (openssl-compat)\n" msgstr "Mauvais fichier-clef (openssl-compat)\n" #: armour-gcry.c:687 #, c-format msgid "Checksum mismatch in keyfile (openssl-compat, ofs=%u,idx=%u)\n" msgstr "Mauvais fichier-clef (openssl-compat, ofs=%u,idx=%u)\n" #: armour-luks.c:278 armour-luks.c:362 #, fuzzy, c-format msgid "Failed to initialize device for LUKS keyfile\n" msgstr "Création du périphérique-loop pour le fichier-clef LUKS a echouée\n" #: armour-luks.c:288 #, c-format msgid "Failed to extract LUKS key for \"%s\" (errno=%d)\n" msgstr "Extraction de la clef LUKS a echouée pour la cible \"%s\" (errno=%d)\n" #: armour-luks.c:349 #, c-format msgid "Formatting \"%s\", will probably destroy all existing data" msgstr "Formatage de \"%s\" va detruire tous donnés sur ce conteneur" #: armour-luks.c:378 #, c-format msgid "Failed to create LUKS header for \"%s\"\n" msgstr "Génération d'en-tête LUKS pour \"%s\" a echouée\n" #: armour-luks.c:388 #, c-format msgid "Failed to create LUKS key for \"%s\"\n" msgstr "Génération de clef LUKS pour \"%s\" a echouée\n" #: armour-luks.c:399 #, c-format msgid "Setting password on LUKS keyslot-%u\n" msgstr "" #: cryptmount.c:120 #, fuzzy msgid "" "usage: cryptmount [OPTION [target ...]]\n" "\n" " available options are as follows:\n" "\n" " -h | --help\n" " -a | --all\n" " -c | --change-password \n" " -k | --key-managers\n" " -l | --list\n" " -S | --status\n" " -m | --mount \n" " -u | --unmount \n" " --generate-key \n" " --reuse-key \n" " --prepare \n" " --release \n" " --config-fd \n" " --passwd-fd \n" " --swapon \n" " --swapoff \n" " --version\n" "\n" " please report bugs to \n" msgstr "" "usage: cryptmount [OPTION [cible ...]]\n" "\n" " les options disponible sont les suivants:\n" "\n" " -a | --all\n" " -c | --change-password \n" " -k | --key-managers\n" " -l | --list\n" " -m | --mount \n" " -u | --unmount \n" " --generate-key \n" " --reuse-key \n" " --prepare \n" " --release \n" " --config-fd \n" " --passwd-fd \n" " --swapon \n" " --swapoff \n" " --version\n" "\n" " veuillez notifier les bogues à \n" #. TRANSLATORS: this string is marked as 'no-c-format' because #. some localizations may require the mount-point and filesystem type #. to be printed in a different order, but the untranslated string needs #. to remain an ordinary string that can be printed without gettext. #: cryptmount.c:255 #, no-c-format msgid "%-16s [to mount on \"%s\" as \"%s\"]\n" msgstr "%-16s [pour monter sur \"%s\" comme \"%s\"]\n" #: cryptmount.c:387 #, c-format msgid "Failed to extract cipher key\n" msgstr "Extraction de la clef de déchiffrage a echouée\n" #: cryptmount.c:396 #, c-format msgid "Cannot open device \"%s\" for target \"%s\"\n" msgstr "Ne peut pas ouvrir le périphérique \"%s\" pour la cible \"%s\"\n" #: cryptmount.c:404 #, c-format msgid "Failed to get size of \"%s\"\n" msgstr "Mesurage de la taille du \"%s\" a echoué\n" #: cryptmount.c:414 #, c-format msgid "Bad device-mapper start/length" msgstr "Mauvais debut/taille pour device-mapper" #: cryptmount.c:441 #, c-format msgid "Device-mapper target-creation failed for \"%s\"\n" msgstr "Création de la cible device-mapper pour \"%s\" a echouée\n" #: cryptmount.c:480 cryptmount.c:706 #, c-format msgid "Target \"%s\" does not appear to be configured\n" msgstr "La cible \"%s\" n'a pas été configurée\n" #: cryptmount.c:495 #, c-format msgid "Cannot stat \"%s\"\n" msgstr "Ne pas pouvoir stat \"%s\"\n" #: cryptmount.c:503 #, c-format msgid "Failed to remove device-mapper target \"%s\"\n" msgstr "Destruction de la cible device-mapper \"%s\" a echouée\n" #: cryptmount.c:536 #, c-format msgid "Target \"%s\" is already mounted\n" msgstr "La cible \"%s\" est déjà montée\n" #: cryptmount.c:594 #, c-format msgid "Target \"%s\" does not appear to be mounted\n" msgstr "La cible \"%s\" n'est pas montée\n" #: cryptmount.c:604 #, c-format msgid "Only \"%s\" can unmount \"%s\"\n" msgstr "Seulement utilisateur \"%s\" peut démonter \"%s\"\n" #. TRANSLATORS: the following expands to include #. the *numerical* user-identity in place of '%lu', #. e.g. giving 'only user-16 can unmount "target"': #: cryptmount.c:610 #, c-format msgid "Only user-%lu can unmount \"%s\"\n" msgstr "Seulement utilisateur-%lu peut démonter \"%s\"\n" #: cryptmount.c:670 cryptmount.c:726 #, c-format msgid "Crypto-swap is not supported by this installation of cryptmount\n" msgstr "" "Pagination chiffrée n'est pas possible avec cet installation de cryptmount\n" #: cryptmount.c:758 #, c-format msgid "Key-file for \"%s\" isn't password-protected\n" msgstr "Le fichier-clef pour \"%s\" n'est pas protèger par mot de passe\n" #: cryptmount.c:784 cryptmount.c:905 #, c-format msgid "Cannot open \"%s\" for writing\n" msgstr "Ne pas pouvoir ecrire à \"%s\"\n" #: cryptmount.c:799 #, c-format msgid "Retiring old key (%s -> %s) failed\n" msgstr "Retraitment de vielle fichier-clef (%s -> %s) a echouée\n" #: cryptmount.c:807 #, c-format msgid "Installing new key (%s -> %s) failed\n" msgstr "Installation de nouvelle fichier-clef (%s -> %s) a echouée\n" #: cryptmount.c:814 #, c-format msgid "Backup of previous key is in \"%s\"\n" msgstr "Une sauvegarde de l'ancienne clef est dans \"%s\"\n" #: cryptmount.c:854 cryptmount.c:1521 #, c-format msgid "Target name \"%s\" is not recognized\n" msgstr "Nom de cible \"%s\" n'est pas reconnu\n" #: cryptmount.c:860 #, c-format msgid "Bad key-length parameter" msgstr "Mauvaise paramètre pour la taille de la clef" #: cryptmount.c:872 #, c-format msgid "Key-file \"%s\" already exists for target \"%s\"\n" msgstr "Le fichier-clef \"%s\" existe déjà pour la cible \"%s\"\n" #: cryptmount.c:882 #, c-format msgid "Generating random key; please be patient...\n" msgstr "Veuillez attendre pendant la création d'une clef aléatoire...\n" #: cryptmount.c:886 #, c-format msgid "Failed to generate new key\n" msgstr "Génération de nouvelle clef a echouée\n" #: cryptmount.c:919 #, c-format msgid "Installation of new keyfile \"%s\" failed" msgstr "Installation de novelle fichier-clef \"%s\" a echouée" #: cryptmount.c:1055 #, c-format msgid "Only root can use option \"%s\"\n" msgstr "Seulement le super-utilisateur peut utiliser \"%s\"\n" #: cryptmount.c:1068 #, c-format msgid "Only root can configure \"%s\"\n" msgstr "Seulement le super-utilisateur peut configurer \"%s\"\n" #: cryptmount.c:1132 #, c-format msgid "Cannot find key-manager to match target \"%s\"\n" msgstr "Ne peut pas trouver un diriger-clef pour la cible \"%s\"\n" #: cryptmount.c:1390 #, c-format msgid "Multiple operating modes not supported\n" msgstr "" #: cryptmount.c:1445 #, c-format msgid "Memory-locking failed...\n" msgstr "Verrouillage de la memoire a echoué...\n" #: cryptmount.c:1473 #, c-format msgid "Bad file-descriptor (%d)\n" msgstr "Maivais descripteur de fichier (%d)\n" #: cryptmount.c:1483 #, c-format msgid "Security failure\n" msgstr "Echec de securité\n" #: cryptmount.c:1501 #, c-format msgid "Trailing command-line arguments given with '--all' option\n" msgstr "Arguments donnés après option '--all'\n" #: cryptmount.c:1533 #, c-format msgid "Target security failure for \"%s\"\n" msgstr "Echec de securité pour cible \"%s\"\n" #: cryptmount.c:1542 #, c-format msgid "No targets specified\n" msgstr "Pas de cible donnée\n" #: fsutils.c:264 #, c-format msgid "Unsuitable filesystem type \"%s\" for swapping\n" msgstr "Mauvaise type de système de fichiers \"%s\" pour la pagination\n" #: fsutils.c:294 #, c-format msgid "" "Device \"%s\" appears to contain data (entropy=%.3g,%.3g) - please run " "mkswap manually\n" msgstr "" "Périphérique \"%s\" semble contenir des données valable (entropy=%.3g,%.3g) " "- veuillez utiliser mkswap manuellement\n" #: looputils.c:222 #, c-format msgid "Failed to free device (%d,%d)\n" msgstr "Dégagement du périphérique (%d,%d) a echoué\n" #: looputils.c:258 #, c-format msgid "No available loopback devices\n" msgstr "Il n'y a aucun périph-loop disponible\n" #: looputils.c:272 #, c-format msgid "Bad device type (%x) for \"%s\" (need block/file)\n" msgstr "" "Mauvais type (%x) du périphérique pour \"%s\" (on a besoin du block/file)\n" #: tables.c:549 #, c-format msgid "" "cryptmount: please replace \"fsoptions\" with \"mountoptions\" in cmtab\n" msgstr "" "cryptmount: veillez remplacer \"fsoptions\" avec \"mountoptions\" dans votre " "cmtab\n" #: tables.c:554 #, c-format msgid "cryptmount: unrecognized option \"%s\" in cmtab\n" msgstr "cryptmount: mauvaise option \"%s\" dans votre cmtab\n" #: tables.c:637 #, c-format msgid "Configuration error near %s:%d\n" msgstr "Echec de configuration près de %s:%d\n" #: utils.c:312 #, c-format msgid "Unable to allocate memory\n" msgstr "" #: utils.c:422 #, c-format msgid "Too few random-number sources found\n" msgstr "" #: utils.c:481 #, c-format msgid "Cannot read stdin" msgstr "" #: utils.c:493 #, c-format msgid "Failed to turn off keyboard echoing on terminal\n" msgstr "" #: utils.c:523 #, c-format msgid "Enter new password for target \"%s\": " msgstr "Donnez nouveau mot de passe pour la cible \"%s\": " #: utils.c:524 #, c-format msgid "Enter password for target \"%s\": " msgstr "Donnez mot de passe pour la cible \"%s\": " #: utils.c:533 #, c-format msgid "Confirm password: " msgstr "Confirmez mot de passe: " #: utils.c:536 #, c-format msgid "Password mismatch\n" msgstr "Les deux mots de passe sont differents\n" #: utils.c:575 sysinit/setupscript.sh.in:218 #, sh-format msgid "yes" msgstr "oui" #: utils.c:582 #, c-format msgid "Are you sure? (Type \"%s\" to proceed): " msgstr "Etes vous sûr? (Tappez \"%s\" pour continuer): " #: utils.c:585 #, c-format msgid "Cannot read stdin\n" msgstr "" #: sysinit/setupscript.sh.in:41 #, sh-format msgid "Abandoning $ProgName ..." msgstr "$ProgName va se terminer ..." #: sysinit/setupscript.sh.in:49 #, sh-format msgid "" "This script must be run with superuser privileges - please try again, e.g. " "using one of the following:" msgstr "" "Ce script est seulement pour le super-utilisateur - veuillez essayer avec " "par exemple:" #: sysinit/setupscript.sh.in:112 #, sh-format msgid "opaque" msgstr "secret" #: sysinit/setupscript.sh.in:113 #, sh-format msgid "" "Each cryptmount filesystem is identifed by a short name which is used when " "mounting or configuring that filesystem. This name should be a single word " "(without spaces), such as \"${DefaultTargetName}\"." msgstr "" "Chaque système de fichiers dirigé par cryptmount est appelé par un nom court " "qu'on utilise pendant le montage ou la configuration de cette système de " "fichiers. Ce nom doit être un seul mot (sans espaces), comme par exemple " "\"${DefaultTargetName}\"." #: sysinit/setupscript.sh.in:114 #, sh-format msgid "The following target names have already been used:" msgstr "Les noms de cible suivants sont déjà pris:" #: sysinit/setupscript.sh.in:121 #, sh-format msgid "Please enter a target name for your filesystem" msgstr "Veuillez donnez un nom de cible pour votre système de fichiers" #: sysinit/setupscript.sh.in:125 #, sh-format msgid "The target-name \"${TargetName}\" has already been used" msgstr "Le nom de cible \"${TargetName}\" est déjà pris" #: sysinit/setupscript.sh.in:133 #, sh-format msgid "" "The ${TargetName} filesystem can be configured to be owned by a nominated " "user, who will be able to create top-level files & directories without " "needing to involve the superuser." msgstr "" "Il est possible de donner possession du ${TargetName} à un utilisateur " "specifique pour que cet utilisateur puisse créer des fichiers et répertoires " "sans besoin du super-utilisateur." #: sysinit/setupscript.sh.in:135 #, sh-format msgid "Which user should own the filesystem (leave blank for \"root\")" msgstr "" "Quel utilisateur doit posseder le système de fichiers (laissez vide pour " "\"root\")" #: sysinit/setupscript.sh.in:141 #, sh-format msgid "" "In order to access the ${TargetName} filesystem, it must be mounted on top " "of an empty directory." msgstr "" "Pour acceder le système de fichiers ${TargetName}, il doit être monté sur un " "répertoire vide." #: sysinit/setupscript.sh.in:145 #, sh-format msgid "Please specify where \"${TargetName}\" should be mounted" msgstr "Donner le nom d'un répertoire sur lequel \"${TargetName}\" sera monté" #: sysinit/setupscript.sh.in:149 #, sh-format msgid "${mount_dir} is not a valid directory name" msgstr "Le nom ${mount_dir} n'est pas valide comme répertoire" #: sysinit/setupscript.sh.in:157 #, sh-format msgid "" "The maximum available size of your filesystem needs to be chosen so that " "enough space can be reserved on your disk." msgstr "" "La taille maximale de votre système de fichiers doit être choisie pour " "qu'assez d'espace soit reservé sur votre disque dur." #: sysinit/setupscript.sh.in:161 #, sh-format msgid "Enter the filesystem size (in MB)" msgstr "Donnez la taille du système de fichiers (en MO)" #: sysinit/setupscript.sh.in:166 #, sh-format msgid "${fs_size} is not a valid number" msgstr "${fs_size} n'est pas un numero valide" #: sysinit/setupscript.sh.in:172 #, sh-format msgid "" "The actual encrypted filesystem will be stored in a special file, which " "needs to be large enough to contain your entire encrypted filesystem." msgstr "" "Le système de fichiers chiffré sera contenu dans un fichier special, qui " "doit être d'une taille suffisament grande pour contenir votre système de " "fichiers entier." #: sysinit/setupscript.sh.in:176 #, sh-format msgid "Enter a filename for your encrypted container" msgstr "Donnez un nom de fichier pour votre conteneur chiffré" #: sysinit/setupscript.sh.in:180 #, sh-format msgid "WARNING: ${crypto_dev} already exists" msgstr "ATTENTION: ${crypto_dev} existe déjà" #: sysinit/setupscript.sh.in:188 #, sh-format msgid "" "Access to your encrypted filesystem is protected by a key that is kept in a " "separate small file. The key is locked by a password that you must enter " "whenever you mount the filesystem." msgstr "" "L'accès à votre système de fichiers chiffré est protégé par une clef qui est " "contenue dans son même petit fichier. Pour acceder à cette clef, on doit " "donner un mot de passe chaque fois que l'on monte le système de fichiers." #: sysinit/setupscript.sh.in:192 #, sh-format msgid "Enter a location for the keyfile" msgstr "Donnez un nom de fichier pour le fichier-clef" #: sysinit/setupscript.sh.in:196 #, sh-format msgid "WARNING: ${key_file} already exists" msgstr "ATTENTION: ${key_file} existe déjà" #: sysinit/setupscript.sh.in:207 #, sh-format msgid "Your filing system is now ready to be built - this will involve:" msgstr "" "Maintenant, votre système de fichiers est prêt à être construit, selon les " "étapes suivantes:" #: sysinit/setupscript.sh.in:208 #, sh-format msgid " - Creating the directory \"${mount_dir}\"" msgstr " - Création du répertoire \"${mount_dir}\"" #: sysinit/setupscript.sh.in:209 #, sh-format msgid " - Creating a ${fs_size}MB file, \"${crypto_dev}\"" msgstr " - Création d'un fichier \"${crypto_dev}\" de ${fs_size}MO" #: sysinit/setupscript.sh.in:210 #, sh-format msgid " - Adding an extra entry (\"${TargetName}\") in ${CM_CFGDIR}/cmtab" msgstr "" " - Ajout d'une cible supplémentaire (\"${TargetName}\") dans ${CM_CFGDIR}/" "cmtab" #: sysinit/setupscript.sh.in:211 #, sh-format msgid " - Creating a key-file (\"${key_file}\")" msgstr " - Création d'un fichier-clef (\"${key_file}\")" #: sysinit/setupscript.sh.in:212 #, sh-format msgid " - Creating an ext3 filingsystem on \"${crypto_dev}\"" msgstr " - Construction d'un système de fichiers ext3 sur \"${crypto_dev}\"" #: sysinit/setupscript.sh.in:215 #, sh-format msgid " - Overwriting the backup configuration-file \"${bckp_cmtab}\"" msgstr " - Écrasement le fichier de sauvegarde \"${bckp_cmtab}\"" #: sysinit/setupscript.sh.in:217 #, sh-format msgid "If you do not wish to proceed, no changes will be made to your system." msgstr "Si vous ne voulez pas continuer, votre système ne changera pas." #: sysinit/setupscript.sh.in:219 #, sh-format msgid "no" msgstr "non" #: sysinit/setupscript.sh.in:220 #, sh-format msgid "" "Please confirm that you want to proceed (enter \"${AffirmativeResponse}\")" msgstr "" "Veuillez confirmer que vous voulez continuer (écrivez " "\"${AffirmativeResponse}\")" #: sysinit/setupscript.sh.in:223 #, sh-format msgid "Installation abandoned" msgstr "Installation terminée" #: sysinit/setupscript.sh.in:227 #, sh-format msgid "done" msgstr "terminé(e)" #: sysinit/setupscript.sh.in:229 #, sh-format msgid "Making mount-point (${mount_dir})..." msgstr "Réalisation du point de montage (${mount_dir})..." #: sysinit/setupscript.sh.in:232 #, sh-format msgid "Creating filesystem container (${crypto_dev})..." msgstr "Création du conteneur du système de fichiers (${crypto_dev})..." #: sysinit/setupscript.sh.in:237 #, sh-format msgid "Taking backup of cryptmount master config-file (${bckp_cmtab})..." msgstr "Sauvegarde du fichier de configuration (${bckp_cmtab})..." #: sysinit/setupscript.sh.in:254 #, sh-format msgid "Generating filesystem access key (${key_file})..." msgstr "Construction du fichier-clef (${key_file})..." #: sysinit/setupscript.sh.in:262 #, sh-format msgid "Formatting encrypted filesystem..." msgstr "Formatage du système de fichier chiffré..." #: sysinit/setupscript.sh.in:291 #, sh-format msgid "cryptmount setup script" msgstr "" #: sysinit/setupscript.sh.in:293 #, sh-format msgid "" "This program will allow you to setup a secure filing-system that will be " "managed by \"cryptmount\". You will be able to select basic features such as " "the location and size of the filesystem - if you want more advanced " "features, you should consult the cryptmount manual page." msgstr "" "Ce progamme vous permettra de construire un système de fichiers chiffré qui " "sera dirigé par «cryptmount». Vous pourrez selectioner quelques options " "basiques, telle que la location et la taille du système de fichiers. Si vous " "avez besoin de particularités plus avancées, il faut lire la page manuel de " "cryptmount." #: sysinit/setupscript.sh.in:296 #, sh-format msgid "cryptmount comes with ABSOLUTELY NO WARRANTY." msgstr "cryptmount n'est fourni avec aucune garantie." #: sysinit/setupscript.sh.in:297 #, sh-format msgid "" "This is free software, and you are welcome to redistribute it under certain " "conditions - see the file 'COPYING' in the source directory." msgstr "" "Ce paquet est un logiciel libre - les termes de sa licence sont décrits dans " "le fichier 'COPYING' dans le paquet source." #: sysinit/setupscript.sh.in:323 #, sh-format msgid "Your new encrypted filesystem is now ready for use - to access, try:" msgstr "" "Votre nouveau système de fichiers chiffré est prêt - pour l'utiliser, " "veuillez essayer:" #: sysinit/setupscript.sh.in:326 #, sh-format msgid "After you have finished using the filesystem, try:" msgstr "Lorsque vous avez terminé d'utiliser le système de fichiers, essayez:" #~ msgid "Failed to create loop device for LUKS keyfile\n" #~ msgstr "Création du périphérique-loop pour le fichier-clef LUKS a echouée\n" #~ msgid "Failed to read LUKS header for \"%s\"\n" #~ msgstr "Lisant l'en-tête LUKS pour \"%s\" a echoué\n" #~ msgid "" #~ "cryptmount: using \"keycipher=none\" is deprecated - please use " #~ "\"keyformat=raw\" instead\n" #~ msgstr "" #~ "cryptmount: usage de \"keycipher=none\" est découragé - veuillez plutôt " #~ "utiliser \"keyformat=raw\"\n" #~ msgid "Missing parameter\n" #~ msgstr "Paramètre perdue\n" #~ msgid "Unrecognized key format (%s) for target \"%s\"\n" #~ msgstr "Mauvaise type de fichier-clef (%s) pour la cible \"%s\"\n" #~ msgid "Missing output stream for target \"%s\"\n" #~ msgstr "Pas de flux de sorti pour la cible \"%s\"\n" #~ msgid "target name \"%s\" is not recognized\n" #~ msgstr "nom de cible \"%s\" n'est pas reconnu\n" #~ msgid "Failed to create loop device for LUKS keyfile" #~ msgstr "Création du périphérique-loop pour le fichier-clef LUKS a echouée\n" #~ msgid "key-extraction failed for \"%s\"\n" #~ msgstr "extraction de la clef pour \"%s\" a echouée\n" #~ msgid "password mismatch when extracting key\n" #~ msgstr "mot de passe n'est pas verifié\n" #~ msgid "failed to create new key file\n" #~ msgstr "génération de nouvelle clef a echouée\n" cryptmount-5.2/po/en@boldquot.header0000644000175000017500000000247111216245452014577 00000000000000# All this catalog "translates" are quotation characters. # The msgids must be ASCII and therefore cannot contain real quotation # characters, only substitutes like grave accent (0x60), apostrophe (0x27) # and double quote (0x22). These substitutes look strange; see # http://www.cl.cam.ac.uk/~mgk25/ucs/quotes.html # # This catalog translates grave accent (0x60) and apostrophe (0x27) to # left single quotation mark (U+2018) and right single quotation mark (U+2019). # It also translates pairs of apostrophe (0x27) to # left single quotation mark (U+2018) and right single quotation mark (U+2019) # and pairs of quotation mark (0x22) to # left double quotation mark (U+201C) and right double quotation mark (U+201D). # # When output to an UTF-8 terminal, the quotation characters appear perfectly. # When output to an ISO-8859-1 terminal, the single quotation marks are # transliterated to apostrophes (by iconv in glibc 2.2 or newer) or to # grave/acute accent (by libiconv), and the double quotation marks are # transliterated to 0x22. # When output to an ASCII terminal, the single quotation marks are # transliterated to apostrophes, and the double quotation marks are # transliterated to 0x22. # # This catalog furthermore displays the text between the quotation marks in # bold face, assuming the VT100/XTerm escape sequences. # cryptmount-5.2/po/de.po0000644000175000017500000005647212613124531012107 00000000000000# German translation of the cryptmount language file resulting in de.po # Copyright © 2008-2014 Kai Wasserbäch # This file is distributed under the same license as the cryptmount package. # msgid "" msgstr "" "Project-Id-Version: cryptmount 4.2-1\n" "Report-Msgid-Bugs-To: rwpenney@users.sourceforge.net\n" "POT-Creation-Date: 2015-10-25 05:25+0000\n" "PO-Revision-Date: 2011-06-12 12:07+0200\n" "Last-Translator: Kai Wasserbäch \n" "Language-Team: German \n" "Language: de\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #: armour.c:154 armour-builtin.c:300 armour-gcry.c:546 armour-gcry.c:702 #, c-format msgid "Key-extraction failed for \"%s\"\n" msgstr "Auslesen des Schlüssels für »%s« schlug fehl.\n" #: armour.c:176 #, c-format msgid "Key-writing failed for \"%s\"\n" msgstr "Schreiben des Schlüssels für »%s« schlug fehl.\n" #: armour.c:361 #, c-format msgid "Failed to open keyfile \"%s\" for target \"%s\"\n" msgstr "Öffnen der Schlüsseldatei »%s« für Ziel »%s« schlug fehl.\n" #: armour.c:369 #, c-format msgid "Missing keyfile for target \"%s\"\n" msgstr "Schlüsseldatei für Ziel »%s« fehlt.\n" #: armour.c:396 #, c-format msgid "Missing output keyfile for target \"%s\"\n" msgstr "Schlüsselausgabedatei für Ziel »%s« fehlt.\n" #: armour.c:778 #, c-format msgid "Specification for target \"%s\" contains non-absolute pathname\n" msgstr "Die Zielangabe für »%s« enthält eine nicht-absolute Pfadangabe.\n" #: armour-builtin.c:282 armour-gcry.c:528 armour-gcry.c:683 #, c-format msgid "Password mismatch when extracting key\n" msgstr "Fehlerhaftes Passwort während des Auslesens des Schlüssels.\n" #: armour-builtin.c:398 armour-gcry.c:607 armour-gcry.c:761 #, c-format msgid "Failed to create new key file\n" msgstr "Erstellen einer neuen Schlüsseldatei schlug fehl.\n" #: armour-gcry.c:166 #, c-format msgid "Couldn't find libgcrypt cipher \"%s\"\n" msgstr "Konnte libgcrypt-Chiffre »%s« nicht finden.\n" #: armour-gcry.c:178 #, c-format msgid "Couldn't find libgcrypt digest \"%s\"\n" msgstr "Konnte libgcrypt-Hash »%s« nicht finden.\n" #: armour-gcry.c:489 #, c-format msgid "Bad keyfile format (libgcrypt)\n" msgstr "Falsches Schlüsseldateiformat (libgcrypt).\n" #: armour-gcry.c:532 #, c-format msgid "Checksum mismatch in keyfile (gcry, %x != %x)\n" msgstr "" "Nicht übereinstimmende Prüfsumme in der Schlüsseldatei (gcry, %x != %x).\n" #: armour-gcry.c:648 #, c-format msgid "Bad keyfile format (openssl-compat)\n" msgstr "Falsches Schlüsseldateiformat (openssl-compat).\n" #: armour-gcry.c:687 #, c-format msgid "Checksum mismatch in keyfile (openssl-compat, ofs=%u,idx=%u)\n" msgstr "" "Nicht übereinstimmende Prüfsumme in der Schlüsseldatei (openssl-compat, ofs=" "%u, idx=%u).\n" #: armour-luks.c:278 armour-luks.c:362 #, fuzzy, c-format msgid "Failed to initialize device for LUKS keyfile\n" msgstr "" "Erstellen eines neuen Loop-Gerätes für LUKS-Schlüsseldatei schlug fehl.\n" #: armour-luks.c:288 #, c-format msgid "Failed to extract LUKS key for \"%s\" (errno=%d)\n" msgstr "Auslesen des LUKS-Schlüssels für »%s« schlug fehl (errno=%d).\n" #: armour-luks.c:349 #, c-format msgid "Formatting \"%s\", will probably destroy all existing data" msgstr "" "Formatiere »%s«, dies wird wahrscheinlich alle bestehenden Daten zerstören." #: armour-luks.c:378 #, c-format msgid "Failed to create LUKS header for \"%s\"\n" msgstr "Erstellen eines neuen LUKS-Headers für »%s« schlug fehl.\n" #: armour-luks.c:388 #, c-format msgid "Failed to create LUKS key for \"%s\"\n" msgstr "Erstellen eines neuen LUKS-Schlüssels für »%s« schlug fehl.\n" #: armour-luks.c:399 #, c-format msgid "Setting password on LUKS keyslot-%u\n" msgstr "Setze Passwort für den LUKS-Schlüsselplatz »%u«\n" #: cryptmount.c:120 #, fuzzy msgid "" "usage: cryptmount [OPTION [target ...]]\n" "\n" " available options are as follows:\n" "\n" " -h | --help\n" " -a | --all\n" " -c | --change-password \n" " -k | --key-managers\n" " -l | --list\n" " -S | --status\n" " -m | --mount \n" " -u | --unmount \n" " --generate-key \n" " --reuse-key \n" " --prepare \n" " --release \n" " --config-fd \n" " --passwd-fd \n" " --swapon \n" " --swapoff \n" " --version\n" "\n" " please report bugs to \n" msgstr "" "Aufruf: cryptmount [OPTION [Ziel ...]]\n" "\n" " Die folgenden Optionen sind verfügbar:\n" "\n" " -h | --help\n" " -a | --all\n" " -c | --change-password \n" " -k | --key-managers\n" " -l | --list\n" " -m | --mount \n" " -u | --unmount \n" " --generate-key \n" " --reuse-key \n" " --prepare \n" " --release \n" " --config-fd \n" " --passwd-fd \n" " --swapon \n" " --swapoff \n" " --version\n" "\n" " Bitte melden Sie Fehler (auf Englisch) an .\n" #. TRANSLATORS: this string is marked as 'no-c-format' because #. some localizations may require the mount-point and filesystem type #. to be printed in a different order, but the untranslated string needs #. to remain an ordinary string that can be printed without gettext. #: cryptmount.c:255 #, no-c-format msgid "%-16s [to mount on \"%s\" as \"%s\"]\n" msgstr "%-16s [um »%3$s« unter »%2$s« einzuhängen]\n" #: cryptmount.c:387 #, c-format msgid "Failed to extract cipher key\n" msgstr "Auslesen des Chiffreschlüssels schlug fehl.\n" #: cryptmount.c:396 #, c-format msgid "Cannot open device \"%s\" for target \"%s\"\n" msgstr "Kann Gerät »%s« für Ziel »%s« nicht öffnen.\n" #: cryptmount.c:404 #, c-format msgid "Failed to get size of \"%s\"\n" msgstr "Konnte Größe von »%s« nicht ermitteln.\n" #: cryptmount.c:414 #, c-format msgid "Bad device-mapper start/length" msgstr "Falsche(r) device-mapper-Beginn/Länge." #: cryptmount.c:441 #, c-format msgid "Device-mapper target-creation failed for \"%s\"\n" msgstr "Erstellen des device-mapper-Ziels für »%s« schlug fehl.\n" #: cryptmount.c:480 cryptmount.c:706 #, c-format msgid "Target \"%s\" does not appear to be configured\n" msgstr "Ziel »%s« scheint unkonfiguriert zu sein.\n" #: cryptmount.c:495 #, c-format msgid "Cannot stat \"%s\"\n" msgstr "Kann Status für »%s« nicht abfragen.\n" #: cryptmount.c:503 #, c-format msgid "Failed to remove device-mapper target \"%s\"\n" msgstr "Entfernen des device-mapper-Ziels »%s« schlug fehl.\n" #: cryptmount.c:536 #, c-format msgid "Target \"%s\" is already mounted\n" msgstr "Ziel »%s« ist bereits eingehängt.\n" #: cryptmount.c:594 #, c-format msgid "Target \"%s\" does not appear to be mounted\n" msgstr "Ziel »%s« scheint noch nicht eingehängt zu sein.\n" #: cryptmount.c:604 #, c-format msgid "Only \"%s\" can unmount \"%s\"\n" msgstr "Nur »%s« kann »%s« aushängen.\n" #. TRANSLATORS: the following expands to include #. the *numerical* user-identity in place of '%lu', #. e.g. giving 'only user-16 can unmount "target"': #: cryptmount.c:610 #, c-format msgid "Only user-%lu can unmount \"%s\"\n" msgstr "Nur der Benutzer mit der ID »%lu« kann »%s« aushängen.\n" #: cryptmount.c:670 cryptmount.c:726 #, c-format msgid "Crypto-swap is not supported by this installation of cryptmount\n" msgstr "" "Crypto-swap wird von dieser cryptmount-Installation nicht unterstützt.\n" #: cryptmount.c:758 #, c-format msgid "Key-file for \"%s\" isn't password-protected\n" msgstr "Schlüsseldatei für »%s« ist nicht passwortgeschützt.\n" #: cryptmount.c:784 cryptmount.c:905 #, c-format msgid "Cannot open \"%s\" for writing\n" msgstr "Kann »%s« nicht zum Schreiben öffnen.\n" #: cryptmount.c:799 #, c-format msgid "Retiring old key (%s -> %s) failed\n" msgstr "Ausmustern des alten Schlüssels (%s -> %s) schlug fehl.\n" #: cryptmount.c:807 #, c-format msgid "Installing new key (%s -> %s) failed\n" msgstr "Installation des neuen Schlüssels (%s -> %s) schlug fehl.\n" #: cryptmount.c:814 #, c-format msgid "Backup of previous key is in \"%s\"\n" msgstr "Eine Sicherheitskopie des vorherigen Schlüssels ist in »%s«.\n" #: cryptmount.c:854 cryptmount.c:1521 #, c-format msgid "Target name \"%s\" is not recognized\n" msgstr "Zielname »%s« wurde nicht erkannt.\n" #: cryptmount.c:860 #, c-format msgid "Bad key-length parameter" msgstr "Falscher Schlüssellängen-Parameter" #: cryptmount.c:872 #, c-format msgid "Key-file \"%s\" already exists for target \"%s\"\n" msgstr "Schlüsseldatei »%s« existiert für das Ziel »%s« bereits.\n" #: cryptmount.c:882 #, c-format msgid "Generating random key; please be patient...\n" msgstr "Erstelle zufälligen Schlüssel; bitte warten Sie ...\n" #: cryptmount.c:886 #, c-format msgid "Failed to generate new key\n" msgstr "Generieren des neuen Schlüssels schlug fehl\n" #: cryptmount.c:919 #, c-format msgid "Installation of new keyfile \"%s\" failed" msgstr "Installation der neuen Schlüsseldatei »%s« schlug fehl." #: cryptmount.c:1055 #, c-format msgid "Only root can use option \"%s\"\n" msgstr "Nur root kann die Option »%s« verwenden.\n" #: cryptmount.c:1068 #, c-format msgid "Only root can configure \"%s\"\n" msgstr "Nur root kann »%s« konfigurieren.\n" #: cryptmount.c:1132 #, c-format msgid "Cannot find key-manager to match target \"%s\"\n" msgstr "Kann keinen für das Ziel »%s« passenden Schlüsselmanager finden.\n" #: cryptmount.c:1390 #, c-format msgid "Multiple operating modes not supported\n" msgstr "" #: cryptmount.c:1445 #, c-format msgid "Memory-locking failed...\n" msgstr "Sperren des Arbeitsspeichers schlug fehl ...\n" #: cryptmount.c:1473 #, c-format msgid "Bad file-descriptor (%d)\n" msgstr "Fehlerhafter Dateideskriptor (%d)\n" #: cryptmount.c:1483 #, c-format msgid "Security failure\n" msgstr "Sicherheitsfehler\n" #: cryptmount.c:1501 #, c-format msgid "Trailing command-line arguments given with '--all' option\n" msgstr "" "Abschließende Kommandozeilen-Argumente; wurden zusammen mit der Option »--" "all« angegeben.\n" #: cryptmount.c:1533 #, c-format msgid "Target security failure for \"%s\"\n" msgstr "Sicherheitsfehler für Ziel »%s«.\n" #: cryptmount.c:1542 #, c-format msgid "No targets specified\n" msgstr "Keine Ziele angegeben.\n" #: fsutils.c:264 #, c-format msgid "Unsuitable filesystem type \"%s\" for swapping\n" msgstr "Unpassender Dateisystemtyp »%s« zum Auslagern.\n" #: fsutils.c:294 #, c-format msgid "" "Device \"%s\" appears to contain data (entropy=%.3g,%.3g) - please run " "mkswap manually\n" msgstr "" "Das Gerät »%s« scheint Daten zu enthalten (Entropie=%.3g,%.3g) – bitte " "führen Sie mkswap manuell aus.\n" #: looputils.c:222 #, c-format msgid "Failed to free device (%d,%d)\n" msgstr "Konnte Gerät (%d,%d) nicht freigeben.\n" #: looputils.c:258 #, c-format msgid "No available loopback devices\n" msgstr "Keine verfügbaren Loopback-Geräte.\n" #: looputils.c:272 #, c-format msgid "Bad device type (%x) for \"%s\" (need block/file)\n" msgstr "Falscher Gerätetyp (%x) für »%s« (Block/Datei benötigt).\n" #: tables.c:549 #, c-format msgid "" "cryptmount: please replace \"fsoptions\" with \"mountoptions\" in cmtab\n" msgstr "" "cryptmount: Bitte ersetzen »fsoptions« mit »mountoptions« in der cmtab\n" #: tables.c:554 #, c-format msgid "cryptmount: unrecognized option \"%s\" in cmtab\n" msgstr "cryptmount: Nicht unterstützte Option »%s« in der cmtab.\n" #: tables.c:637 #, c-format msgid "Configuration error near %s:%d\n" msgstr "Konfigurationsfehler nahe %s:%d\n" #: utils.c:312 #, c-format msgid "Unable to allocate memory\n" msgstr "Konnte keinen Speicher reservieren.\n" #: utils.c:422 #, fuzzy, c-format msgid "Too few random-number sources found\n" msgstr "Kein Zufallszahlengenerator gefunden.\n" #: utils.c:481 #, c-format msgid "Cannot read stdin" msgstr "Kann nicht von der Standardeingabe lesen." #: utils.c:493 #, c-format msgid "Failed to turn off keyboard echoing on terminal\n" msgstr "Konnte die Wiedergabe der Tastatureingabe nicht deaktivieren.\n" #: utils.c:523 #, c-format msgid "Enter new password for target \"%s\": " msgstr "Bitte geben Sie ein neues Passwort für das Ziel »%s« ein: " #: utils.c:524 #, c-format msgid "Enter password for target \"%s\": " msgstr "Bitte geben Sie das Passwort für das Ziel »%s« ein: " #: utils.c:533 #, c-format msgid "Confirm password: " msgstr "Passwort bestätigen: " #: utils.c:536 #, c-format msgid "Password mismatch\n" msgstr "Passworte stimmen nicht überein.\n" #: utils.c:575 sysinit/setupscript.sh.in:218 #, sh-format msgid "yes" msgstr "ja" #: utils.c:582 #, c-format msgid "Are you sure? (Type \"%s\" to proceed): " msgstr "Sind Sie sicher? (Geben Sie »%s« ein, um fortzufahren): " #: utils.c:585 #, c-format msgid "Cannot read stdin\n" msgstr "Kann nicht von der Standardeingabe lesen.\n" #: sysinit/setupscript.sh.in:41 #, sh-format msgid "Abandoning $ProgName ..." msgstr "Beende $ProgName ..." #: sysinit/setupscript.sh.in:49 #, sh-format msgid "" "This script must be run with superuser privileges - please try again, e.g. " "using one of the following:" msgstr "" "Dieses Skript muss mit den Rechten von root (superuser) ausgeführt werden - " "bitte versuchen Sie es z.B. mit einem der folgenden Benutzernamen erneut:" #: sysinit/setupscript.sh.in:112 #, sh-format msgid "opaque" msgstr "undurchlässig" #: sysinit/setupscript.sh.in:113 #, sh-format msgid "" "Each cryptmount filesystem is identifed by a short name which is used when " "mounting or configuring that filesystem. This name should be a single word " "(without spaces), such as \"${DefaultTargetName}\"." msgstr "" "Jedes cryptmount-Dateisystem wird durch einen Kurznamen identifiziert, der " "verwandt wird, wenn das Dateisystem eingehängt oder konfiguriert wird. " "Dieser Name sollte ein einzelnes Wort (ohne Leerzeichen) wie beispielsweise " "»${DefaultTargetName}« sein." #: sysinit/setupscript.sh.in:114 #, sh-format msgid "The following target names have already been used:" msgstr "Die folgenden Zielnamen werden bereits verwandt:" #: sysinit/setupscript.sh.in:121 #, sh-format msgid "Please enter a target name for your filesystem" msgstr "Bitte geben Sie einen Zielnamen für Ihr Dateisystem ein." #: sysinit/setupscript.sh.in:125 #, sh-format msgid "The target-name \"${TargetName}\" has already been used" msgstr "Der Zielname »${TargetName}« wird bereits verwandt." #: sysinit/setupscript.sh.in:133 #, sh-format msgid "" "The ${TargetName} filesystem can be configured to be owned by a nominated " "user, who will be able to create top-level files & directories without " "needing to involve the superuser." msgstr "" "Das Dateisystem mit dem Namen »${TargetName}« kann so konfiguriert werden, " "dass es einem bestimmten Benutzer gehört, der dann ohne den Superuser im " "Wurzelverzeichnis des Dateisystems Dateien und Verzeichnisse erstellen kann." #: sysinit/setupscript.sh.in:135 #, sh-format msgid "Which user should own the filesystem (leave blank for \"root\")" msgstr "" "Welchem Benutzer soll das Dateisystem gehören (leer lassen für »root«)?" #: sysinit/setupscript.sh.in:141 #, sh-format msgid "" "In order to access the ${TargetName} filesystem, it must be mounted on top " "of an empty directory." msgstr "" "Um auf das Dateisystem »${TargetName}« zugreifen zu können, muss es in ein " "leeres Verzeichnis eingehängt werden." #: sysinit/setupscript.sh.in:145 #, sh-format msgid "Please specify where \"${TargetName}\" should be mounted" msgstr "Bitte geben Sie an, wo »${TargetName}« eingehängt werden soll." #: sysinit/setupscript.sh.in:149 #, sh-format msgid "${mount_dir} is not a valid directory name" msgstr "»${mount_dir}« ist kein gültiger Verzeichnisname." #: sysinit/setupscript.sh.in:157 #, sh-format msgid "" "The maximum available size of your filesystem needs to be chosen so that " "enough space can be reserved on your disk." msgstr "" "Die maximal verfügbare Größe des Dateisystems muss angegeben werden, damit " "auf der Festplatte ausreichend Speicherplatz reserviert werden kann." #: sysinit/setupscript.sh.in:161 #, sh-format msgid "Enter the filesystem size (in MB)" msgstr "Bitte geben Sie die Größe des Dateisystems ein (in MB)." #: sysinit/setupscript.sh.in:166 #, sh-format msgid "${fs_size} is not a valid number" msgstr "»${fs_size}« ist keine gültige Zahl" #: sysinit/setupscript.sh.in:172 #, sh-format msgid "" "The actual encrypted filesystem will be stored in a special file, which " "needs to be large enough to contain your entire encrypted filesystem." msgstr "" "Das eigentliche verschlüsselte Dateisystem wird in einer speziellen Datei " "abgelegt, die groß genug sein muss, um Ihr komplettes verschlüsseltes " "Dateisystem zu enthalten." #: sysinit/setupscript.sh.in:176 #, sh-format msgid "Enter a filename for your encrypted container" msgstr "Bitte geben Sie einen Dateinamen für den verschlüsselten Container an" #: sysinit/setupscript.sh.in:180 #, sh-format msgid "WARNING: ${crypto_dev} already exists" msgstr "WARNUNG: »${crypto_dev}« existiert bereits." #: sysinit/setupscript.sh.in:188 #, sh-format msgid "" "Access to your encrypted filesystem is protected by a key that is kept in a " "separate small file. The key is locked by a password that you must enter " "whenever you mount the filesystem." msgstr "" "Der Zugriff auf Ihr verschlüsseltes Dateisystem wird durch einen Schlüssel " "geschützt, der in einer kleinen, separaten Datei gespeichert wird. Der " "Schlüssel wird durch ein Passwort gesichert, welches Sie jedes Mal eingeben " "müssen, wenn Sie das Dateisystem einhängen wollen." #: sysinit/setupscript.sh.in:192 #, sh-format msgid "Enter a location for the keyfile" msgstr "Bitte geben Sie einen Speicherplatz für die Schlüsseldatei ein." #: sysinit/setupscript.sh.in:196 #, sh-format msgid "WARNING: ${key_file} already exists" msgstr "WARNUNG: »${key_file}« existiert bereits." #: sysinit/setupscript.sh.in:207 #, sh-format msgid "Your filing system is now ready to be built - this will involve:" msgstr "" "Ihr Dateisystem kann nun erstellt werden, dies umfasst die folgenden " "Schritte:" #: sysinit/setupscript.sh.in:208 #, sh-format msgid " - Creating the directory \"${mount_dir}\"" msgstr " - Erstellen des Verzeichnisses »${mount_dir}«" #: sysinit/setupscript.sh.in:209 #, sh-format msgid " - Creating a ${fs_size}MB file, \"${crypto_dev}\"" msgstr "" " - Erstellen einer ${fs_size} MB großen Datei mit dem Namen »${crypto_dev}«" #: sysinit/setupscript.sh.in:210 #, sh-format msgid " - Adding an extra entry (\"${TargetName}\") in ${CM_CFGDIR}/cmtab" msgstr "" " - Hinzufügen eines zusätzlichen Eintrags (»${TargetName}«) in ${CM_CFGDIR}/" "cmtab" #: sysinit/setupscript.sh.in:211 #, sh-format msgid " - Creating a key-file (\"${key_file}\")" msgstr " - Erstellen der Schlüsseldatei »${key_file}«" #: sysinit/setupscript.sh.in:212 #, sh-format msgid " - Creating an ext3 filingsystem on \"${crypto_dev}\"" msgstr " - Erstellen eines ext3-Dateisystems auf »${crypto_dev}«" #: sysinit/setupscript.sh.in:215 #, sh-format msgid " - Overwriting the backup configuration-file \"${bckp_cmtab}\"" msgstr "" " - Überschreiben der Sicherheitskopie der Konfigurationsdatei ${bckp_cmtab}" #: sysinit/setupscript.sh.in:217 #, sh-format msgid "If you do not wish to proceed, no changes will be made to your system." msgstr "" "Falls Sie nicht fortfahren möchten, werden keine Änderungen an Ihrem System " "vorgenommen." #: sysinit/setupscript.sh.in:219 #, sh-format msgid "no" msgstr "nein" #: sysinit/setupscript.sh.in:220 #, sh-format msgid "" "Please confirm that you want to proceed (enter \"${AffirmativeResponse}\")" msgstr "" "Bitte bestätigen Sie, dass Sie fortfahren möchten (geben Sie bitte " "»${AffirmativeResponse}« ein)" #: sysinit/setupscript.sh.in:223 #, sh-format msgid "Installation abandoned" msgstr "Installation abgebrochen" #: sysinit/setupscript.sh.in:227 #, sh-format msgid "done" msgstr "erledigt" #: sysinit/setupscript.sh.in:229 #, sh-format msgid "Making mount-point (${mount_dir})..." msgstr "Erstelle Einhängepunkt »${mount_dir}« ..." #: sysinit/setupscript.sh.in:232 #, sh-format msgid "Creating filesystem container (${crypto_dev})..." msgstr "Erstelle Dateisystemcontainer »${crypto_dev}« ..." #: sysinit/setupscript.sh.in:237 #, sh-format msgid "Taking backup of cryptmount master config-file (${bckp_cmtab})..." msgstr "" "Erstelle Sicherheitskopie der Haupt-Cryptmount-Konfigurationsdatei " "»${bckp_cmtab}« ..." #: sysinit/setupscript.sh.in:254 #, sh-format msgid "Generating filesystem access key (${key_file})..." msgstr "Erstelle Zugriffsschlüssel (${key_file}) für das Dateisystem ..." #: sysinit/setupscript.sh.in:262 #, sh-format msgid "Formatting encrypted filesystem..." msgstr "Formatiere das verschlüsselte Dateisystem ..." #: sysinit/setupscript.sh.in:291 #, sh-format msgid "cryptmount setup script" msgstr "cryptmount-Einrichtungsskript" #: sysinit/setupscript.sh.in:293 #, sh-format msgid "" "This program will allow you to setup a secure filing-system that will be " "managed by \"cryptmount\". You will be able to select basic features such as " "the location and size of the filesystem - if you want more advanced " "features, you should consult the cryptmount manual page." msgstr "" "Dieses Programm erlaubt es Ihnen, ein verschlüsseltes Dateisystem zu " "erstellen, welches von »cryptmount« verwaltet wird. Sie können grundlegende " "Eigenschaften wie Speicherort und Größe des Dateisystems einstellen. Wollen " "Sie weitere fortgeschrittenere Eigenschaften beeinflussen, sollten Sie die " "Handbuchseite von »cryptmount« lesen." #: sysinit/setupscript.sh.in:296 #, sh-format msgid "cryptmount comes with ABSOLUTELY NO WARRANTY." msgstr "cryptmount wird OHNE JEDWEDE GARANTIEN angeboten." #: sysinit/setupscript.sh.in:297 #, sh-format msgid "" "This is free software, and you are welcome to redistribute it under certain " "conditions - see the file 'COPYING' in the source directory." msgstr "" "Dies ist freie Software und Sie dürfen sie unter bestimmten Bedingungen " "weiterverbreiten - die Details finden Sie in der Datei »COPYING« im " "Quellcodeverzeichnis." #: sysinit/setupscript.sh.in:323 #, sh-format msgid "Your new encrypted filesystem is now ready for use - to access, try:" msgstr "" "Ihr neues, verschlüsseltes Dateisystem kann nun verwandt werden. Um darauf " "zuzugreifen, versuchen Sie Folgendes:" #: sysinit/setupscript.sh.in:326 #, sh-format msgid "After you have finished using the filesystem, try:" msgstr "Nach der Benutzung des Dateisystems, geben Sie bitte Folgendes ein:" #~ msgid "Failed to create loop device for LUKS keyfile\n" #~ msgstr "" #~ "Erstellen eines neuen Loop-Gerätes für LUKS-Schlüsseldatei schlug fehl.\n" #~ msgid "Failed to read LUKS header for \"%s\"\n" #~ msgstr "Konnte LUKS-Header von »%s« nicht lesen.\n" #~ msgid "" #~ "Writing LUKS keys is not possible unless cryptmount has been built with " #~ "the uuid-dev package installed\n" #~ msgstr "" #~ "Nur falls das »uuid-dev«-Paket beim kompilieren von cryptmount verfügbar " #~ "war, können LUKS-Schlüssel geschrieben werden.\n" #~ msgid "" #~ "cryptmount: using \"keycipher=none\" is deprecated - please use " #~ "\"keyformat=raw\" instead\n" #~ msgstr "" #~ "cryptmount: Die Verwendung von »keycipher=none« ist veraltet - bitte " #~ "verwenden Sie stattdessen »keyformat=raw«.\n" #~ msgid "Missing parameter\n" #~ msgstr "Fehlender Parameter\n" cryptmount-5.2/po/Makefile.in.in0000644000175000017500000003322111231412134013606 00000000000000# Makefile for PO directory in any package using GNU gettext. # Copyright (C) 1995-1997, 2000-2006 by Ulrich Drepper # # This file can be copied and used freely without restrictions. It can # be used in projects which are not available under the GNU General Public # License but which still want to provide support for the GNU gettext # functionality. # Please note that the actual code of GNU gettext is covered by the GNU # General Public License and is *not* in the public domain. # # Origin: gettext-0.16 PACKAGE = @PACKAGE@ VERSION = @VERSION@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ SHELL = /bin/sh @SET_MAKE@ srcdir = @srcdir@ top_srcdir = @top_srcdir@ VPATH = @srcdir@ prefix = @prefix@ exec_prefix = @exec_prefix@ datarootdir = @datarootdir@ datadir = @datadir@ localedir = @localedir@ gettextsrcdir = $(datadir)/gettext/po INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ # We use $(mkdir_p). # In automake <= 1.9.x, $(mkdir_p) is defined either as "mkdir -p --" or as # "$(mkinstalldirs)" or as "$(install_sh) -d". For these automake versions, # @install_sh@ does not start with $(SHELL), so we add it. # In automake >= 1.10, @mkdir_p@ is derived from ${MKDIR_P}, which is defined # either as "/path/to/mkdir -p" or ".../install-sh -c -d". For these automake # versions, $(mkinstalldirs) and $(install_sh) are unused. mkinstalldirs = $(SHELL) @install_sh@ -d install_sh = $(SHELL) @install_sh@ MKDIR_P = @MKDIR_P@ mkdir_p = @mkdir_p@ GMSGFMT_ = @GMSGFMT@ GMSGFMT_no = @GMSGFMT@ GMSGFMT_yes = @GMSGFMT_015@ GMSGFMT = $(GMSGFMT_$(USE_MSGCTXT)) MSGFMT_ = @MSGFMT@ MSGFMT_no = @MSGFMT@ MSGFMT_yes = @MSGFMT_015@ MSGFMT = $(MSGFMT_$(USE_MSGCTXT)) XGETTEXT_ = @XGETTEXT@ XGETTEXT_no = @XGETTEXT@ XGETTEXT_yes = @XGETTEXT_015@ XGETTEXT = $(XGETTEXT_$(USE_MSGCTXT)) MSGMERGE = msgmerge MSGMERGE_UPDATE = @MSGMERGE@ --update MSGINIT = msginit MSGCONV = msgconv MSGFILTER = msgfilter POFILES = @POFILES@ GMOFILES = @GMOFILES@ UPDATEPOFILES = @UPDATEPOFILES@ DUMMYPOFILES = @DUMMYPOFILES@ DISTFILES.common = Makefile.in.in remove-potcdate.sin \ $(DISTFILES.common.extra1) $(DISTFILES.common.extra2) $(DISTFILES.common.extra3) DISTFILES = $(DISTFILES.common) Makevars POTFILES.in \ $(POFILES) $(GMOFILES) \ $(DISTFILES.extra1) $(DISTFILES.extra2) $(DISTFILES.extra3) POTFILES = \ CATALOGS = @CATALOGS@ # Makevars gets inserted here. (Don't remove this line!) .SUFFIXES: .SUFFIXES: .po .gmo .mo .sed .sin .nop .po-create .po-update .po.mo: @echo "$(MSGFMT) -c -o $@ $<"; \ $(MSGFMT) -c -o t-$@ $< && mv t-$@ $@ .po.gmo: @lang=`echo $* | sed -e 's,.*/,,'`; \ test "$(srcdir)" = . && cdcmd="" || cdcmd="cd $(srcdir) && "; \ echo "$${cdcmd}rm -f $${lang}.gmo && $(GMSGFMT) -c --statistics -o $${lang}.gmo $${lang}.po"; \ cd $(srcdir) && rm -f $${lang}.gmo && $(GMSGFMT) -c --statistics -o t-$${lang}.gmo $${lang}.po && mv t-$${lang}.gmo $${lang}.gmo .sin.sed: sed -e '/^#/d' $< > t-$@ mv t-$@ $@ all: all-@USE_NLS@ all-yes: stamp-po all-no: # $(srcdir)/$(DOMAIN).pot is only created when needed. When xgettext finds no # internationalized messages, no $(srcdir)/$(DOMAIN).pot is created (because # we don't want to bother translators with empty POT files). We assume that # LINGUAS is empty in this case, i.e. $(POFILES) and $(GMOFILES) are empty. # In this case, stamp-po is a nop (i.e. a phony target). # stamp-po is a timestamp denoting the last time at which the CATALOGS have # been loosely updated. Its purpose is that when a developer or translator # checks out the package via CVS, and the $(DOMAIN).pot file is not in CVS, # "make" will update the $(DOMAIN).pot and the $(CATALOGS), but subsequent # invocations of "make" will do nothing. This timestamp would not be necessary # if updating the $(CATALOGS) would always touch them; however, the rule for # $(POFILES) has been designed to not touch files that don't need to be # changed. stamp-po: $(srcdir)/$(DOMAIN).pot test ! -f $(srcdir)/$(DOMAIN).pot || \ test -z "$(GMOFILES)" || $(MAKE) $(GMOFILES) @test ! -f $(srcdir)/$(DOMAIN).pot || { \ echo "touch stamp-po" && \ echo timestamp > stamp-poT && \ mv stamp-poT stamp-po; \ } # Note: Target 'all' must not depend on target '$(DOMAIN).pot-update', # otherwise packages like GCC can not be built if only parts of the source # have been downloaded. # This target rebuilds $(DOMAIN).pot; it is an expensive operation. # Note that $(DOMAIN).pot is not touched if it doesn't need to be changed. $(DOMAIN).pot-update: $(POTFILES) $(srcdir)/POTFILES.in remove-potcdate.sed if test -n '$(MSGID_BUGS_ADDRESS)' || test '$(PACKAGE_BUGREPORT)' = '@'PACKAGE_BUGREPORT'@'; then \ msgid_bugs_address='$(MSGID_BUGS_ADDRESS)'; \ else \ msgid_bugs_address='$(PACKAGE_BUGREPORT)'; \ fi; \ $(XGETTEXT) --default-domain=$(DOMAIN) --directory=$(top_srcdir) \ --add-comments=TRANSLATORS: $(XGETTEXT_OPTIONS) \ --files-from=$(srcdir)/POTFILES.in \ --copyright-holder='$(COPYRIGHT_HOLDER)' \ --msgid-bugs-address="$$msgid_bugs_address" test ! -f $(DOMAIN).po || { \ if test -f $(srcdir)/$(DOMAIN).pot; then \ sed -f remove-potcdate.sed < $(srcdir)/$(DOMAIN).pot > $(DOMAIN).1po && \ sed -f remove-potcdate.sed < $(DOMAIN).po > $(DOMAIN).2po && \ if cmp $(DOMAIN).1po $(DOMAIN).2po >/dev/null 2>&1; then \ rm -f $(DOMAIN).1po $(DOMAIN).2po $(DOMAIN).po; \ else \ rm -f $(DOMAIN).1po $(DOMAIN).2po $(srcdir)/$(DOMAIN).pot && \ mv $(DOMAIN).po $(srcdir)/$(DOMAIN).pot; \ fi; \ else \ mv $(DOMAIN).po $(srcdir)/$(DOMAIN).pot; \ fi; \ } # This rule has no dependencies: we don't need to update $(DOMAIN).pot at # every "make" invocation, only create it when it is missing. # Only "make $(DOMAIN).pot-update" or "make dist" will force an update. $(srcdir)/$(DOMAIN).pot: $(MAKE) $(DOMAIN).pot-update # This target rebuilds a PO file if $(DOMAIN).pot has changed. # Note that a PO file is not touched if it doesn't need to be changed. $(POFILES): $(srcdir)/$(DOMAIN).pot @lang=`echo $@ | sed -e 's,.*/,,' -e 's/\.po$$//'`; \ if test -f "$(srcdir)/$${lang}.po"; then \ test "$(srcdir)" = . && cdcmd="" || cdcmd="cd $(srcdir) && "; \ echo "$${cdcmd}$(MSGMERGE_UPDATE) $${lang}.po $(DOMAIN).pot"; \ cd $(srcdir) && $(MSGMERGE_UPDATE) $${lang}.po $(DOMAIN).pot; \ else \ $(MAKE) $${lang}.po-create; \ fi install: install-exec install-data install-exec: install-data: install-data-@USE_NLS@ if test "$(PACKAGE)" = "gettext-tools"; then \ $(mkdir_p) $(DESTDIR)$(gettextsrcdir); \ for file in $(DISTFILES.common) Makevars.template; do \ $(INSTALL_DATA) $(srcdir)/$$file \ $(DESTDIR)$(gettextsrcdir)/$$file; \ done; \ for file in Makevars; do \ rm -f $(DESTDIR)$(gettextsrcdir)/$$file; \ done; \ else \ : ; \ fi install-data-no: all install-data-yes: all $(mkdir_p) $(DESTDIR)$(datadir) @catalogs='$(CATALOGS)'; \ for cat in $$catalogs; do \ cat=`basename $$cat`; \ lang=`echo $$cat | sed -e 's/\.gmo$$//'`; \ dir=$(localedir)/$$lang/LC_MESSAGES; \ $(mkdir_p) $(DESTDIR)$$dir; \ if test -r $$cat; then realcat=$$cat; else realcat=$(srcdir)/$$cat; fi; \ $(INSTALL_DATA) $$realcat $(DESTDIR)$$dir/$(DOMAIN).mo; \ echo "installing $$realcat as $(DESTDIR)$$dir/$(DOMAIN).mo"; \ for lc in '' $(EXTRA_LOCALE_CATEGORIES); do \ if test -n "$$lc"; then \ if (cd $(DESTDIR)$(localedir)/$$lang && LC_ALL=C ls -l -d $$lc 2>/dev/null) | grep ' -> ' >/dev/null; then \ link=`cd $(DESTDIR)$(localedir)/$$lang && LC_ALL=C ls -l -d $$lc | sed -e 's/^.* -> //'`; \ mv $(DESTDIR)$(localedir)/$$lang/$$lc $(DESTDIR)$(localedir)/$$lang/$$lc.old; \ mkdir $(DESTDIR)$(localedir)/$$lang/$$lc; \ (cd $(DESTDIR)$(localedir)/$$lang/$$lc.old && \ for file in *; do \ if test -f $$file; then \ ln -s ../$$link/$$file $(DESTDIR)$(localedir)/$$lang/$$lc/$$file; \ fi; \ done); \ rm -f $(DESTDIR)$(localedir)/$$lang/$$lc.old; \ else \ if test -d $(DESTDIR)$(localedir)/$$lang/$$lc; then \ :; \ else \ rm -f $(DESTDIR)$(localedir)/$$lang/$$lc; \ mkdir $(DESTDIR)$(localedir)/$$lang/$$lc; \ fi; \ fi; \ rm -f $(DESTDIR)$(localedir)/$$lang/$$lc/$(DOMAIN).mo; \ ln -s ../LC_MESSAGES/$(DOMAIN).mo $(DESTDIR)$(localedir)/$$lang/$$lc/$(DOMAIN).mo 2>/dev/null || \ ln $(DESTDIR)$(localedir)/$$lang/LC_MESSAGES/$(DOMAIN).mo $(DESTDIR)$(localedir)/$$lang/$$lc/$(DOMAIN).mo 2>/dev/null || \ cp -p $(DESTDIR)$(localedir)/$$lang/LC_MESSAGES/$(DOMAIN).mo $(DESTDIR)$(localedir)/$$lang/$$lc/$(DOMAIN).mo; \ echo "installing $$realcat link as $(DESTDIR)$(localedir)/$$lang/$$lc/$(DOMAIN).mo"; \ fi; \ done; \ done install-strip: install installdirs: installdirs-exec installdirs-data installdirs-exec: installdirs-data: installdirs-data-@USE_NLS@ if test "$(PACKAGE)" = "gettext-tools"; then \ $(mkdir_p) $(DESTDIR)$(gettextsrcdir); \ else \ : ; \ fi installdirs-data-no: installdirs-data-yes: $(mkdir_p) $(DESTDIR)$(datadir) @catalogs='$(CATALOGS)'; \ for cat in $$catalogs; do \ cat=`basename $$cat`; \ lang=`echo $$cat | sed -e 's/\.gmo$$//'`; \ dir=$(localedir)/$$lang/LC_MESSAGES; \ $(mkdir_p) $(DESTDIR)$$dir; \ for lc in '' $(EXTRA_LOCALE_CATEGORIES); do \ if test -n "$$lc"; then \ if (cd $(DESTDIR)$(localedir)/$$lang && LC_ALL=C ls -l -d $$lc 2>/dev/null) | grep ' -> ' >/dev/null; then \ link=`cd $(DESTDIR)$(localedir)/$$lang && LC_ALL=C ls -l -d $$lc | sed -e 's/^.* -> //'`; \ mv $(DESTDIR)$(localedir)/$$lang/$$lc $(DESTDIR)$(localedir)/$$lang/$$lc.old; \ mkdir $(DESTDIR)$(localedir)/$$lang/$$lc; \ (cd $(DESTDIR)$(localedir)/$$lang/$$lc.old && \ for file in *; do \ if test -f $$file; then \ ln -s ../$$link/$$file $(DESTDIR)$(localedir)/$$lang/$$lc/$$file; \ fi; \ done); \ rm -f $(DESTDIR)$(localedir)/$$lang/$$lc.old; \ else \ if test -d $(DESTDIR)$(localedir)/$$lang/$$lc; then \ :; \ else \ rm -f $(DESTDIR)$(localedir)/$$lang/$$lc; \ mkdir $(DESTDIR)$(localedir)/$$lang/$$lc; \ fi; \ fi; \ fi; \ done; \ done # Define this as empty until I found a useful application. installcheck: uninstall: uninstall-exec uninstall-data uninstall-exec: uninstall-data: uninstall-data-@USE_NLS@ if test "$(PACKAGE)" = "gettext-tools"; then \ for file in $(DISTFILES.common) Makevars.template; do \ rm -f $(DESTDIR)$(gettextsrcdir)/$$file; \ done; \ else \ : ; \ fi uninstall-data-no: uninstall-data-yes: catalogs='$(CATALOGS)'; \ for cat in $$catalogs; do \ cat=`basename $$cat`; \ lang=`echo $$cat | sed -e 's/\.gmo$$//'`; \ for lc in LC_MESSAGES $(EXTRA_LOCALE_CATEGORIES); do \ rm -f $(DESTDIR)$(localedir)/$$lang/$$lc/$(DOMAIN).mo; \ done; \ done check: all info dvi ps pdf html tags TAGS ctags CTAGS ID: mostlyclean: rm -f remove-potcdate.sed rm -f stamp-poT rm -f core core.* $(DOMAIN).po $(DOMAIN).1po $(DOMAIN).2po *.new.po rm -fr *.o clean: mostlyclean distclean: clean rm -f Makefile Makefile.in POTFILES *.mo maintainer-clean: distclean @echo "This command is intended for maintainers to use;" @echo "it deletes files that may require special tools to rebuild." rm -f stamp-po $(GMOFILES) distdir = $(top_builddir)/$(PACKAGE)-$(VERSION)/$(subdir) dist distdir: $(MAKE) update-po @$(MAKE) dist2 # This is a separate target because 'update-po' must be executed before. dist2: stamp-po $(DISTFILES) dists="$(DISTFILES)"; \ if test "$(PACKAGE)" = "gettext-tools"; then \ dists="$$dists Makevars.template"; \ fi; \ if test -f $(srcdir)/$(DOMAIN).pot; then \ dists="$$dists $(DOMAIN).pot stamp-po"; \ fi; \ if test -f $(srcdir)/ChangeLog; then \ dists="$$dists ChangeLog"; \ fi; \ for i in 0 1 2 3 4 5 6 7 8 9; do \ if test -f $(srcdir)/ChangeLog.$$i; then \ dists="$$dists ChangeLog.$$i"; \ fi; \ done; \ if test -f $(srcdir)/LINGUAS; then dists="$$dists LINGUAS"; fi; \ for file in $$dists; do \ if test -f $$file; then \ cp -p $$file $(distdir) || exit 1; \ else \ cp -p $(srcdir)/$$file $(distdir) || exit 1; \ fi; \ done update-po: Makefile $(MAKE) $(DOMAIN).pot-update test -z "$(UPDATEPOFILES)" || $(MAKE) $(UPDATEPOFILES) $(MAKE) update-gmo # General rule for creating PO files. .nop.po-create: @lang=`echo $@ | sed -e 's/\.po-create$$//'`; \ echo "File $$lang.po does not exist. If you are a translator, you can create it through 'msginit'." 1>&2; \ exit 1 # General rule for updating PO files. .nop.po-update: @lang=`echo $@ | sed -e 's/\.po-update$$//'`; \ if test "$(PACKAGE)" = "gettext-tools"; then PATH=`pwd`/../src:$$PATH; fi; \ tmpdir=`pwd`; \ echo "$$lang:"; \ test "$(srcdir)" = . && cdcmd="" || cdcmd="cd $(srcdir) && "; \ echo "$${cdcmd}$(MSGMERGE) $$lang.po $(DOMAIN).pot -o $$lang.new.po"; \ cd $(srcdir); \ if $(MSGMERGE) $$lang.po $(DOMAIN).pot -o $$tmpdir/$$lang.new.po; then \ if cmp $$lang.po $$tmpdir/$$lang.new.po >/dev/null 2>&1; then \ rm -f $$tmpdir/$$lang.new.po; \ else \ if mv -f $$tmpdir/$$lang.new.po $$lang.po; then \ :; \ else \ echo "msgmerge for $$lang.po failed: cannot move $$tmpdir/$$lang.new.po to $$lang.po" 1>&2; \ exit 1; \ fi; \ fi; \ else \ echo "msgmerge for $$lang.po failed!" 1>&2; \ rm -f $$tmpdir/$$lang.new.po; \ fi $(DUMMYPOFILES): update-gmo: Makefile $(GMOFILES) @: Makefile: Makefile.in.in Makevars $(top_builddir)/config.status @POMAKEFILEDEPS@ cd $(top_builddir) \ && $(SHELL) ./config.status $(subdir)/$@.in po-directories force: # Tell versions [3.59,3.63) of GNU make not to export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: cryptmount-5.2/po/Makevars0000644000175000017500000000042711216245452012644 00000000000000# Makefile variables for PO directory in any package using GNU gettext. DOMAIN = $(PACKAGE) subdir = po top_builddir = .. XGETTEXT_OPTIONS = --keyword=_ --keyword=N_ COPYRIGHT_HOLDER = RW Penney MSGID_BUGS_ADDRESS = rwpenney@users.sourceforge.net EXTRA_LOCALE_CATEGORIES = cryptmount-5.2/po/fr.gmo0000644000175000017500000003421012613124602012253 00000000000000Þ•m„•ì@ @A 0‚ &³ 3Ú ( <7 t *• "À ã ·ü 2´ &ç " 01 b  › ´ $Ô -ù ' (E n .€ =¯ í  $ $E0j@›UÜ.2Ça-) W$x !¾&à#+/Jz˜·Ó,ï+8H"1¤,ÖFaJ¬'Ã%ë-1+_‹$¨Í ç'0OeŸ¾Þ&ñH.a6#ÇëAý-?*m˜#¸!ܲþ±2?sr5戥f¶:-X%†#¬=Ð@DO-”DÂ.6;>E§IMñ8? -x A¦ (è 6!%H!5n!)¤!Î!ßë!EË"-#0?#Hp#'¹#$á#,$ 3$&T$7{$³$;Ñ$ %&'%5N%%„%ª%.Ã%+ò%?&K^&rª&7'öU'5L(-‚(0°((á(/ ).:),i)&–)C½)/*,1*&^*'…*7­*5å*:+*V+-+>¯+?î+].,Œ,3¢,;Ö,*-4=->r-(±-1Ú-' .'4.'\.&„.«..À.4ï.2$/-W/'…/­/OÍ/>0C\08 0Ù09ì0%&1L1l1$‹1"°1µÓ1¢‰2*,3{W3-Ó3x48z4V³5& 6=16$o6"”6P·6\7We7-½7Oë72;8 n8y8}8„8CNQ 5l^ POFc>@iG?%Ib*'E/Y3WJ_!4)&d\=XK 9g]ABeUm"6SL[hk0M(aV+;17$2fR-Z #:T`8Hj D<,. - Adding an extra entry ("${TargetName}") in ${CM_CFGDIR}/cmtab - Creating a ${fs_size}MB file, "${crypto_dev}" - Creating a key-file ("${key_file}") - Creating an ext3 filingsystem on "${crypto_dev}" - Creating the directory "${mount_dir}" - Overwriting the backup configuration-file "${bckp_cmtab}"${fs_size} is not a valid number${mount_dir} is not a valid directory name%-16s [to mount on "%s" as "%s"] Abandoning $ProgName ...Access to your encrypted filesystem is protected by a key that is kept in a separate small file. The key is locked by a password that you must enter whenever you mount the filesystem.After you have finished using the filesystem, try:Are you sure? (Type "%s" to proceed): Backup of previous key is in "%s" Bad device type (%x) for "%s" (need block/file) Bad device-mapper start/lengthBad file-descriptor (%d) Bad key-length parameterBad keyfile format (libgcrypt) Bad keyfile format (openssl-compat) Cannot find key-manager to match target "%s" Cannot open "%s" for writing Cannot open device "%s" for target "%s" Cannot stat "%s" Checksum mismatch in keyfile (gcry, %x != %x) Checksum mismatch in keyfile (openssl-compat, ofs=%u,idx=%u) Configuration error near %s:%d Confirm password: Couldn't find libgcrypt cipher "%s" Couldn't find libgcrypt digest "%s" Creating filesystem container (${crypto_dev})...Crypto-swap is not supported by this installation of cryptmount Device "%s" appears to contain data (entropy=%.3g,%.3g) - please run mkswap manually Device-mapper target-creation failed for "%s" Each cryptmount filesystem is identifed by a short name which is used when mounting or configuring that filesystem. This name should be a single word (without spaces), such as "${DefaultTargetName}".Enter a filename for your encrypted containerEnter a location for the keyfileEnter new password for target "%s": Enter password for target "%s": Enter the filesystem size (in MB)Failed to create LUKS header for "%s" Failed to create LUKS key for "%s" Failed to create new key file Failed to extract LUKS key for "%s" (errno=%d) Failed to extract cipher key Failed to free device (%d,%d) Failed to generate new key Failed to get size of "%s" Failed to open keyfile "%s" for target "%s" Failed to remove device-mapper target "%s" Formatting "%s", will probably destroy all existing dataFormatting encrypted filesystem...Generating filesystem access key (${key_file})...Generating random key; please be patient... If you do not wish to proceed, no changes will be made to your system.In order to access the ${TargetName} filesystem, it must be mounted on top of an empty directory.Installation abandonedInstallation of new keyfile "%s" failedInstalling new key (%s -> %s) failed Key-extraction failed for "%s" Key-file "%s" already exists for target "%s" Key-file for "%s" isn't password-protected Key-writing failed for "%s" Making mount-point (${mount_dir})...Memory-locking failed... Missing keyfile for target "%s" Missing output keyfile for target "%s" No available loopback devices No targets specified Only "%s" can unmount "%s" Only root can configure "%s" Only root can use option "%s" Only user-%lu can unmount "%s" Password mismatch Password mismatch when extracting key Please confirm that you want to proceed (enter "${AffirmativeResponse}")Please enter a target name for your filesystemPlease specify where "${TargetName}" should be mountedRetiring old key (%s -> %s) failed Security failure Taking backup of cryptmount master config-file (${bckp_cmtab})...Target "%s" does not appear to be configured Target "%s" does not appear to be mounted Target "%s" is already mounted Target name "%s" is not recognized Target security failure for "%s" The ${TargetName} filesystem can be configured to be owned by a nominated user, who will be able to create top-level files & directories without needing to involve the superuser.The actual encrypted filesystem will be stored in a special file, which needs to be large enough to contain your entire encrypted filesystem.The following target names have already been used:The maximum available size of your filesystem needs to be chosen so that enough space can be reserved on your disk.The target-name "${TargetName}" has already been usedThis is free software, and you are welcome to redistribute it under certain conditions - see the file 'COPYING' in the source directory.This program will allow you to setup a secure filing-system that will be managed by "cryptmount". You will be able to select basic features such as the location and size of the filesystem - if you want more advanced features, you should consult the cryptmount manual page.This script must be run with superuser privileges - please try again, e.g. using one of the following:Trailing command-line arguments given with '--all' option Unsuitable filesystem type "%s" for swapping WARNING: ${crypto_dev} already existsWARNING: ${key_file} already existsWhich user should own the filesystem (leave blank for "root")Your filing system is now ready to be built - this will involve:Your new encrypted filesystem is now ready for use - to access, try:cryptmount comes with ABSOLUTELY NO WARRANTY.cryptmount: please replace "fsoptions" with "mountoptions" in cmtab cryptmount: unrecognized option "%s" in cmtab donenoopaqueyesProject-Id-Version: cryptmount 4.0-1 Report-Msgid-Bugs-To: rwpenney@users.sourceforge.net POT-Creation-Date: 2015-10-25 05:25+0000 PO-Revision-Date: 2006-04-21 07:51+0100 Last-Translator: RW Penney Language-Team: French Language: fr MIME-Version: 1.0 Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 8bit Plural-Forms: nplurals=2; plural=(n > 1); - Ajout d'une cible supplémentaire ("${TargetName}") dans ${CM_CFGDIR}/cmtab - Création d'un fichier "${crypto_dev}" de ${fs_size}MO - Création d'un fichier-clef ("${key_file}") - Construction d'un système de fichiers ext3 sur "${crypto_dev}" - Création du répertoire "${mount_dir}" - Écrasement le fichier de sauvegarde "${bckp_cmtab}"${fs_size} n'est pas un numero valideLe nom ${mount_dir} n'est pas valide comme répertoire%-16s [pour monter sur "%s" comme "%s"] $ProgName va se terminer ...L'accès à votre système de fichiers chiffré est protégé par une clef qui est contenue dans son même petit fichier. Pour acceder à cette clef, on doit donner un mot de passe chaque fois que l'on monte le système de fichiers.Lorsque vous avez terminé d'utiliser le système de fichiers, essayez:Etes vous sûr? (Tappez "%s" pour continuer): Une sauvegarde de l'ancienne clef est dans "%s" Mauvais type (%x) du périphérique pour "%s" (on a besoin du block/file) Mauvais debut/taille pour device-mapperMaivais descripteur de fichier (%d) Mauvaise paramètre pour la taille de la clefMauvais fichier-clef (libcrypt) Mauvais fichier-clef (openssl-compat) Ne peut pas trouver un diriger-clef pour la cible "%s" Ne pas pouvoir ecrire à "%s" Ne peut pas ouvrir le périphérique "%s" pour la cible "%s" Ne pas pouvoir stat "%s" Mauvais fichier-clef (gcry, %x != %x) Mauvais fichier-clef (openssl-compat, ofs=%u,idx=%u) Echec de configuration près de %s:%d Confirmez mot de passe: Chiffre "%s" n'est pas reconnu dans libgcrypt Hash "%s" n'est pas reconnu dans libgcrypt Création du conteneur du système de fichiers (${crypto_dev})...Pagination chiffrée n'est pas possible avec cet installation de cryptmount Périphérique "%s" semble contenir des données valable (entropy=%.3g,%.3g) - veuillez utiliser mkswap manuellement Création de la cible device-mapper pour "%s" a echouée Chaque système de fichiers dirigé par cryptmount est appelé par un nom court qu'on utilise pendant le montage ou la configuration de cette système de fichiers. Ce nom doit être un seul mot (sans espaces), comme par exemple "${DefaultTargetName}".Donnez un nom de fichier pour votre conteneur chiffréDonnez un nom de fichier pour le fichier-clefDonnez nouveau mot de passe pour la cible "%s": Donnez mot de passe pour la cible "%s": Donnez la taille du système de fichiers (en MO)Génération d'en-tête LUKS pour "%s" a echouée Génération de clef LUKS pour "%s" a echouée Génération de nouvelle clef a echouée Extraction de la clef LUKS a echouée pour la cible "%s" (errno=%d) Extraction de la clef de déchiffrage a echouée Dégagement du périphérique (%d,%d) a echoué Génération de nouvelle clef a echouée Mesurage de la taille du "%s" a echoué Ouverture du fichier "%s" pour la cible "%s" a echouée Destruction de la cible device-mapper "%s" a echouée Formatage de "%s" va detruire tous donnés sur ce conteneurFormatage du système de fichier chiffré...Construction du fichier-clef (${key_file})...Veuillez attendre pendant la création d'une clef aléatoire... Si vous ne voulez pas continuer, votre système ne changera pas.Pour acceder le système de fichiers ${TargetName}, il doit être monté sur un répertoire vide.Installation terminéeInstallation de novelle fichier-clef "%s" a echouéeInstallation de nouvelle fichier-clef (%s -> %s) a echouée Extraction de la clef pour "%s" a echouée Le fichier-clef "%s" existe déjà pour la cible "%s" Le fichier-clef pour "%s" n'est pas protèger par mot de passe Ecriture de la clef pour "%s" a echouée Réalisation du point de montage (${mount_dir})...Verrouillage de la memoire a echoué... Pas de fichier-clef pour la cible "%s" Pas de fichier-clef pour la cible "%s" Il n'y a aucun périph-loop disponible Pas de cible donnée Seulement utilisateur "%s" peut démonter "%s" Seulement le super-utilisateur peut configurer "%s" Seulement le super-utilisateur peut utiliser "%s" Seulement utilisateur-%lu peut démonter "%s" Les deux mots de passe sont differents Mot de passe n'est pas verifié Veuillez confirmer que vous voulez continuer (écrivez "${AffirmativeResponse}")Veuillez donnez un nom de cible pour votre système de fichiersDonner le nom d'un répertoire sur lequel "${TargetName}" sera montéRetraitment de vielle fichier-clef (%s -> %s) a echouée Echec de securité Sauvegarde du fichier de configuration (${bckp_cmtab})...La cible "%s" n'a pas été configurée La cible "%s" n'est pas montée La cible "%s" est déjà montée Nom de cible "%s" n'est pas reconnu Echec de securité pour cible "%s" Il est possible de donner possession du ${TargetName} à un utilisateur specifique pour que cet utilisateur puisse créer des fichiers et répertoires sans besoin du super-utilisateur.Le système de fichiers chiffré sera contenu dans un fichier special, qui doit être d'une taille suffisament grande pour contenir votre système de fichiers entier.Les noms de cible suivants sont déjà pris:La taille maximale de votre système de fichiers doit être choisie pour qu'assez d'espace soit reservé sur votre disque dur.Le nom de cible "${TargetName}" est déjà prisCe paquet est un logiciel libre - les termes de sa licence sont décrits dans le fichier 'COPYING' dans le paquet source.Ce progamme vous permettra de construire un système de fichiers chiffré qui sera dirigé par «cryptmount». Vous pourrez selectioner quelques options basiques, telle que la location et la taille du système de fichiers. Si vous avez besoin de particularités plus avancées, il faut lire la page manuel de cryptmount.Ce script est seulement pour le super-utilisateur - veuillez essayer avec par exemple:Arguments donnés après option '--all' Mauvaise type de système de fichiers "%s" pour la pagination ATTENTION: ${crypto_dev} existe déjàATTENTION: ${key_file} existe déjàQuel utilisateur doit posseder le système de fichiers (laissez vide pour "root")Maintenant, votre système de fichiers est prêt à être construit, selon les étapes suivantes:Votre nouveau système de fichiers chiffré est prêt - pour l'utiliser, veuillez essayer:cryptmount n'est fourni avec aucune garantie.cryptmount: veillez remplacer "fsoptions" avec "mountoptions" dans votre cmtab cryptmount: mauvaise option "%s" dans votre cmtab terminé(e)nonsecretouicryptmount-5.2/cryptmount.h0000644000175000017500000001137012612065505013126 00000000000000/* * General declarations for cryptmount * (C)Copyright 2005-2015, RW Penney */ /* This file is part of cryptmount cryptmount is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. cryptmount is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. */ #ifndef _CRYPTMOUNT_H #define _CRYPTMOUNT_H #include #if HAVE_INTTYPES_H # include #else # if HAVE_STDINT_H # include # else typedef unsigned short uint8_t; typedef long int32_t; typedef unsigned long uint32_t; typedef long long int64_t; typedef unsigned long long uint64_t; # endif # define PRId64 "lld" # define SCNi64 "lli" #endif #ifdef HAVE_GETTEXT # include # include # define _(String) gettext(String) # define gettext_noop(String) String # define N_(String) gettext_noop(String) #else # define _(String) (String) # define N_(String) String # define textdomain(Domain) /* empty */ # define bindtextdomain(Package, Directory) /* empty */ #endif enum /*! Exit-codes */ { EXIT_OK = 0, EXIT_BADOPT = 1, EXIT_BADTGT = 2, EXIT_BADEXEC = 3, EXIT_PRIV = 100, EXIT_INSECURE = 101 }; enum /*! Error flags */ { ERR_NOERROR = 0, WRN_UNCONFIG, WRN_NOPASSWD, WRN_LOWENTROPY, ERR_threshold = 0x10, /*!< Dividing-line between warnings & errors */ ERR_NOTSUPPORTED, ERR_BADKEYFORMAT, ERR_BADALGORITHM, ERR_BADFILE, /*!< Serious problem with accessing file */ ERR_BADDECRYPT, /*!< Failure to extract cipher key from file */ ERR_BADENCRYPT, ERR_MEMSPACE, ERR_DMSETUP, ERR_BADDEVICE, ERR_BADIOCTL, ERR_BADSUID, ERR_BADPRIV, ERR_BADMOUNT, ERR_BADFSCK, ERR_BADSWAP, ERR_INSECURE, ERR_BADPASSWD, ERR_BADPARAM, ERR_BADMUTEX, ERR_ABORT }; enum /*! Target configuration switches */ { FLG_USER = 0x0001, FLG_FSCK = 0x0002, FLG_MKSWAP = 0x0004, FLG_TRIM = 0x0008, /*!< trim/allow-discards on SSD writes */ FLG_BOOT_MASK = 0xf000, FLG_BOOT_MOUNT = 0x1000, FLG_BOOT_SWAP = 0x2000, FLG_BOOT_PREP = 0x3000, FLG_DEFAULTS = FLG_USER | FLG_FSCK }; /*! @brief Information about the access key for an encrypted filesystem * * Depending on the choice of key-manager, this will either describe * a separate key-file, or a header within the encrypted fileystem itself. * * \see keymanager_t, tgtdefn_t */ typedef struct keyinfo { const char *format; /*!< Type of key file, e.g. 'raw', 'libgcrypt' */ char *filename; char *digestalg; char *cipheralg; long maxlen; /*!< Maximum number of bytes to read from keyfile */ unsigned retries; /*!< Limit on password-entry attempts */ } keyinfo_t; /*! @brief Description of an available encrypted filesystem or device. * * This is typically extracted from a configuration file, containing * details of its name, underlying device, encryption type etc. * This structure can be used to form a linked-list of * cryptmount filesystem-targets. * * \see parse_config(). */ typedef struct tgtdefn { const char *ident; /*!< Unique identifying name */ unsigned flags; /*!< Configuration switches */ char *dev; /*!< Device node or raw file */ int64_t start, length; /*!< Starting sector + num of sectors (or 0, -1) */ char *dir; /*!< Mount-point */ char *fstype; /*!< Filesystem type */ char *mountoptions; /*!< Options passed to 'mount' command */ char *fsckoptions; /*!< Options passed to 'fsck' command */ char *loopdev; /*!< Loopback device to wrap around raw file */ char *supath; /*!< PATH to setup for commands run as root */ char *cipher; /*!< Cipher used on filesystem */ int64_t ivoffset; /*!< Cipher initialization-vector offset */ keyinfo_t key; /*!< Location/format of key */ struct tgtdefn *nx; /*!< Form into linked list */ } tgtdefn_t; #endif /* _CRYPTMOUNT_H */ /* * (C)Copyright 2005-2015, RW Penney */ cryptmount-5.2/ToDo0000644000175000017500000000071412612065252011320 00000000000000* document libgcrypt/libcryptsetup compatibility issues * remove support for legacy /dev/loop/0 device nodes * add legacy loop-aes support * migrate unit-testing suite to CUnit * investigate libcap as alternative to setuid * add option for ingesting key-material via command-line * run tests on 64-bit big-endian machines (e.g. sparc64) * extend tests on --safetynet option * integrate with SELinux * add 'verbose' option? * key-cache for multiple operations? cryptmount-5.2/README0000644000175000017500000001553412612065221011412 00000000000000This directory contains cryptmount, a utility for user-level mounting of encrypted filing systems under GNU/Linux. cryptmount is Copyright (c) 2005-2015 RW Penney, and is issued under the General Public License (GPL) version-2 ***** IMPORTANT NOTE: cryptmount is supplied with NO WARRANTY of any form - please see the file 'COPYING' for more information. Introduction ============ cryptmount allows any user to access encrypted filing systems on demand under GNU/Linux systems running at least a 2.6-series kernel. It also assists the system administrator in creating and managing encrypted filesystems based on the kernel's dm-crypt device-mapper target. After initial configuration by the superuser, an ordinary user can mount or unmount filesystems managed by cryptmount solely by providing the decryption password, with any system devices needed to access the filing system being configured automatically. A wide variety of encryption schemes (provided by the kernel and the libgcrypt library) can be used to protect both the filing system and the access key. The protected filing systems can reside in either ordinary files, or disk partitions. Installation ============ To build cryptmount from source, please follow the instructions in the file 'INSTALL' in the same directory as this file. You will need the following packages (including 'developer' add-ons) installed to successfully build and use cryptmount: kernel-headers (preferably for a 2.6-series kernel) libdevmapper (e.g. version 1.02 or later) The following packages are optional, and allow a wider choice of protection schemes for the keyfiles which govern access to the protected filesystems: libcryptsetup (version 1.6 or later) libgcrypt (e.g. version 1.6.0 or later) You will also need to ensure that your system has support for the loopback and device-mapper devices, which may require loading of kernel modules when you first use cryptmount, e.g. modprobe -a loop dm-crypt This is automatically performed on system reboot by setup scripts supplied with cryptmount. cryptmount has been tested (using the "mudslinger" script in the 'testing' sub-directory) on a variety of GNU/Linux platforms including: Debian 8.0, Ubuntu 15.04, Fedora 21, SuSE 13.2 etc. For the most recent version of cryptmount, please see http://www.sourceforge.net/projects/cryptmount Configuration & usage ===================== An encrypted filing system must initially be created by the superuser. A basic setup can be created interactively by running the 'cryptmount-setup' program, which is typically installed in /usr/local/sbin/ . If you wish to use more sophisticated setup options, the setup process will depend more on the details of the host system and the encryption algorithms available to the kernel. The following is an example based on housing a 128Mb AES-encrypted filing system in an ordinary file ("/home/crypt.fs") which will be mounted below /mnt/crypt, and where the 256-bit decryption key is protected by the builtin SHA1/Blowfish encryption engine. First create a configuration file (by default "/usr/local/etc/cryptmount/cmtab") that describes the encrypted filing system that we are about to create, containing: crypt { dev=/home/crypt.fs dir=/mnt/crypt fstype=ext2 mountoptions=defaults cipher=aes keyfile=/usr/local/etc/cryptmount/crypt.key keyformat=builtin } Then prepare the key-file and filing system as follows: cryptmount --generate-key 32 crypt dd if=/dev/zero of=/home/crypt.fs bs=1M count=128 mkdir /mnt/crypt cryptmount --prepare crypt mke2fs /dev/mapper/crypt cryptmount --release crypt A very similar process can be used to setup an encrypted filing system using a raw disk partition in place of a loopback file. Thereafter, all information about the encrypted filing systems available for mounting with cryptmount is contained in /usr/local/etc/cryptmount/cmtab . So, the following command, executed by an ordinary user, will make the filing system accessible below /mnt/crypt: cryptmount crypt and the following will unmount it: cryptmount -u crypt Please take great care that you do not delete or corrupt the key-file, as this will make access to your filesystem (essentially) impossible. You are strongly advised to consider keeping a backup copy of the key-file. Configuring filesystems at system bootup ======================================== If you want to have encrypted filesystems setup at system boot-up, this can be achieved using either 'systemd' or the supplied 'initscript' program which is normally automatically installed as /etc/init.d/cryptmount . Both of these mechanisms use the 'bootaction' parameter within /usr/local/etc/cryptmount/cmtab to adjust how each filesystem is handled on system bootup. If using the 'initscript' program, you may need to create symbolic links from /etc/rc?.d to /etc/init.d/cryptmount (in a way that depends on the precise details of your distribution), with something like 'update-rc.d cryptmount defaults 28' being suitable under Debian systems. Common problems =============== When configuring the system devices needed to support an encrypted filesystem, cryptmount will issue various requests through the device-mapper library. Unfortunately, many of the error messages issued by that library (as of version 1.02) are not easy to interpret. In situations where the device-mapper is compiled as a kernel module, an error of the form /proc/misc: No entry for device-mapper found Is device-mapper driver missing from kernel? Failure to communicate with kernel device-mapper driver. then this may indicate that the dm-mod kernel-module is not loaded. This can be (temporarily) solved by issuing the command: modprobe -a dm-mod dm-crypt as root (or 'sudo modprobe ...'). In order to ensure that this happens automatically when you reboot, you can add a line containing "dm-mod" to /etc/modules, or add a line of the form modprobe -q -a dm-mod dm-crypt || true to /etc/rc.local, or ensure that the cryptmount-startup scripts installed in /etc/init.d are run on system startup (e.g. by installing suitable symbolic-links from /etc/rc*.d). When setting up a new encrypted filing system, typically when issuing a 'cryptmount --prepare' command, you may receive an error message of the form device-mapper ioctl cmd 9 failed: Invalid argument which may mean that you have chosen a key-size that isn't supported by your chosen cipher algorithm. You can get some information about suitable key-sizes by checking the output from 'more /proc/crypto', and looking at the 'min keysize' and 'max keysize' fields.) Suggestions/Patches =================== You are welcome to send constructive suggestions and bug-fixes to the author: rwpenney@users.sourceforge.net Any feedback (including the associated log-file) from running the "mudslinger" tests on any systems not listed above would be particularly helpful. cryptmount-5.2/sysinit/0000755000175000017500000000000012613166775012325 500000000000000cryptmount-5.2/sysinit/cryptmount.service.in0000644000175000017500000000043212400360510016430 00000000000000# systemd definition for 'cryptmount' [Unit] Description=cryptmount startup After=local-fs.target [Service] Type=oneshot RemainAfterExit=yes ExecStart=@EXENAME@ --system-boot ExecStop=@EXENAME@ --system-shutdown ExecStopPost=@EXENAME@ --safetynet [Install] WantedBy=basic.target cryptmount-5.2/sysinit/setupscript.sh.in0000755000175000017500000002525012612065221015561 00000000000000#!/bin/sh # simple setup script for cryptmount # RW Penney, May 2007 # This file is part of 'cryptmount' and is therefore # supplied with NO WARRANTY of any form. # Please see the file 'COPYING' in the main cryptmount source directory # for further information. CM_BINEXE="@EXENAME@" CM_CFGDIR="@SYSCONF_DIR@" # prepare gettext internationalization: TEXTDOMAIN="@PKG_NAME@" export TEXTDOMAIN TEXTDOMAINDIR="@LCL_DIR@" export TEXTDOMAINDIR if which gettext.sh > /dev/null 2>&1; then . gettext.sh else eval_gettext() { eval "echo \"$1\""; } fi FoldLines() { # wrap text-output to fit into 70-columns, breaking on whitespace fold -s -w 70 } ToLowerCase() { # translate upper-case letters to lower-case tr '[:upper:]' '[:lower:]' } TrapCleanup() { # try to mitigate any damage if terminated prematurely ProgName="$0" eval_gettext "Abandoning \$ProgName ..."; echo exit 2 } CheckPrivileges() { if [ "`whoami`" != "root" ]; then echo "" eval_gettext "This script must be run with superuser privileges - please try again, e.g. using one of the following:" | FoldLines; echo echo " sudo $0" echo " su -c $0" echo "" exit 1 fi } SectionBreak() { echo "" case "$1" in minor) ;; major) echo "------------------------------" ;; *) echo "" ;; esac } GetResponse() { # Issue prompt string & await response from user # syntax: GetResponse echo "" echo " $1" echo -n " [$2]: " read resp if [ -z "${resp}" ]; then resp="$2" fi eval "$3=\"${resp}\"" } GuessHome() { # Try to guess user's home-directory, even after su/sudo guessed_home="${HOME}" if [ "${user_owner}" != "" ]; then eval "guessed_home=~${user_owner}" fi for tgt in "${guessed_home}" "${HOME}" "`pwd`" "/home"; do hm="`echo ${tgt}/ | sed -n -e 's%^\(/.*home/[^/]*\).*$%\1%p'`" if [ "${hm}" != "" -a -d "${hm}" ]; then guessed_home="`echo ${hm} | sed 's%/$%%'`" break fi done } CanonVars() { # Canonicalize string variables for var in $@; do eval "val=\"\$${var}\"" eval "$var=\"`echo \"${val}\" | sed 's, ,\\\\ ,g'`\"" done } GetTargetName() { DefaultTargetName=`eval_gettext "opaque"` eval_gettext "Each cryptmount filesystem is identifed by a short name which is used when mounting or configuring that filesystem. This name should be a single word (without spaces), such as \"\${DefaultTargetName}\"." | FoldLines; echo eval_gettext "The following target names have already been used:" echo -n " " tgts=`${CM_BINEXE} --list | awk '{printf"%s ", $1}'` if [ ! -z "${tgts}" ]; then echo "${tgts}"; else echo "(NONE)"; fi TargetName="" while [ -z "${TargetName}" ]; do prompt=`eval_gettext "Please enter a target name for your filesystem"` GetResponse "${prompt}" "${DefaultTargetName}" "TargetName" if ${CM_BINEXE} --list "${TargetName}" >/dev/null 2>&1; then eval_gettext "The target-name \"\${TargetName}\" has already been used" TargetName="" fi done } GetUser() { eval_gettext "The \${TargetName} filesystem can be configured to be owned by a nominated user, who will be able to create top-level files & directories without needing to involve the superuser." | FoldLines; echo prompt=`eval_gettext "Which user should own the filesystem (leave blank for \"root\")"` GetResponse "${prompt}" "" "user_owner" } GetMountPoint() { eval_gettext "In order to access the \${TargetName} filesystem, it must be mounted on top of an empty directory." | FoldLines; echo mount_dir="" while [ -z "${mount_dir}" ]; do prompt=`eval_gettext "Please specify where \"\\\${TargetName}\" should be mounted"` GetResponse "${prompt}" "${guessed_home}/crypt" "mount_dir" if [ -e "${mount_dir}" -a ! -d "${mount_dir}" ]; then eval_gettext "\${mount_dir} is not a valid directory name"; echo mount_dir="" fi done } GetContainerInfo() { eval_gettext "The maximum available size of your filesystem needs to be chosen so that enough space can be reserved on your disk." | FoldLines; echo fs_size="" while [ -z "${fs_size}" ]; do prompt=`eval_gettext "Enter the filesystem size (in MB)"` GetResponse "${prompt}" "64" "fs_size" if [ "${fs_size}" -gt 0 ] 2>/dev/null; then true else eval_gettext "\${fs_size} is not a valid number"; echo fs_size="" fi done SectionBreak eval_gettext "The actual encrypted filesystem will be stored in a special file, which needs to be large enough to contain your entire encrypted filesystem." | FoldLines; echo crypto_dev="" while [ -z "${crypto_dev}" ]; do prompt=`eval_gettext "Enter a filename for your encrypted container"` GetResponse "${prompt}" "${guessed_home}/crypto.fs" "crypto_dev" if [ -e "${crypto_dev}" ]; then eval_gettext "WARNING: \${crypto_dev} already exists"; echo crypto_dev="" fi done } GetKeyInfo() { eval_gettext "Access to your encrypted filesystem is protected by a key that is kept in a separate small file. The key is locked by a password that you must enter whenever you mount the filesystem." | FoldLines; echo key_file="" while [ -z "${key_file}" ]; do prompt=`eval_gettext "Enter a location for the keyfile"` GetResponse "${prompt}" "${CM_CFGDIR}/${TargetName}.key" "key_file" if [ -e "${key_file}" ]; then eval_gettext "WARNING: \${key_file} already exists"; echo key_file="" fi done } BuildFS() { bckp_cmtab="${CM_CFGDIR}/cmtab.bckp-setup" SectionBreak major eval_gettext "Your filing system is now ready to be built - this will involve:" | FoldLines; echo "" eval_gettext " - Creating the directory \"\${mount_dir}\""; echo eval_gettext " - Creating a \${fs_size}MB file, \"\${crypto_dev}\""; echo eval_gettext " - Adding an extra entry (\"\${TargetName}\") in \${CM_CFGDIR}/cmtab"; echo eval_gettext " - Creating a key-file (\"\${key_file}\")"; echo eval_gettext " - Creating an ext3 filingsystem on \"\${crypto_dev}\""; echo if [ -f "${bckp_cmtab}" ]; then eval_gettext " - Overwriting the backup configuration-file \"\${bckp_cmtab}\""; echo fi eval_gettext "If you do not wish to proceed, no changes will be made to your system."; echo AffirmativeResponse=`eval_gettext "yes" | ToLowerCase` NegativeResponse=`eval_gettext "no"` prompt=`eval_gettext "Please confirm that you want to proceed (enter \"\\\${AffirmativeResponse}\")"` GetResponse "${prompt}" "${NegativeResponse}" "confirm" if [ "`echo ${confirm} | ToLowerCase`" != "${AffirmativeResponse}" ]; then eval_gettext "Installation abandoned"; echo exit 1 fi Completed=`eval_gettext "done"` set -e eval_gettext "Making mount-point (\${mount_dir})..." mkdir -p "${mount_dir}" echo " ${Completed}" eval_gettext "Creating filesystem container (\${crypto_dev})..." pfx=`dirname "${crypto_dev}"` test -d "${pfx}" || mkdir -p "${pfx}" dd if=/dev/zero of="${crypto_dev}" bs=1M count="${fs_size}" >/dev/null 2>&1 echo " ${Completed}" eval_gettext "Taking backup of cryptmount master config-file (\${bckp_cmtab})..." mv "${CM_CFGDIR}/cmtab" "${bckp_cmtab}" echo " ${Completed}" cat "${bckp_cmtab}" > "${CM_CFGDIR}/cmtab" cat <> "${CM_CFGDIR}/cmtab" # Entry automatically generated by setup-script: `echo "${TargetName}" | sed 's, ,\\\\ ,g'` { dev=`echo "${crypto_dev}" | sed 's, ,\\\\ ,g'` dir=`echo "${mount_dir}" | sed 's, ,\\\\ ,g'` fstype=ext3 mountoptions=defaults cipher=aes keyformat=builtin keyfile=`echo "${key_file}" | sed 's, ,\\\\ ,g'` } EOF eval_gettext "Generating filesystem access key (\${key_file})..."; echo until ${CM_BINEXE} --generate-key 32 "${TargetName}"; do cmerrno=$? if [ ${cmerrno} -ne 33 ]; then eval_gettext "Key-generation failure (status=${cmerrno})" exit 3 fi done eval_gettext "Formatting encrypted filesystem..."; echo until ${CM_BINEXE} --prepare "${TargetName}"; do cmerrno=$? if [ ${cmerrno} -ne 21 ]; then eval_gettext "Cannot prepare device (status=${cmerrno})" exit 4 fi done mke2fs -j "/dev/mapper/${TargetName}" >/dev/null 2>&1 if [ "${user_owner}" != "" ]; then chown "${user_owner}" "${mount_dir}" "${crypto_dev}" chmod 0500 "${mount_dir}" chmod 0600 "${crypto_dev}" mount "/dev/mapper/${TargetName}" "${mount_dir}" chown "${user_owner}" "${mount_dir}" chmod 0700 "${mount_dir}" umount "${mount_dir}" fi (udevadm settle || udevsettle || sleep 5) 2>/dev/null ${CM_BINEXE} --release "${TargetName}" } # # Main program # SectionBreak major eval_gettext "cryptmount setup script"; echo; echo eval_gettext "This program will allow you to setup a secure filing-system that will be managed by \"cryptmount\". You will be able to select basic features such as the location and size of the filesystem - if you want more advanced features, you should consult the cryptmount manual page." | FoldLines; echo; echo echo "cryptmount version @PKG_VERSION@, (C)Copyright 2007-2014 RW Penney" eval_gettext "cryptmount comes with ABSOLUTELY NO WARRANTY."; echo eval_gettext "This is free software, and you are welcome to redistribute it under certain conditions - see the file 'COPYING' in the source directory." | FoldLines; echo CheckPrivileges modprobe -q -a loop dm-mod dm-crypt || true trap TrapCleanup INT QUIT HUP # Interactively gather configuration information from user: SectionBreak major GetTargetName SectionBreak GetUser GuessHome SectionBreak GetMountPoint SectionBreak GetContainerInfo SectionBreak GetKeyInfo # Build filesystem: BuildFS SectionBreak major eval_gettext "Your new encrypted filesystem is now ready for use - to access, try:" | FoldLines; echo echo " cryptmount ${TargetName}" echo " cd ${mount_dir}" eval_gettext "After you have finished using the filesystem, try:" | FoldLines; echo echo " cd" echo " cryptmount --unmount ${TargetName}" echo eval_gettext "Please take great care NOT to delete or damage your keyfile (\"${key_file}\"). Without that file, and the associated password, it will be virtually impossible to access your encrypted filesystem. You may want to keep a separate backup copy of the keyfile." | FoldLines; echo exit 0 # vim: set ts=4 sw=4 et: cryptmount-5.2/sysinit/modules-load.conf0000644000175000017500000000006412400360510015452 00000000000000# Kernel modules needed by cryptmount dm-crypt loop cryptmount-5.2/sysinit/Makefile.am0000644000175000017500000000340312612065221014260 00000000000000# automake script for cryptmount system-startup mechanisms # RW Penney, April 2013 EXTRA_DIST = cryptmount.service.in modules-load.conf \ setupscript.sh.in initscript.in scripttransform='s,@EXENAME@,$(bindir)/cryptmount$(EXEEXT),g; \ s,@SYSCONF_DIR@,$(CM_SYSCONF_DIR),g; \ s,@PKG_NAME@,$(PACKAGE_NAME),g; \ s,@PKG_VERSION@,$(VERSION),g; \ s,@LCL_DIR@,$(localedir),g' initscript: initscript.in sed ${scripttransform} $< > $@ cryptmount.service: cryptmount.service.in sed ${scripttransform} $< > $@ setupscript: setupscript.sh.in sed ${scripttransform} $< > $@ install-exec-hook: install-inits install-setup install-inits: cryptmount.service initscript if USE_SYSTEMD test -d "${DESTDIR}/usr/lib/systemd/system" || ${mkdir_p} "${DESTDIR}/usr/lib/systemd/system" endif # USE_SYSTEMD if test -d "${DESTDIR}/usr/lib/systemd/system" ; then \ ${INSTALL_PROGRAM_ENV} ${INSTALL_DATA} cryptmount.service "${DESTDIR}/usr/lib/systemd/system"; \ fi test -d "${DESTDIR}/etc/modules-load.d" || ${mkdir_p} "${DESTDIR}/etc/modules-load.d" ${INSTALL_PROGRAM_ENV} ${INSTALL_DATA} modules-load.conf "${DESTDIR}/etc/modules-load.d/cryptmount.conf"; if !USE_SYSTEMD test -d "${DESTDIR}/etc/init.d" -o -d "${DESTDIR}/etc/rc.d/init.d" || ${mkdir_p} "${DESTDIR}/etc/init.d" for initdir in /etc/init.d /etc/rc.d/init.d; do \ if test -d "${DESTDIR}$${initdir}" ; then \ ${INSTALL_PROGRAM_ENV} ${INSTALL_SCRIPT} initscript "${DESTDIR}$${initdir}/cryptmount" ; \ break; \ fi; \ done endif # !USE_SYSTEMD install-setup: setupscript test -d "${DESTDIR}${sbindir}" || ${mkdir_p} "${DESTDIR}${sbindir}" ${INSTALL_PROGRAM_ENV} ${INSTALL_SCRIPT} setupscript "${DESTDIR}${sbindir}/cryptmount-setup" clean-local: -rm -f cryptmount.service initscript setupscript cryptmount-5.2/sysinit/Makefile.in0000644000175000017500000003347512613124571014312 00000000000000# Makefile.in generated by automake 1.14.1 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2013 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ # automake script for cryptmount system-startup mechanisms # RW Penney, April 2013 VPATH = @srcdir@ am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)' am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ subdir = sysinit DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \ $(top_srcdir)/mkinstalldirs ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = depcomp = am__depfiles_maybe = SOURCES = DIST_SOURCES = am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CFLAGS = @CFLAGS@ CM_DEFAULT_CIPHER = @CM_DEFAULT_CIPHER@ CM_DEFAULT_SUPATH = @CM_DEFAULT_SUPATH@ CM_SYSCONF_DIR = @CM_SYSCONF_DIR@ CM_SYSRUN_DIR = @CM_SYSRUN_DIR@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DOXYGEN_DOCDIR = @DOXYGEN_DOCDIR@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ ERSATZ_MOUNT = @ERSATZ_MOUNT@ ERSATZ_UMOUNT = @ERSATZ_UMOUNT@ EXEEXT = @EXEEXT@ GETTEXT_MACRO_VERSION = @GETTEXT_MACRO_VERSION@ GMSGFMT = @GMSGFMT@ GMSGFMT_015 = @GMSGFMT_015@ GREP = @GREP@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ INTLLIBS = @INTLLIBS@ INTL_MACOSX_LIBS = @INTL_MACOSX_LIBS@ LDFLAGS = @LDFLAGS@ LIBICONV = @LIBICONV@ LIBINTL = @LIBINTL@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBS_GCRY = @LIBS_GCRY@ LIBS_LUKS = @LIBS_LUKS@ LTLIBICONV = @LTLIBICONV@ LTLIBINTL = @LTLIBINTL@ LTLIBOBJS = @LTLIBOBJS@ MAKEINFO = @MAKEINFO@ MKDIR_P = @MKDIR_P@ MSGFMT = @MSGFMT@ MSGFMT_015 = @MSGFMT_015@ MSGMERGE = @MSGMERGE@ OBJEXT = @OBJEXT@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_FSCK = @PATH_FSCK@ PATH_MKSWAP = @PATH_MKSWAP@ PATH_MOUNT = @PATH_MOUNT@ PATH_SEPARATOR = @PATH_SEPARATOR@ PATH_UMOUNT = @PATH_UMOUNT@ PKG_CONFIG = @PKG_CONFIG@ PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ POSUB = @POSUB@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ USE_NLS = @USE_NLS@ VERSION = @VERSION@ WITH_CSWAP = @WITH_CSWAP@ WITH_FSCK = @WITH_FSCK@ XGETTEXT = @XGETTEXT@ XGETTEXT_015 = @XGETTEXT_015@ XGETTEXT_EXTRA_OPTIONS = @XGETTEXT_EXTRA_OPTIONS@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_CC = @ac_ct_CC@ am__leading_dot = @am__leading_dot@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libcryptsetup_CFLAGS = @libcryptsetup_CFLAGS@ libcryptsetup_LIBS = @libcryptsetup_LIBS@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ use_doxygen = @use_doxygen@ EXTRA_DIST = cryptmount.service.in modules-load.conf \ setupscript.sh.in initscript.in scripttransform = 's,@EXENAME@,$(bindir)/cryptmount$(EXEEXT),g; \ s,@SYSCONF_DIR@,$(CM_SYSCONF_DIR),g; \ s,@PKG_NAME@,$(PACKAGE_NAME),g; \ s,@PKG_VERSION@,$(VERSION),g; \ s,@LCL_DIR@,$(localedir),g' all: all-am .SUFFIXES: $(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu --ignore-deps sysinit/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu --ignore-deps sysinit/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): tags TAGS: ctags CTAGS: cscope cscopelist: distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile installdirs: install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-generic clean-local mostlyclean-am distclean: distclean-am -rm -f Makefile distclean-am: clean-am distclean-generic dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-dvi: install-dvi-am install-dvi-am: install-exec-am: @$(NORMAL_INSTALL) $(MAKE) $(AM_MAKEFLAGS) install-exec-hook install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-generic pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: .MAKE: install-am install-exec-am install-strip .PHONY: all all-am check check-am clean clean-generic clean-local \ cscopelist-am ctags-am distclean distclean-generic distdir dvi \ dvi-am html html-am info info-am install install-am \ install-data install-data-am install-dvi install-dvi-am \ install-exec install-exec-am install-exec-hook install-html \ install-html-am install-info install-info-am install-man \ install-pdf install-pdf-am install-ps install-ps-am \ install-strip installcheck installcheck-am installdirs \ maintainer-clean maintainer-clean-generic mostlyclean \ mostlyclean-generic pdf pdf-am ps ps-am tags-am uninstall \ uninstall-am initscript: initscript.in sed ${scripttransform} $< > $@ cryptmount.service: cryptmount.service.in sed ${scripttransform} $< > $@ setupscript: setupscript.sh.in sed ${scripttransform} $< > $@ install-exec-hook: install-inits install-setup install-inits: cryptmount.service initscript @USE_SYSTEMD_TRUE@ test -d "${DESTDIR}/usr/lib/systemd/system" || ${mkdir_p} "${DESTDIR}/usr/lib/systemd/system" if test -d "${DESTDIR}/usr/lib/systemd/system" ; then \ ${INSTALL_PROGRAM_ENV} ${INSTALL_DATA} cryptmount.service "${DESTDIR}/usr/lib/systemd/system"; \ fi test -d "${DESTDIR}/etc/modules-load.d" || ${mkdir_p} "${DESTDIR}/etc/modules-load.d" ${INSTALL_PROGRAM_ENV} ${INSTALL_DATA} modules-load.conf "${DESTDIR}/etc/modules-load.d/cryptmount.conf"; @USE_SYSTEMD_FALSE@ test -d "${DESTDIR}/etc/init.d" -o -d "${DESTDIR}/etc/rc.d/init.d" || ${mkdir_p} "${DESTDIR}/etc/init.d" @USE_SYSTEMD_FALSE@ for initdir in /etc/init.d /etc/rc.d/init.d; do \ @USE_SYSTEMD_FALSE@ if test -d "${DESTDIR}$${initdir}" ; then \ @USE_SYSTEMD_FALSE@ ${INSTALL_PROGRAM_ENV} ${INSTALL_SCRIPT} initscript "${DESTDIR}$${initdir}/cryptmount" ; \ @USE_SYSTEMD_FALSE@ break; \ @USE_SYSTEMD_FALSE@ fi; \ @USE_SYSTEMD_FALSE@ done install-setup: setupscript test -d "${DESTDIR}${sbindir}" || ${mkdir_p} "${DESTDIR}${sbindir}" ${INSTALL_PROGRAM_ENV} ${INSTALL_SCRIPT} setupscript "${DESTDIR}${sbindir}/cryptmount-setup" clean-local: -rm -f cryptmount.service initscript setupscript # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: cryptmount-5.2/sysinit/initscript.in0000644000175000017500000000702112564544127014761 00000000000000#!/bin/sh # boot-time init script for cryptmount # RW Penney, August 2006 # Basic support for Linux Standard Base: ### BEGIN INIT INFO # Provides: cryptmount # Required-Start: $remote_fs # Required-Stop: $remote_fs # Should-Start: $syslog # Should-Stop: $syslog # Default-Start: 2 3 4 5 # Default-Stop: 0 1 6 # Short-Description: setup encrypted filesystems/swap at boot # Description: configure device-mapper targets for encrypted # filesystems and swap-partitions managed by cryptmount ### END INIT INFO CM_EXE=@EXENAME@ DMPATH=/dev/mapper CM_BOOTDV="" CM_BOOTSW="" CM_BOOTFS="" # Check whether cryptmount executable is usable: test -x "${CM_EXE}" || exit 5 # Read user-specified lists of filesystems to initialize: if [ -f /etc/default/cryptmount ]; then . /etc/default/cryptmount fi configured() { # Check if any of the targets needed at boot has been configured: for target in ${CM_BOOTDV} ${CM_BOOTFS} ${CM_BOOTSW}; do if [ -b "${DMPATH}/${target}" ]; then true return fi done false } dodevices() { case "$1" in start) test -z "${CM_BOOTDV}" || ${CM_EXE} --prepare ${CM_BOOTDV} ;; stop) test -z "${CM_BOOTDV}" || ${CM_EXE} --release ${CM_BOOTDV} ;; esac } doswaps() { case "$1" in start) test -z "${CM_BOOTSW}" || ${CM_EXE} --swapon ${CM_BOOTSW} ;; stop) test -z "${CM_BOOTSW}" || ${CM_EXE} --swapoff ${CM_BOOTSW} ;; esac } dofilesys() { case "$1" in start) test -z "${CM_BOOTFS}" || ${CM_EXE} --mount ${CM_BOOTFS} ;; stop) test -z "${CM_BOOTFS}" || ${CM_EXE} --unmount ${CM_BOOTFS} ;; esac } doALL() { if test -n "${CM_BOOTDV}" -o -n "${CM_BOOTSW}" \ -o -n "${CM_BOOTFS}" -o -n "${CM_EARLYDV}"; then echo "Using /etc/default/cryptmount is DEPRECATED - please use 'bootaction={mount|swap|prepare}' flags within @SYSCONF_DIR@/cmtab" fi case "$1" in start) dodevices start doswaps start dofilesys start ;; stop) dofilesys stop doswaps stop dodevices stop ;; esac } case "$1" in start) # Make sure that kernel device-mapper is available: modprobe -q -a dm-mod dm-crypt || true ${CM_EXE} --system-boot if configured; then echo "cryptmount ${STAGE}auto-filesystems seem to be already configured" else echo "Starting cryptmount ${STAGE}targets (hit shift/ctrl if short of entropy):" doALL start fi ;; stop) ${CM_EXE} --system-shutdown if configured; then echo "Stopping cryptmount ${STAGE}targets:" doALL stop fi ${CM_EXE} --safetynet || true ;; restart) ${CM_EXE} --system-shutdown if configured; then doALL stop fi ${CM_EXE} --system-boot doALL start ;; force-reload|reload) # nothing to do ;; status) if configured; then echo "cryptmount ${STAGE}auto-filesystems are in use" else echo "cryptmount ${STAGE}auto-filesystems do not appear to be in use" exit 3 fi ;; *) echo "Usage: $0 " \ " {start|stop|restart|reload|force-reload|status}" >&2 exit 1 ;; esac exit 0 cryptmount-5.2/armour.c0000644000175000017500000005412712612754537012223 00000000000000/* * Methods for encryption/security mechanisms for cryptmount * (C)Copyright 2005-2015, RW Penney */ /* This file is part of cryptmount cryptmount is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. cryptmount is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. */ #include #include #include #include #include #include #include #if HAVE_NANOSLEEP # include #endif #include #include #include #include #include #include "armour.h" #include "cryptmount.h" #include "tables.h" #include "utils.h" #ifdef TESTING # include # include # include "cmtesting.h" #endif /*! \addtogroup keymgrs * @{ */ keymanager_t *kmblti_gethandle(void); keymanager_t *kmgcry_gethandle(void); keymanager_t *kmluks_gethandle(void); keymanager_t *init_keymanager(keymanager_t *km); /* List of all available key-managers (to be constructed later): */ static keymanager_t *keymgrs = NULL; /* * ==== Raw key-management routines ==== */ static int kmraw_init_algs(void) { return 0; } static int kmraw_free_algs(void) { return 0; } static int kmraw_bind(bound_tgtdefn_t *bound, FILE *fp_key) { keyinfo_t *keyinfo = &bound->tgt->key; int compat = 0; if (keyinfo->format != NULL) { compat = (strcmp(keyinfo->format, "raw") == 0); } else { if (keyinfo->cipheralg != NULL) { return (strcmp(keyinfo->cipheralg, "none") == 0); } } if (compat) { if (keyinfo->digestalg == NULL) { keyinfo->digestalg = cm_strdup("none"); } if (keyinfo->cipheralg == NULL) { keyinfo->cipheralg = cm_strdup("none"); } } return compat; } static unsigned kmraw_get_properties(const bound_tgtdefn_t *boundtgt) { struct stat sbuff; unsigned props; /* We must flag that we have no password & have fixed location, otherwise keyfile=/dev/random could be renamed on password-changing! */ props = KM_PROP_NEEDSKEYFILE | KM_PROP_FIXEDLOC; if (stat(boundtgt->tgt->key.filename, &sbuff) == 0) { props |= KM_PROP_FORMATTED; } return props; } static int kmraw_get_key(bound_tgtdefn_t *boundtgt, const km_pw_context_t *pw_ctxt, uint8_t **key, int *keylen, FILE *fp_key) /** Extract key from unencrypted (plain) file */ { const keyinfo_t *keyinfo = &boundtgt->tgt->key; enum { BUFFSZ=512 }; char buff[BUFFSZ]; size_t len, lmt; int eflag=ERR_NOERROR; *key = NULL; *keylen = 0; if (fp_key == NULL) { eflag = ERR_BADFILE; goto bail_out; } /* Read data directly from keyfile: */ for (;;) { lmt = (keyinfo->maxlen > 0 && (*keylen + BUFFSZ) > keyinfo->maxlen ? (size_t)(keyinfo->maxlen - *keylen) : (size_t)BUFFSZ); len = fread((void*)buff, (size_t)1, (size_t)lmt, fp_key); if (len == 0) break; /* Copy new block of data onto end of current key: */ *key = (uint8_t*)sec_realloc((void*)*key, (size_t)(*keylen+len)); memcpy((void*)(*key + *keylen), (const void*)buff, len); *keylen += len; } if (ferror(fp_key) != 0) { fprintf(stderr, _("Key-extraction failed for \"%s\"\n"), keyinfo->filename); /* This is a trivial case of decryption failure: */ eflag = ERR_BADDECRYPT; } bail_out: return eflag; } static int kmraw_put_key(bound_tgtdefn_t *boundtgt, const km_pw_context_t *pw_ctxt, const uint8_t *key, const int keylen, FILE *fp_key) /** Store key in unencrypted (plain) file */ { const keyinfo_t *keyinfo = &boundtgt->tgt->key; int eflag=ERR_NOERROR; /* Write data directly into keyfile: */ if (cm_fwrite((const void*)key, (size_t)keylen, fp_key) != 0 || ferror(fp_key) != 0) { fprintf(stderr, _("Key-writing failed for \"%s\"\n"), keyinfo->filename); eflag = ERR_BADENCRYPT; } return eflag; } static keymanager_t keymgr_raw = { "raw", 0, kmraw_init_algs, kmraw_free_algs, kmraw_bind, kmraw_get_properties, kmraw_get_key, kmraw_put_key, NULL #ifdef TESTING , NULL, NULL, CM_HASLEGACY #endif }; /* * ==== Abstract key-management interfaces ==== */ static keymanager_t **add_keymgr(keymanager_t **ptr, keymanager_t *km) /* Add key-manager interface definition(s) to list of available managers */ { if (km == NULL) return ptr; *ptr = km; /* Allow for addend itself being a list of key-managers: */ for (;;) { #ifdef TESTING if (km->install_testctxt != NULL) km->install_testctxt(test_ctxtptr); #endif if (km->next == NULL) break; km = km->next; } return &km->next; } static void build_keymgrs(void) /** Construct list of available key-managers */ { keymanager_t **ptr; if (keymgrs != NULL) return; /* already initialized */ ptr = &keymgrs; ptr = add_keymgr(ptr, kmblti_gethandle()); ptr = add_keymgr(ptr, kmgcry_gethandle()); ptr = add_keymgr(ptr, kmluks_gethandle()); ptr = add_keymgr(ptr, &keymgr_raw); } const char **get_keymgr_list(void) /** Construct list of key-manager names */ { keymanager_t *km; const char **arr=NULL; int i, cnt; build_keymgrs(); for (km=keymgrs,cnt=0; km!=NULL; km=km->next,++cnt); arr = (const char**)malloc((size_t)((cnt+1)*sizeof(const char*))); for (i=0,km=keymgrs; inext,++i) { arr[i] = km->ident; } arr[i] = NULL; return arr; } keymanager_t *init_keymanager(keymanager_t *km) { if (km != NULL) { if ((km->initialized & KM_INIT_ALGS) == 0) { if (km->init_algs() == 0) { km->initialized |= KM_INIT_ALGS; } else { fprintf(stderr, "Failed to initialize keymanager \"%s\"\n", km->ident); } } } return km; } int free_keymanagers(void) { keymanager_t *km; for (km=keymgrs; km!=NULL; km=km->next) { if ((km->initialized & KM_INIT_ALGS) != 0) { km->free_algs(); km->initialized = 0; } } return 0; } bound_tgtdefn_t *alloc_boundtgt(const tgtdefn_t *tgt) { bound_tgtdefn_t *bound; bound = (bound_tgtdefn_t*)malloc(sizeof(bound_tgtdefn_t)); bound->tgt = clone_tgtdefn(tgt); bound->keymgr = NULL; bound->km_data = NULL; return bound; } void free_boundtgt(bound_tgtdefn_t *boundtgt) { if (boundtgt == NULL) return; free_tgtdefn(boundtgt->tgt); if (boundtgt->km_data != NULL) free((void*)boundtgt->km_data); free((void*)boundtgt); } bound_tgtdefn_t *bind_tgtdefn(const tgtdefn_t *tgt) /** Find keymanager that is able to handle given target & keyfile */ { bound_tgtdefn_t *bound; keymanager_t *km; FILE *fp_key=NULL; if (tgt == NULL) return NULL; build_keymgrs(); bound = alloc_boundtgt(tgt); if (tgt->key.filename != NULL) { fp_key = fopen(tgt->key.filename, "rb"); } km = keymgrs; while (km != NULL) { if (fp_key != NULL) (void)fseek(fp_key, 0L, SEEK_SET); if (km->bind(bound, fp_key)) { bound->keymgr = init_keymanager(km); break; } km = km->next; } if (bound->keymgr == NULL) { free_boundtgt(bound); bound = NULL; } if (fp_key != NULL) fclose(fp_key); return bound; } /*! * Extract the filesystem encryption key for a particular target. * * This delegates most functionality to the methods defined * in the \ref keymanager_t structure. */ int cm_get_key(bound_tgtdefn_t *boundtgt, const km_pw_context_t *pw_ctxt, uint8_t **key, int *keylen) { keyinfo_t *keyinfo = &boundtgt->tgt->key; FILE *fp = NULL; unsigned props, attempts = 0; int eflag=ERR_NOERROR; if (keyinfo->filename != NULL) { fp = fopen(keyinfo->filename, "rb"); if (fp == NULL) { fprintf(stderr, _("Failed to open keyfile \"%s\" for target \"%s\"\n"), keyinfo->filename, boundtgt->tgt->ident); eflag = ERR_BADFILE; goto bail_out; } } else { props = boundtgt->keymgr->get_properties(boundtgt); if ((props & KM_PROP_NEEDSKEYFILE) != 0) { fprintf(stderr, _("Missing keyfile for target \"%s\"\n"), boundtgt->tgt->ident); eflag = ERR_BADFILE; goto bail_out; } } do { if (fp != NULL) (void)fseek(fp, 0L, SEEK_SET); eflag = boundtgt->keymgr->get_key(boundtgt, pw_ctxt, key, keylen, fp); if (eflag == ERR_BADDECRYPT) sleep(1); } while (++attempts < keyinfo->retries && eflag == ERR_BADDECRYPT); bail_out: if (fp != NULL) fclose(fp); return eflag; } int cm_put_key(bound_tgtdefn_t *boundtgt, const km_pw_context_t *pw_ctxt, const uint8_t *key, const int keylen, FILE *fp_key) { unsigned props; int eflag = ERR_NOERROR; props = boundtgt->keymgr->get_properties(boundtgt); if ((props & KM_PROP_NEEDSKEYFILE) != 0 && fp_key == NULL) { fprintf(stderr, _("Missing output keyfile for target \"%s\"\n"), boundtgt->tgt->ident); return ERR_BADFILE; } eflag = boundtgt->keymgr->put_key(boundtgt, pw_ctxt, key, keylen, fp_key); return eflag; } unsigned cm_get_keyproperties(const bound_tgtdefn_t *boundtgt) /** Extract information about key, e.g. whether encrypted */ { unsigned props; if (boundtgt != NULL && boundtgt->keymgr != NULL) { props = boundtgt->keymgr->get_properties(boundtgt); } else { /* Safest to assume that key shouldn't be overwritten: */ props = KM_PROP_FIXEDLOC | KM_PROP_FORMATTED; } return props; } #ifdef TESTING /*! \addtogroup unit_tests * @{ */ const char *km_legacy_key = "cryptmount012345"; const char *km_legacy_passwd = "nothing"; int km_test_managers(void) { keymanager_t *km; int flg = 0; build_keymgrs(); for (km=keymgrs; km!=NULL; km=km->next) { if (km->run_tests == NULL) continue; km->init_algs(); flg |= km->run_tests(); } #if 0 km_archive_keys(); #endif return flg; } int km_test_keyrw(void) /* Test key read-writing (creation/extraction) */ { enum { MAXKEY=256 }; const keymanager_t *km; tgtdefn_t *target; bound_tgtdefn_t *bound=NULL; int i, keylen=0, keylen1, eflag; char str[256]; uint8_t key0[MAXKEY], *key1=NULL; FILE *fp; extern cm_testinfo_t *test_ctxtptr; CM_TEST_START("Key read-write"); build_keymgrs(); for (km=keymgrs; km!=NULL; km=km->next) { if ((km->test_flags & CM_READONLY) != 0) continue; km->init_algs(); target = alloc_tgtdefn(NULL); target->key.format = cm_strdup(km->ident); target->key.filename = cm_strdup("NOWHERE"); target->key.digestalg = NULL; target->key.cipheralg = NULL; target->key.maxlen = -1; for (keylen=1; keylen<=MAXKEY; keylen<<=2) { sprintf(str, "Key read-write, %s, keylen=%d", km->ident, keylen); CM_TEST_IDENT(str); /* Generate (low-entropy) key: */ for (i=0; ibind(bound, fp)) CM_TEST_FAIL(); eflag = km->put_key(bound, NULL, key0, keylen, fp); if (eflag != ERR_NOTSUPPORTED) { CM_ASSERT_EQUAL(ERR_NOERROR, eflag); key1 = NULL; keylen1 = -keylen; /* Try reading key back from file: */ rewind(fp); eflag = km->get_key(bound, NULL, &key1, &keylen1, fp); CM_ASSERT_EQUAL(ERR_NOERROR, eflag); CM_ASSERT_EQUAL(keylen, keylen1); CM_ASSERT_DIFFERENT(key0, key1); CM_ASSERT_DIFFERENT(NULL, key1); for (i=0; ifree_algs(); free_tgtdefn(target); } CM_ASSERT_DIFFERENT(keylen, 0); CM_TEST_OK(context); } int km_archive_keys(void) /** Generate fixed-pattern keys for testing reading by later releases */ { keymanager_t *km; tgtdefn_t *target; bound_tgtdefn_t *bound=NULL; FILE *fp; int flg = 0; char filename[256]; km_pw_context_t pw_ctxt; pw_ctxt.fd_pw_source = NULL; pw_ctxt.argpasswd[0] = pw_ctxt.argpasswd[1] = km_legacy_passwd; build_keymgrs(); for (km=keymgrs; km!=NULL; km=km->next) { if ((km->test_flags & CM_READONLY) != 0) continue; km->init_algs(); target = alloc_tgtdefn(NULL); target->key.format = cm_strdup(km->ident); target->key.filename = NULL; target->key.digestalg = NULL; target->key.cipheralg = NULL; target->key.maxlen = -1; bound = alloc_boundtgt(target); km->bind(bound, NULL); sprintf(filename, "/tmp/%s_%s_%s_%s_0", PACKAGE_VERSION, km->ident, bound->tgt->key.digestalg, bound->tgt->key.cipheralg); bound->tgt->key.filename = cm_strdup(filename); /* Write key to file: */ fp = fopen(filename, "wb"); /* May need to be "r+b" for LUKS */ flg |= km->put_key(bound, &pw_ctxt, (const uint8_t*)km_legacy_key, strlen(km_legacy_key), fp); fclose(fp); if (bound != NULL) free_boundtgt(bound); km->free_algs(); free_tgtdefn(target); } return flg; } int km_test_legacy(void) /** Check that keyfiles from earlier releases can be read */ { keymanager_t *km; glob_t keyfiles; struct stat sbuff; tgtdefn_t *target; bound_tgtdefn_t *bound=NULL; km_pw_context_t pw_ctxt; uint8_t *key=NULL; int idx, n_legacy = 0, keylen, flg; char *tokbuff, keyglob[1024]; const char *basepath; CM_TEST_START("Legacy key support"); pw_ctxt.fd_pw_source = NULL; pw_ctxt.verify = 0; pw_ctxt.argpasswd[0] = pw_ctxt.argpasswd[1] = km_legacy_passwd; snprintf(keyglob, sizeof(keyglob), CM_SRCDIR "/testing/keys/[0-9]*[0-9]"); glob(keyglob, 0, NULL, &keyfiles); for (km=keymgrs; km!=NULL; km=km->next) { km->initialized &= ~KM_TESTED; } for (idx=0; idx<(int)keyfiles.gl_pathc; ++idx) { const char *keypath = keyfiles.gl_pathv[idx]; if (stat(keypath, &sbuff) != 0) CM_TEST_FAIL(); if (!S_ISREG(sbuff.st_mode)) continue; ++n_legacy; strcpy(keyglob, keypath); basepath = basename(keyglob); tokbuff = cm_strdup(basepath); (void)strtok(tokbuff, "_"); target = alloc_tgtdefn(NULL); target->ident = cm_strdup(basepath); target->key.format = cm_strdup(strtok(NULL, "_")); target->key.filename = cm_strdup(keypath); target->key.digestalg = cm_strdup(strtok(NULL, "_")); target->key.cipheralg = cm_strdup(strtok(NULL, "_")); bound = bind_tgtdefn(target); if (bound != NULL) { ((keymanager_t*)bound->keymgr)->initialized |= KM_TESTED; } else { continue; /* No available key manager - possibly not compiled? */ } key = NULL; keylen = 0; flg = cm_get_key(bound, &pw_ctxt, &key, &keylen); if (flg == ERR_BADDEVICE && getuid() != 0) { fprintf(stderr, "Skipping \"%s\" (after %d keys) - possibly requires root privileges\n", keypath, (n_legacy - 1)); goto skip_jail; } CM_ASSERT_EQUAL(ERR_NOERROR, flg); CM_ASSERT_EQUAL(strlen(km_legacy_key), keylen); if (key != NULL) { CM_ASSERT_EQUAL(0, memcmp(key, km_legacy_key, (size_t)keylen)); } else { CM_TEST_FAIL(); } skip_jail: if (key != NULL) sec_free((void*)key); if (bound != NULL) free_boundtgt(bound); if (target != NULL) free_tgtdefn(target); free((void*)tokbuff); } globfree(&keyfiles); if (n_legacy < 4) CM_TEST_FAIL(); /* Check that all available keymanagers with legacy keys have been tested */ for (km=keymgrs; km!=NULL; km=km->next) { if ((km->test_flags & CM_HASLEGACY) != 0 && (km->initialized & KM_TESTED) == 0) { CM_TEST_FAIL(); } } CM_TEST_OK(); } /** @} */ #endif /* TESTING */ /* * ==== Miscellaneous routines ==== */ size_t mk_key_string(const uint8_t *key, const size_t keylen, char *buff) /** Create text version of crypto key */ { size_t i; for (i=0; i0 && cmtab[pos-1] != '/'; --pos) dirname[pos] = '\0'; while (--pos >= 0) dirname[pos] = cmtab[pos]; eflag = sycheck_directory(dirname); if (eflag != ERR_NOERROR) goto bail_out; if (stat(cmtab,&sfile) != 0) { fprintf(stderr, "Cannot open \"%s\"\n", cmtab); eflag = ERR_INSECURE; goto bail_out; } /* Check file ownerships: */ if (sfile.st_uid != (uid_t)0) { fprintf(stderr, "\"%s\" must be owned by root\n", cmtab); eflag = ERR_INSECURE; goto bail_out; } /* Check that file isn't globally writable: */ if (!S_ISREG(sfile.st_mode) || (sfile.st_mode & S_IWOTH) != 0) { fprintf(stderr, "Lax permissions on \"%s\"\n", cmtab); eflag = ERR_INSECURE; goto bail_out; } bail_out: if (dirname != NULL) free((void*)dirname); return eflag; } static int sy_path(const char *path) /** Check whether pathname is considered secure */ { if (path == NULL) return ERR_NOERROR; if (path[0] == '/') return ERR_NOERROR; return ERR_INSECURE; } int sycheck_target(const tgtdefn_t *tgt) /** Check that paths within target-specification are sensible */ { int eflag=ERR_NOERROR; if (tgt == NULL) return 0; eflag |= sy_path(tgt->dev); eflag |= sy_path(tgt->dir); eflag |= sy_path(tgt->key.filename); if (eflag != ERR_NOERROR) { fprintf(stderr, _("Specification for target \"%s\" contains non-absolute pathname\n"), tgt->ident); } return eflag; } /* * ==== Mutex-locking on configuration directory ==== */ static const char *cm_lock_filename = "_cryptmount_lock_"; int cm_mutex_lock(void) /** Try to acquire lock on configuration directory (via symlink marker) */ { char *fname=NULL, ident[64]; int tries=10, eflag=ERR_BADMUTEX; #if HAVE_NANOSLEEP int ticks; struct timespec delay; #endif (void)cm_path(&fname, CM_SYSRUN_PFX, cm_lock_filename); snprintf(ident, sizeof(ident), "%u-%u", (unsigned)getpid(), (unsigned)getuid()); while (tries-->0) { errno = 0; if (symlink(ident, fname) == 0) { /* Lock acquired */ eflag = 0; break; } else { if (errno == EEXIST) { /* Try again later */ #if HAVE_NANOSLEEP ticks = (53 * tries + 97 * (long)&tries) % 11; delay.tv_sec = (ticks / 10); delay.tv_nsec = (ticks % 10) * 1000L * 1000L * 1000L; nanosleep(&delay, NULL); #else sleep(1); #endif } else break; /* failed to make link for more peculiar reason */ } } if (eflag != 0) { fprintf(stderr, "Failed to create lock-file \"%s\" (errno=%d)\n", fname, errno); } free((void*)fname); return eflag; } /** * Release an inter-process lock on configuration directory. * * \see cm_mutex_lock(). */ int cm_mutex_unlock(void) { char *fname=NULL; struct stat sbuff; int eflag=0; (void)cm_path(&fname, CM_SYSRUN_PFX, cm_lock_filename); if (lstat(fname, &sbuff) != 0 || !S_ISLNK(sbuff.st_mode) || unlink(fname) != 0) { fprintf(stderr, "Failed to remove lock-file \"%s\"\n", fname); eflag = ERR_BADMUTEX; } free((void*)fname); return eflag; } /** @} */ /* * (C)Copyright 2005-2015, RW Penney */ cryptmount-5.2/cmtesting.c0000644000175000017500000000555512612754537012714 00000000000000/* * Methods for unit-testing utiltities for cryptmount * (C)Copyright 2006-2015, RW Penney */ /* This file is part of cryptmount cryptmount is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. cryptmount is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. */ #ifdef TESTING #include #include #include "cmtesting.h" /*! \addtogroup unit_tests * @{ */ static void cm_tests_init(); static int cm_tests_close(); static void cm_tests_init() { int i; test_ctxtptr->current = NULL; test_ctxtptr->tests_run = 0; for (i=0; itest_stats[i] = 0; } } int cm_tests_close() { int i,nt; for (i=0,nt=0; itest_stats[i]; } if (nt != test_ctxtptr->tests_run) { fprintf(stderr, "mismatch in test-statistics (%d != %d)\n", nt, test_ctxtptr->tests_run); } if (test_ctxtptr->test_stats[CM_TEST_PASSED] == test_ctxtptr->tests_run) { fprintf(stderr, "++++ all %d tests PASSED ++++\n", test_ctxtptr->tests_run); } else { fprintf(stderr, "!!!! %2d tests FAILED !!!!\n", test_ctxtptr->test_stats[CM_TEST_FAILED]); fprintf(stderr, "!!!! %2d tests passed !!!!\n", test_ctxtptr->test_stats[CM_TEST_PASSED]); fprintf(stderr, "!!!! %2d tests aborted !!!!\n", test_ctxtptr->test_stats[CM_TEST_ABORTED]); } return (test_ctxtptr->test_stats[CM_TEST_PASSED] != test_ctxtptr->tests_run); } int cm_run_tests() /* Front-end to self-testing routines */ { int bf_test_blowfish(), fs_test_blkgetsz(), fs_test_splitopts(), fs_test_entropy(), km_test_managers(), km_test_keyrw(), km_test_legacy(), tb_test_expand(), ut_test_strings(), ut_test_strops(), ut_test_sha1(), ut_pwfort(); cm_tests_init(); ut_test_strings(); ut_test_strops(); tb_test_expand(); fs_test_blkgetsz(); fs_test_splitopts(); fs_test_entropy(); ut_test_sha1(); ut_pwfort(); bf_test_blowfish(); km_test_managers(); km_test_keyrw(); km_test_legacy(); return cm_tests_close(); } /** @} */ #else /* !TESTING */ int _keep_ansi_pedantic_quiet = 0; #endif /* TESTING */ /* * (C)Copyright 2006-2015, RW Penney */ cryptmount-5.2/NEWS0000644000175000017500000000011311402211766011217 00000000000000Please see 'RELNOTES', 'README' or 'ChangeLog' for news about cryptmount. cryptmount-5.2/config.h.in0000644000175000017500000001171612613124602012553 00000000000000/* config.h.in. Generated from configure.ac by autoheader. */ /* Default filesystem encryption algorithm */ #undef CM_DEFAULT_CIPHER /* Define to 1 if translation of program messages to the user's native language is requested. */ #undef ENABLE_NLS /* Define to 1 if you have the Mac OS X function CFLocaleCopyCurrent in the CoreFoundation framework. */ #undef HAVE_CFLOCALECOPYCURRENT /* Define to 1 if you have the Mac OS X function CFPreferencesCopyAppValue in the CoreFoundation framework. */ #undef HAVE_CFPREFERENCESCOPYAPPVALUE /* Define if the GNU dcgettext() function is already present or preinstalled. */ #undef HAVE_DCGETTEXT /* Define to 1 if you have the declaration of `dm_task_secure_data', and to 0 if you don't. */ #undef HAVE_DECL_DM_TASK_SECURE_DATA /* Define to 1 if you have the header file. */ #undef HAVE_ERRNO_H /* Define to 1 if you have the header file. */ #undef HAVE_GETOPT_H /* Define if the GNU gettext() function is already present or preinstalled. */ #undef HAVE_GETTEXT /* Define if you have the iconv() function and it works. */ #undef HAVE_ICONV /* Define to 1 if you have the header file. */ #undef HAVE_INTTYPES_H /* Define to 1 if you have the `ioctl' function. */ #undef HAVE_IOCTL /* Define to 1 if you have the libcryptsetup header files */ #undef HAVE_LIBCRYPTSETUP /* Is libcryptsetup >= 1.6.0 available? */ #undef HAVE_LIBCRYPTSETUP_1_6 /* Define to 1 if you have libdevmapper header files */ #undef HAVE_LIBDEVMAP /* Define to 1 to enable libgcrypt support */ #undef HAVE_LIBGCRYPT /* Define to 1 if you have libudev header files */ #undef HAVE_LIBUDEV /* Define to 1 if you have the header file. */ #undef HAVE_LINUX_FS_H /* Define to 1 if you have the header file. */ #undef HAVE_LINUX_LOOP_H /* Define to 1 if you have the header file. */ #undef HAVE_MEMORY_H /* Define to 1 if you have the `memset' function. */ #undef HAVE_MEMSET /* Define to 1 if you have the `mknod' function. */ #undef HAVE_MKNOD /* Define to 1 if you have the header file. */ #undef HAVE_MNTENT_H /* Define to 1 if you have nanosleep() */ #undef HAVE_NANOSLEEP /* Define to 1 if you have the `open' function. */ #undef HAVE_OPEN /* Define to 1 if you have the header file. */ #undef HAVE_STDINT_H /* Define to 1 if you have the header file. */ #undef HAVE_STDLIB_H /* Define to 1 if you have the header file. */ #undef HAVE_STRINGS_H /* Define to 1 if you have the header file. */ #undef HAVE_STRING_H /* Define to 1 if you have the `strncpy' function. */ #undef HAVE_STRNCPY /* Define to 1 if you have the `syslog' function. */ #undef HAVE_SYSLOG /* Define to 1 if you have the header file. */ #undef HAVE_SYS_STAT_H /* Define to 1 if you have the header file. */ #undef HAVE_SYS_TYPES_H /* Define to 1 if you have tcgetattr() */ #undef HAVE_TERMIOS /* Define to 1 if you have the header file. */ #undef HAVE_UNISTD_H /* Name of package */ #undef PACKAGE /* Define to the address where bug reports for this package should be sent. */ #undef PACKAGE_BUGREPORT /* Define to the full name of this package. */ #undef PACKAGE_NAME /* Define to the full name and version of this package. */ #undef PACKAGE_STRING /* Define to the one symbol short name of this package. */ #undef PACKAGE_TARNAME /* Define to the home page for this package. */ #undef PACKAGE_URL /* Define to the version of this package. */ #undef PACKAGE_VERSION /* Define to 1 if you have the ANSI C header files. */ #undef STDC_HEADERS /* Define to 1 to enable OpenSSL-compatible keys via libgcrypt */ #undef USE_GCRYOSSL /* Define to 1 to enable LUKS compatbility layer */ #undef USE_LUKSCOMPAT /* Enable extensions on AIX 3, Interix. */ #ifndef _ALL_SOURCE # undef _ALL_SOURCE #endif /* Enable GNU extensions on systems that have them. */ #ifndef _GNU_SOURCE # undef _GNU_SOURCE #endif /* Enable threading extensions on Solaris. */ #ifndef _POSIX_PTHREAD_SEMANTICS # undef _POSIX_PTHREAD_SEMANTICS #endif /* Enable extensions on HP NonStop. */ #ifndef _TANDEM_SOURCE # undef _TANDEM_SOURCE #endif /* Enable general extensions on Solaris. */ #ifndef __EXTENSIONS__ # undef __EXTENSIONS__ #endif /* Version number of package */ #undef VERSION /* use program-name to alter default action */ #undef WITH_ARGV0 /* Enable large inode numbers on Mac OS X 10.5. */ #ifndef _DARWIN_USE_64_BIT_INODE # define _DARWIN_USE_64_BIT_INODE 1 #endif /* Number of bits in a file offset, on hosts where this is settable. */ #undef _FILE_OFFSET_BITS /* Define for large files, on AIX-style hosts. */ #undef _LARGE_FILES /* Define to 1 if on MINIX. */ #undef _MINIX /* Define to 2 if the system does not provide POSIX.1 features except with this defined. */ #undef _POSIX_1_SOURCE /* Define to 1 if you need to in order for `stat' and other things to work. */ #undef _POSIX_SOURCE /* Define to empty if `const' does not conform to ANSI C. */ #undef const cryptmount-5.2/blowfish.c0000644000175000017500000005111312612754537012523 00000000000000/* * Methods for "Blowfish" cipher algorithm * (Based on Bruce Schneier's implementation at http://www.schneier.com, * subsequently edited by RW Penney for "cryptmount") */ /* This file is part of cryptmount */ #include #include #include #include #include "blowfish.h" #ifdef TESTING # include "cmtesting.h" #endif enum { CM_BF_nrounds = 16, CM_BF_keybytes = 8, CM_BF_maxkeybytes = 56 }; static const uint32_t bf_p[18] = { 0x243f6a88U , 0x85a308d3U , 0x13198a2eU , 0x03707344U , 0xa4093822U , 0x299f31d0U , 0x082efa98U , 0xec4e6c89U , 0x452821e6U , 0x38d01377U , 0xbe5466cfU , 0x34e90c6cU , 0xc0ac29b7U , 0xc97c50ddU , 0x3f84d5b5U , 0xb5470917U , 0x9216d5d9U , 0x8979fb1bU }; static const uint32_t bf_sbox[4][256] = { { 0xd1310ba6U , 0x98dfb5acU , 0x2ffd72dbU , 0xd01adfb7U , 0xb8e1afedU , 0x6a267e96U , 0xba7c9045U , 0xf12c7f99U , 0x24a19947U , 0xb3916cf7U , 0x0801f2e2U , 0x858efc16U , 0x636920d8U , 0x71574e69U , 0xa458fea3U , 0xf4933d7eU , 0x0d95748fU , 0x728eb658U , 0x718bcd58U , 0x82154aeeU , 0x7b54a41dU , 0xc25a59b5U , 0x9c30d539U , 0x2af26013U , 0xc5d1b023U , 0x286085f0U , 0xca417918U , 0xb8db38efU , 0x8e79dcb0U , 0x603a180eU , 0x6c9e0e8bU , 0xb01e8a3eU , 0xd71577c1U , 0xbd314b27U , 0x78af2fdaU , 0x55605c60U , 0xe65525f3U , 0xaa55ab94U , 0x57489862U , 0x63e81440U , 0x55ca396aU , 0x2aab10b6U , 0xb4cc5c34U , 0x1141e8ceU , 0xa15486afU , 0x7c72e993U , 0xb3ee1411U , 0x636fbc2aU , 0x2ba9c55dU , 0x741831f6U , 0xce5c3e16U , 0x9b87931eU , 0xafd6ba33U , 0x6c24cf5cU , 0x7a325381U , 0x28958677U , 0x3b8f4898U , 0x6b4bb9afU , 0xc4bfe81bU , 0x66282193U , 0x61d809ccU , 0xfb21a991U , 0x487cac60U , 0x5dec8032U , 0xef845d5dU , 0xe98575b1U , 0xdc262302U , 0xeb651b88U , 0x23893e81U , 0xd396acc5U , 0x0f6d6ff3U , 0x83f44239U , 0x2e0b4482U , 0xa4842004U , 0x69c8f04aU , 0x9e1f9b5eU , 0x21c66842U , 0xf6e96c9aU , 0x670c9c61U , 0xabd388f0U , 0x6a51a0d2U , 0xd8542f68U , 0x960fa728U , 0xab5133a3U , 0x6eef0b6cU , 0x137a3be4U , 0xba3bf050U , 0x7efb2a98U , 0xa1f1651dU , 0x39af0176U , 0x66ca593eU , 0x82430e88U , 0x8cee8619U , 0x456f9fb4U , 0x7d84a5c3U , 0x3b8b5ebeU , 0xe06f75d8U , 0x85c12073U , 0x401a449fU , 0x56c16aa6U , 0x4ed3aa62U , 0x363f7706U , 0x1bfedf72U , 0x429b023dU , 0x37d0d724U , 0xd00a1248U , 0xdb0fead3U , 0x49f1c09bU , 0x075372c9U , 0x80991b7bU , 0x25d479d8U , 0xf6e8def7U , 0xe3fe501aU , 0xb6794c3bU , 0x976ce0bdU , 0x04c006baU , 0xc1a94fb6U , 0x409f60c4U , 0x5e5c9ec2U , 0x196a2463U , 0x68fb6fafU , 0x3e6c53b5U , 0x1339b2ebU , 0x3b52ec6fU , 0x6dfc511fU , 0x9b30952cU , 0xcc814544U , 0xaf5ebd09U , 0xbee3d004U , 0xde334afdU , 0x660f2807U , 0x192e4bb3U , 0xc0cba857U , 0x45c8740fU , 0xd20b5f39U , 0xb9d3fbdbU , 0x5579c0bdU , 0x1a60320aU , 0xd6a100c6U , 0x402c7279U , 0x679f25feU , 0xfb1fa3ccU , 0x8ea5e9f8U , 0xdb3222f8U , 0x3c7516dfU , 0xfd616b15U , 0x2f501ec8U , 0xad0552abU , 0x323db5faU , 0xfd238760U , 0x53317b48U , 0x3e00df82U , 0x9e5c57bbU , 0xca6f8ca0U , 0x1a87562eU , 0xdf1769dbU , 0xd542a8f6U , 0x287effc3U , 0xac6732c6U , 0x8c4f5573U , 0x695b27b0U , 0xbbca58c8U , 0xe1ffa35dU , 0xb8f011a0U , 0x10fa3d98U , 0xfd2183b8U , 0x4afcb56cU , 0x2dd1d35bU , 0x9a53e479U , 0xb6f84565U , 0xd28e49bcU , 0x4bfb9790U , 0xe1ddf2daU , 0xa4cb7e33U , 0x62fb1341U , 0xcee4c6e8U , 0xef20cadaU , 0x36774c01U , 0xd07e9efeU , 0x2bf11fb4U , 0x95dbda4dU , 0xae909198U , 0xeaad8e71U , 0x6b93d5a0U , 0xd08ed1d0U , 0xafc725e0U , 0x8e3c5b2fU , 0x8e7594b7U , 0x8ff6e2fbU , 0xf2122b64U , 0x8888b812U , 0x900df01cU , 0x4fad5ea0U , 0x688fc31cU , 0xd1cff191U , 0xb3a8c1adU , 0x2f2f2218U , 0xbe0e1777U , 0xea752dfeU , 0x8b021fa1U , 0xe5a0cc0fU , 0xb56f74e8U , 0x18acf3d6U , 0xce89e299U , 0xb4a84fe0U , 0xfd13e0b7U , 0x7cc43b81U , 0xd2ada8d9U , 0x165fa266U , 0x80957705U , 0x93cc7314U , 0x211a1477U , 0xe6ad2065U , 0x77b5fa86U , 0xc75442f5U , 0xfb9d35cfU , 0xebcdaf0cU , 0x7b3e89a0U , 0xd6411bd3U , 0xae1e7e49U , 0x00250e2dU , 0x2071b35eU , 0x226800bbU , 0x57b8e0afU , 0x2464369bU , 0xf009b91eU , 0x5563911dU , 0x59dfa6aaU , 0x78c14389U , 0xd95a537fU , 0x207d5ba2U , 0x02e5b9c5U , 0x83260376U , 0x6295cfa9U , 0x11c81968U , 0x4e734a41U , 0xb3472dcaU , 0x7b14a94aU , 0x1b510052U , 0x9a532915U , 0xd60f573fU , 0xbc9bc6e4U , 0x2b60a476U , 0x81e67400U , 0x08ba6fb5U , 0x571be91fU , 0xf296ec6bU , 0x2a0dd915U , 0xb6636521U , 0xe7b9f9b6U , 0xff34052eU , 0xc5855664U , 0x53b02d5dU , 0xa99f8fa1U , 0x08ba4799U , 0x6e85076aU } , { 0x4b7a70e9U , 0xb5b32944U , 0xdb75092eU , 0xc4192623U , 0xad6ea6b0U , 0x49a7df7dU , 0x9cee60b8U , 0x8fedb266U , 0xecaa8c71U , 0x699a17ffU , 0x5664526cU , 0xc2b19ee1U , 0x193602a5U , 0x75094c29U , 0xa0591340U , 0xe4183a3eU , 0x3f54989aU , 0x5b429d65U , 0x6b8fe4d6U , 0x99f73fd6U , 0xa1d29c07U , 0xefe830f5U , 0x4d2d38e6U , 0xf0255dc1U , 0x4cdd2086U , 0x8470eb26U , 0x6382e9c6U , 0x021ecc5eU , 0x09686b3fU , 0x3ebaefc9U , 0x3c971814U , 0x6b6a70a1U , 0x687f3584U , 0x52a0e286U , 0xb79c5305U , 0xaa500737U , 0x3e07841cU , 0x7fdeae5cU , 0x8e7d44ecU , 0x5716f2b8U , 0xb03ada37U , 0xf0500c0dU , 0xf01c1f04U , 0x0200b3ffU , 0xae0cf51aU , 0x3cb574b2U , 0x25837a58U , 0xdc0921bdU , 0xd19113f9U , 0x7ca92ff6U , 0x94324773U , 0x22f54701U , 0x3ae5e581U , 0x37c2dadcU , 0xc8b57634U , 0x9af3dda7U , 0xa9446146U , 0x0fd0030eU , 0xecc8c73eU , 0xa4751e41U , 0xe238cd99U , 0x3bea0e2fU , 0x3280bba1U , 0x183eb331U , 0x4e548b38U , 0x4f6db908U , 0x6f420d03U , 0xf60a04bfU , 0x2cb81290U , 0x24977c79U , 0x5679b072U , 0xbcaf89afU , 0xde9a771fU , 0xd9930810U , 0xb38bae12U , 0xdccf3f2eU , 0x5512721fU , 0x2e6b7124U , 0x501adde6U , 0x9f84cd87U , 0x7a584718U , 0x7408da17U , 0xbc9f9abcU , 0xe94b7d8cU , 0xec7aec3aU , 0xdb851dfaU , 0x63094366U , 0xc464c3d2U , 0xef1c1847U , 0x3215d908U , 0xdd433b37U , 0x24c2ba16U , 0x12a14d43U , 0x2a65c451U , 0x50940002U , 0x133ae4ddU , 0x71dff89eU , 0x10314e55U , 0x81ac77d6U , 0x5f11199bU , 0x043556f1U , 0xd7a3c76bU , 0x3c11183bU , 0x5924a509U , 0xf28fe6edU , 0x97f1fbfaU , 0x9ebabf2cU , 0x1e153c6eU , 0x86e34570U , 0xeae96fb1U , 0x860e5e0aU , 0x5a3e2ab3U , 0x771fe71cU , 0x4e3d06faU , 0x2965dcb9U , 0x99e71d0fU , 0x803e89d6U , 0x5266c825U , 0x2e4cc978U , 0x9c10b36aU , 0xc6150ebaU , 0x94e2ea78U , 0xa5fc3c53U , 0x1e0a2df4U , 0xf2f74ea7U , 0x361d2b3dU , 0x1939260fU , 0x19c27960U , 0x5223a708U , 0xf71312b6U , 0xebadfe6eU , 0xeac31f66U , 0xe3bc4595U , 0xa67bc883U , 0xb17f37d1U , 0x018cff28U , 0xc332ddefU , 0xbe6c5aa5U , 0x65582185U , 0x68ab9802U , 0xeecea50fU , 0xdb2f953bU , 0x2aef7dadU , 0x5b6e2f84U , 0x1521b628U , 0x29076170U , 0xecdd4775U , 0x619f1510U , 0x13cca830U , 0xeb61bd96U , 0x0334fe1eU , 0xaa0363cfU , 0xb5735c90U , 0x4c70a239U , 0xd59e9e0bU , 0xcbaade14U , 0xeecc86bcU , 0x60622ca7U , 0x9cab5cabU , 0xb2f3846eU , 0x648b1eafU , 0x19bdf0caU , 0xa02369b9U , 0x655abb50U , 0x40685a32U , 0x3c2ab4b3U , 0x319ee9d5U , 0xc021b8f7U , 0x9b540b19U , 0x875fa099U , 0x95f7997eU , 0x623d7da8U , 0xf837889aU , 0x97e32d77U , 0x11ed935fU , 0x16681281U , 0x0e358829U , 0xc7e61fd6U , 0x96dedfa1U , 0x7858ba99U , 0x57f584a5U , 0x1b227263U , 0x9b83c3ffU , 0x1ac24696U , 0xcdb30aebU , 0x532e3054U , 0x8fd948e4U , 0x6dbc3128U , 0x58ebf2efU , 0x34c6ffeaU , 0xfe28ed61U , 0xee7c3c73U , 0x5d4a14d9U , 0xe864b7e3U , 0x42105d14U , 0x203e13e0U , 0x45eee2b6U , 0xa3aaabeaU , 0xdb6c4f15U , 0xfacb4fd0U , 0xc742f442U , 0xef6abbb5U , 0x654f3b1dU , 0x41cd2105U , 0xd81e799eU , 0x86854dc7U , 0xe44b476aU , 0x3d816250U , 0xcf62a1f2U , 0x5b8d2646U , 0xfc8883a0U , 0xc1c7b6a3U , 0x7f1524c3U , 0x69cb7492U , 0x47848a0bU , 0x5692b285U , 0x095bbf00U , 0xad19489dU , 0x1462b174U , 0x23820e00U , 0x58428d2aU , 0x0c55f5eaU , 0x1dadf43eU , 0x233f7061U , 0x3372f092U , 0x8d937e41U , 0xd65fecf1U , 0x6c223bdbU , 0x7cde3759U , 0xcbee7460U , 0x4085f2a7U , 0xce77326eU , 0xa6078084U , 0x19f8509eU , 0xe8efd855U , 0x61d99735U , 0xa969a7aaU , 0xc50c06c2U , 0x5a04abfcU , 0x800bcadcU , 0x9e447a2eU , 0xc3453484U , 0xfdd56705U , 0x0e1e9ec9U , 0xdb73dbd3U , 0x105588cdU , 0x675fda79U , 0xe3674340U , 0xc5c43465U , 0x713e38d8U , 0x3d28f89eU , 0xf16dff20U , 0x153e21e7U , 0x8fb03d4aU , 0xe6e39f2bU , 0xdb83adf7U } , { 0xe93d5a68U , 0x948140f7U , 0xf64c261cU , 0x94692934U , 0x411520f7U , 0x7602d4f7U , 0xbcf46b2eU , 0xd4a20068U , 0xd4082471U , 0x3320f46aU , 0x43b7d4b7U , 0x500061afU , 0x1e39f62eU , 0x97244546U , 0x14214f74U , 0xbf8b8840U , 0x4d95fc1dU , 0x96b591afU , 0x70f4ddd3U , 0x66a02f45U , 0xbfbc09ecU , 0x03bd9785U , 0x7fac6dd0U , 0x31cb8504U , 0x96eb27b3U , 0x55fd3941U , 0xda2547e6U , 0xabca0a9aU , 0x28507825U , 0x530429f4U , 0x0a2c86daU , 0xe9b66dfbU , 0x68dc1462U , 0xd7486900U , 0x680ec0a4U , 0x27a18deeU , 0x4f3ffea2U , 0xe887ad8cU , 0xb58ce006U , 0x7af4d6b6U , 0xaace1e7cU , 0xd3375fecU , 0xce78a399U , 0x406b2a42U , 0x20fe9e35U , 0xd9f385b9U , 0xee39d7abU , 0x3b124e8bU , 0x1dc9faf7U , 0x4b6d1856U , 0x26a36631U , 0xeae397b2U , 0x3a6efa74U , 0xdd5b4332U , 0x6841e7f7U , 0xca7820fbU , 0xfb0af54eU , 0xd8feb397U , 0x454056acU , 0xba489527U , 0x55533a3aU , 0x20838d87U , 0xfe6ba9b7U , 0xd096954bU , 0x55a867bcU , 0xa1159a58U , 0xcca92963U , 0x99e1db33U , 0xa62a4a56U , 0x3f3125f9U , 0x5ef47e1cU , 0x9029317cU , 0xfdf8e802U , 0x04272f70U , 0x80bb155cU , 0x05282ce3U , 0x95c11548U , 0xe4c66d22U , 0x48c1133fU , 0xc70f86dcU , 0x07f9c9eeU , 0x41041f0fU , 0x404779a4U , 0x5d886e17U , 0x325f51ebU , 0xd59bc0d1U , 0xf2bcc18fU , 0x41113564U , 0x257b7834U , 0x602a9c60U , 0xdff8e8a3U , 0x1f636c1bU , 0x0e12b4c2U , 0x02e1329eU , 0xaf664fd1U , 0xcad18115U , 0x6b2395e0U , 0x333e92e1U , 0x3b240b62U , 0xeebeb922U , 0x85b2a20eU , 0xe6ba0d99U , 0xde720c8cU , 0x2da2f728U , 0xd0127845U , 0x95b794fdU , 0x647d0862U , 0xe7ccf5f0U , 0x5449a36fU , 0x877d48faU , 0xc39dfd27U , 0xf33e8d1eU , 0x0a476341U , 0x992eff74U , 0x3a6f6eabU , 0xf4f8fd37U , 0xa812dc60U , 0xa1ebddf8U , 0x991be14cU , 0xdb6e6b0dU , 0xc67b5510U , 0x6d672c37U , 0x2765d43bU , 0xdcd0e804U , 0xf1290dc7U , 0xcc00ffa3U , 0xb5390f92U , 0x690fed0bU , 0x667b9ffbU , 0xcedb7d9cU , 0xa091cf0bU , 0xd9155ea3U , 0xbb132f88U , 0x515bad24U , 0x7b9479bfU , 0x763bd6ebU , 0x37392eb3U , 0xcc115979U , 0x8026e297U , 0xf42e312dU , 0x6842ada7U , 0xc66a2b3bU , 0x12754cccU , 0x782ef11cU , 0x6a124237U , 0xb79251e7U , 0x06a1bbe6U , 0x4bfb6350U , 0x1a6b1018U , 0x11caedfaU , 0x3d25bdd8U , 0xe2e1c3c9U , 0x44421659U , 0x0a121386U , 0xd90cec6eU , 0xd5abea2aU , 0x64af674eU , 0xda86a85fU , 0xbebfe988U , 0x64e4c3feU , 0x9dbc8057U , 0xf0f7c086U , 0x60787bf8U , 0x6003604dU , 0xd1fd8346U , 0xf6381fb0U , 0x7745ae04U , 0xd736fcccU , 0x83426b33U , 0xf01eab71U , 0xb0804187U , 0x3c005e5fU , 0x77a057beU , 0xbde8ae24U , 0x55464299U , 0xbf582e61U , 0x4e58f48fU , 0xf2ddfda2U , 0xf474ef38U , 0x8789bdc2U , 0x5366f9c3U , 0xc8b38e74U , 0xb475f255U , 0x46fcd9b9U , 0x7aeb2661U , 0x8b1ddf84U , 0x846a0e79U , 0x915f95e2U , 0x466e598eU , 0x20b45770U , 0x8cd55591U , 0xc902de4cU , 0xb90bace1U , 0xbb8205d0U , 0x11a86248U , 0x7574a99eU , 0xb77f19b6U , 0xe0a9dc09U , 0x662d09a1U , 0xc4324633U , 0xe85a1f02U , 0x09f0be8cU , 0x4a99a025U , 0x1d6efe10U , 0x1ab93d1dU , 0x0ba5a4dfU , 0xa186f20fU , 0x2868f169U , 0xdcb7da83U , 0x573906feU , 0xa1e2ce9bU , 0x4fcd7f52U , 0x50115e01U , 0xa70683faU , 0xa002b5c4U , 0x0de6d027U , 0x9af88c27U , 0x773f8641U , 0xc3604c06U , 0x61a806b5U , 0xf0177a28U , 0xc0f586e0U , 0x006058aaU , 0x30dc7d62U , 0x11e69ed7U , 0x2338ea63U , 0x53c2dd94U , 0xc2c21634U , 0xbbcbee56U , 0x90bcb6deU , 0xebfc7da1U , 0xce591d76U , 0x6f05e409U , 0x4b7c0188U , 0x39720a3dU , 0x7c927c24U , 0x86e3725fU , 0x724d9db9U , 0x1ac15bb4U , 0xd39eb8fcU , 0xed545578U , 0x08fca5b5U , 0xd83d7cd3U , 0x4dad0fc4U , 0x1e50ef5eU , 0xb161e6f8U , 0xa28514d9U , 0x6c51133cU , 0x6fd5c7e7U , 0x56e14ec4U , 0x362abfceU , 0xddc6c837U , 0xd79a3234U , 0x92638212U , 0x670efa8eU , 0x406000e0U } , { 0x3a39ce37U , 0xd3faf5cfU , 0xabc27737U , 0x5ac52d1bU , 0x5cb0679eU , 0x4fa33742U , 0xd3822740U , 0x99bc9bbeU , 0xd5118e9dU , 0xbf0f7315U , 0xd62d1c7eU , 0xc700c47bU , 0xb78c1b6bU , 0x21a19045U , 0xb26eb1beU , 0x6a366eb4U , 0x5748ab2fU , 0xbc946e79U , 0xc6a376d2U , 0x6549c2c8U , 0x530ff8eeU , 0x468dde7dU , 0xd5730a1dU , 0x4cd04dc6U , 0x2939bbdbU , 0xa9ba4650U , 0xac9526e8U , 0xbe5ee304U , 0xa1fad5f0U , 0x6a2d519aU , 0x63ef8ce2U , 0x9a86ee22U , 0xc089c2b8U , 0x43242ef6U , 0xa51e03aaU , 0x9cf2d0a4U , 0x83c061baU , 0x9be96a4dU , 0x8fe51550U , 0xba645bd6U , 0x2826a2f9U , 0xa73a3ae1U , 0x4ba99586U , 0xef5562e9U , 0xc72fefd3U , 0xf752f7daU , 0x3f046f69U , 0x77fa0a59U , 0x80e4a915U , 0x87b08601U , 0x9b09e6adU , 0x3b3ee593U , 0xe990fd5aU , 0x9e34d797U , 0x2cf0b7d9U , 0x022b8b51U , 0x96d5ac3aU , 0x017da67dU , 0xd1cf3ed6U , 0x7c7d2d28U , 0x1f9f25cfU , 0xadf2b89bU , 0x5ad6b472U , 0x5a88f54cU , 0xe029ac71U , 0xe019a5e6U , 0x47b0acfdU , 0xed93fa9bU , 0xe8d3c48dU , 0x283b57ccU , 0xf8d56629U , 0x79132e28U , 0x785f0191U , 0xed756055U , 0xf7960e44U , 0xe3d35e8cU , 0x15056dd4U , 0x88f46dbaU , 0x03a16125U , 0x0564f0bdU , 0xc3eb9e15U , 0x3c9057a2U , 0x97271aecU , 0xa93a072aU , 0x1b3f6d9bU , 0x1e6321f5U , 0xf59c66fbU , 0x26dcf319U , 0x7533d928U , 0xb155fdf5U , 0x03563482U , 0x8aba3cbbU , 0x28517711U , 0xc20ad9f8U , 0xabcc5167U , 0xccad925fU , 0x4de81751U , 0x3830dc8eU , 0x379d5862U , 0x9320f991U , 0xea7a90c2U , 0xfb3e7bceU , 0x5121ce64U , 0x774fbe32U , 0xa8b6e37eU , 0xc3293d46U , 0x48de5369U , 0x6413e680U , 0xa2ae0810U , 0xdd6db224U , 0x69852dfdU , 0x09072166U , 0xb39a460aU , 0x6445c0ddU , 0x586cdecfU , 0x1c20c8aeU , 0x5bbef7ddU , 0x1b588d40U , 0xccd2017fU , 0x6bb4e3bbU , 0xdda26a7eU , 0x3a59ff45U , 0x3e350a44U , 0xbcb4cdd5U , 0x72eacea8U , 0xfa6484bbU , 0x8d6612aeU , 0xbf3c6f47U , 0xd29be463U , 0x542f5d9eU , 0xaec2771bU , 0xf64e6370U , 0x740e0d8dU , 0xe75b1357U , 0xf8721671U , 0xaf537d5dU , 0x4040cb08U , 0x4eb4e2ccU , 0x34d2466aU , 0x0115af84U , 0xe1b00428U , 0x95983a1dU , 0x06b89fb4U , 0xce6ea048U , 0x6f3f3b82U , 0x3520ab82U , 0x011a1d4bU , 0x277227f8U , 0x611560b1U , 0xe7933fdcU , 0xbb3a792bU , 0x344525bdU , 0xa08839e1U , 0x51ce794bU , 0x2f32c9b7U , 0xa01fbac9U , 0xe01cc87eU , 0xbcc7d1f6U , 0xcf0111c3U , 0xa1e8aac7U , 0x1a908749U , 0xd44fbd9aU , 0xd0dadecbU , 0xd50ada38U , 0x0339c32aU , 0xc6913667U , 0x8df9317cU , 0xe0b12b4fU , 0xf79e59b7U , 0x43f5bb3aU , 0xf2d519ffU , 0x27d9459cU , 0xbf97222cU , 0x15e6fc2aU , 0x0f91fc71U , 0x9b941525U , 0xfae59361U , 0xceb69cebU , 0xc2a86459U , 0x12baa8d1U , 0xb6c1075eU , 0xe3056a0cU , 0x10d25065U , 0xcb03a442U , 0xe0ec6e0eU , 0x1698db3bU , 0x4c98a0beU , 0x3278e964U , 0x9f1f9532U , 0xe0d392dfU , 0xd3a0342bU , 0x8971f21eU , 0x1b0a7441U , 0x4ba3348cU , 0xc5be7120U , 0xc37632d8U , 0xdf359f8dU , 0x9b992f2eU , 0xe60b6f47U , 0x0fe3f11dU , 0xe54cda54U , 0x1edad891U , 0xce6279cfU , 0xcd3e7e6fU , 0x1618b166U , 0xfd2c1d05U , 0x848fd2c5U , 0xf6fb2299U , 0xf523f357U , 0xa6327623U , 0x93a83531U , 0x56cccd02U , 0xacf08162U , 0x5a75ebb5U , 0x6e163697U , 0x88d273ccU , 0xde966292U , 0x81b949d0U , 0x4c50901bU , 0x71c65614U , 0xe6c6c7bdU , 0x327a140aU , 0x45e1d006U , 0xc3f27b9aU , 0xc9aa53fdU , 0x62a80f00U , 0xbb25bfe2U , 0x35bdd2f6U , 0x71126905U , 0xb2040222U , 0xb6cbcf7cU , 0xcd769c2bU , 0x53113ec0U , 0x1640e3d3U , 0x38abbd60U , 0x2547adf0U , 0xba38209cU , 0xf746ce76U , 0x77afa1c5U , 0x20756060U , 0x85cbfe4eU , 0x8ae88dd8U , 0x7aaaf9b0U , 0x4cf9aa7eU , 0x1948c25cU , 0x02fb8a8cU , 0x01c36ae4U , 0xd6ebe1f9U , 0x90d4f869U , 0xa65cdea0U , 0x3f09252dU , 0xc208e69fU , 0xb74e6132U , 0xce77e25bU , 0x578fdfe3U , 0x3ac372e6U } }; static uint32_t cm_bf_feist(const cm_bf_ctxt_t *ctxt, uint32_t x) { uint32_t a, b, c, d, y; d = (x & 0xff); c = (x & 0xff00) >> 8; b = (x & 0xff0000) >> 16; a = (x & 0xff000000) >> 24; y = ctxt->sbox[0][a] + ctxt->sbox[1][b]; y = y ^ ctxt->sbox[2][c]; y = y + ctxt->sbox[3][d]; return y; } void cm_bf_encipher(const cm_bf_ctxt_t *ctxt, uint32_t *xl, uint32_t *xr) { uint32_t Xl, Xr, temp; int round; Xl = *xl; Xr = *xr; for (round=0; roundp[round]; Xr = cm_bf_feist(ctxt, Xl) ^ Xr; temp = Xl; Xl = Xr; Xr = temp; } temp = Xl; Xl = Xr; Xr = temp; Xr = Xr ^ ctxt->p[CM_BF_nrounds]; Xl = Xl ^ ctxt->p[CM_BF_nrounds + 1]; *xl = Xl; *xr = Xr; } void cm_bf_decipher(const cm_bf_ctxt_t *ctxt, uint32_t *xl, uint32_t *xr) { uint32_t Xl, Xr, temp; int round; Xl = *xl; Xr = *xr; for (round=CM_BF_nrounds+1; round>1; --round) { Xl = Xl ^ ctxt->p[round]; Xr = cm_bf_feist(ctxt, Xl) ^ Xr; temp = Xl; Xl = Xr; Xr = temp; } temp = Xl; Xl = Xr; Xr = temp; Xr = Xr ^ ctxt->p[1]; Xl = Xl ^ ctxt->p[0]; *xl = Xl; *xr = Xr; } cm_bf_ctxt_t *cm_bf_init(uint8_t *key, size_t keybytes) { cm_bf_ctxt_t *ctxt; uint32_t data, datal, datar; size_t i, j, k; ctxt = (cm_bf_ctxt_t*)malloc(sizeof(cm_bf_ctxt_t)); memcpy((void*)ctxt->p, (const void*)bf_p, sizeof(bf_p)); memcpy((void*)ctxt->sbox, (const void*)bf_sbox, sizeof(bf_sbox)); j = 0; for (i=0; i= keybytes) j = 0; } ctxt->p[i] =ctxt->p[i] ^ data; } datal = datar = 0; for (i=0; ip[i] = datal; ctxt->p[i + 1] = datar; } for (i=0; i<4; ++i) { for (j=0; j<256; j+=2) { cm_bf_encipher(ctxt, &datal, &datar); ctxt->sbox[i][j] = datal; ctxt->sbox[i][j + 1] = datar; } } return ctxt; } void cm_bf_free(cm_bf_ctxt_t *ctxt) { if (ctxt == NULL) return; memset((void*)ctxt->p, 0, sizeof(bf_p)); memset((void*)ctxt->sbox, 0, sizeof(bf_sbox)); free((void*)ctxt); } #ifdef TESTING int bf_test_blowfish() /* Check Blowfish encryption against known test-vectors */ { struct tvec { const char *key; uint32_t in0, in1; uint32_t out0, out1; } tvecs[] = { { "abcdefgh", 0x01234567, 0x89abcdef, 0x89fc0a5b, 0x074df537, }, { "ABCDwxyz", 0x12345678, 0x9abcdef0, 0x061dab8f, 0x33a16a10}, { "alphabetti spaghetti", 0xaa55aa55, 0x55aa55aa, 0x927079bb, 0xb275bad0 }, { "Blowfish algorithm", 0x5555aaaa, 0x01234567, 0x731ae03a, 0xda77789e }, { NULL, 0, 0 } }; cm_bf_ctxt_t *ctxt; uint32_t vals[2]; unsigned idx; CM_TEST_START("Internal Blowfish"); idx = 0; while (tvecs[idx].key != NULL) { ctxt = cm_bf_init((uint8_t*)tvecs[idx].key, strlen(tvecs[idx].key)); vals[0] = tvecs[idx].in0; vals[1] = tvecs[idx].in1; cm_bf_encipher(ctxt, vals, vals+1); CM_ASSERT_EQUAL(tvecs[idx].out0, vals[0]); CM_ASSERT_EQUAL(tvecs[idx].out1, vals[1]); cm_bf_decipher(ctxt, vals, vals+1); CM_ASSERT_EQUAL(tvecs[idx].in0, vals[0]); CM_ASSERT_EQUAL(tvecs[idx].in1, vals[1]); cm_bf_free(ctxt); ++idx; } CM_TEST_OK(); return 0; } #endif /* TESTING */ cryptmount-5.2/testing/0000755000175000017500000000000012613166775012300 500000000000000cryptmount-5.2/testing/keys/0000755000175000017500000000000012613166775013253 500000000000000cryptmount-5.2/testing/keys/2.0.1_libgcrypt_md5_blowfish_00000644000175000017500000000006011402211766020472 00000000000000cm-gcry°gíØµ­>Œ“z@RPZúp¶Š ´ØMJއÇZü¤Åcryptmount-5.2/testing/keys/3.0.2_libgcrypt_md5_blowfish_00000644000175000017500000000006011402211766020474 00000000000000cm-gcryšW5²ò¦W%Ækœâ‡ç|cU @ÀV^&´]mô Ù˸cryptmount-5.2/testing/keys/2.0.1_openssl_md5_bf-cbc_00000644000175000017500000000005011402211766017454 00000000000000Salted__ >c õëzÀôª$M–j ­]¬˜á´¢J^ÈšB:fZcryptmount-5.2/testing/keys/2.0.1_openssl_md4_aes-192-cbc_00000644000175000017500000000006011402211766020146 00000000000000Salted__è|qªç)Ã$È0 ¶¼»2‚x€Ryr,æj&8?‰21˜¼Tñcryptmount-5.2/testing/keys/3.1.2_builtin_sha1_blowfish-cbc_00000644000175000017500000000005411402211766021043 00000000000000cm-bltiW<Ø1{ã4²“ÌDyccç²*oå¥ç2SLç5wFãžcryptmount-5.2/testing/keys/1.1.2_libgcrypt_md5_blowfish_00000644000175000017500000000006011402211766020473 00000000000000cm-gcrye¬Ðè +8XÒÇ™¦›í«;ÞôÁ-Î*kü€½aR’ß\].cryptmount-5.2/testing/keys/3.0.2_openssl-compat_md5_blowfish_00000644000175000017500000000005011402211766021440 00000000000000Salted__úvm%¯œ¥„Xpo_L)6µVùø8ÀNž]êH‡cryptmount-5.2/testing/keys/1.1.2_libgcrypt_sha512_cast5_00000644000175000017500000000006011402211766020213 00000000000000cm-gcryGA(ë2"ªIRXÉ®A#ÀÔ Ký]èªÊÉ_äÖæÖ|UAGzC‡Ü¯ô¾„acryptmount-5.2/testing/keys/2.0.1_raw_none_none_00000644000175000017500000000002011402211766016654 00000000000000cryptmount012345cryptmount-5.2/testing/keys/2.0.1_libgcrypt_ripemd160_twofish_00000644000175000017500000000007011402211766021363 00000000000000cm-gcrySµ&Ĥ $ÙŸ¸ê,eXƒ·Ù*$oÍù¦&s2L£Ð"jÜEˆ¿ì?·&b ã+cryptmount-5.2/testing/keys/3.1.2_luks_md5_blowfish_0.hdr0000644000175000017500000020500012400360510020220 00000000000000LUKSº¾aescbc-plainsha1àÎFF­5ª7’˜4l–—l5‚É–¶o×`Zf—ŠºS<2|Øíaë »4Ò̆ñþu 4de25fc3-9034-4f21-8505-d5c0b36e4c95¬qó® üÃð÷¦Bˆ·€­¼ «R8„Vó7º}z¨ ­¸ªÇþ Þ­ˆ Þ­ Þ­ˆ Þ­ Þ­ˆ Þ­ Þ­ˆ m°Æ·2Û,º§­y.Ç0} ¬ÊÝ-ÍëÕ5ª)Ç®6=R½_L?•üˆM¨°ˆŠˆrF‹ÛÈ'ÎU¤Íç/“h7pN¹9ä0´\¨üG'I‡[Šœk^`pà8CÄž(×á97m=t×ÊY±$p óí#[(jM·)Ÿ5˜5]›¦—œ+â6­)kfØ4|«ŒÌ "ÞÿÈ¤ï Ÿƒ¦ £šÆü×–¿èˆƒÉÓõ…CÖ¨íìA'ӌ̲No(«óài¤ÁË•Ü5oF!l¡ê•øº\¬uu4*[Ĩb/‹á_²qÔe(Ã+‚ĦÕNê£tÇÿkí–J÷2ú‰eËß 0ØXµìõðÔRJ¼^=¤—5/Î'úâ ×àLjÁÿµ_ÿJ†¥ ü ÖwôÖm~ØH,I;˜²™ £~ð_Ÿ.‚³“–.Ŷ@îìöêPâ/ iΆÉÜ•+È´pƒÝ¤ÄD5~«ËÖ³¯6@QÕ¼âô—¹ƹ.êFwåYfº¯$¡Ü»áTݨ.”¤dbSë¸Rðn¬Ù~ïíD¹/³¾|eÀ&~æKL8ñ’(y¡Ú_A26BÆ …6Õù!ÇvWí ‡ ÕeIB­$‚ ùõçãnÝ =Å5½¯^‚nÌ?CÊÎö9è½KWôoY\Â\ê4Ÿ2¿S-Šì2ÕEd#Ž© õy¤UuJŽE7°ÐLóÏñ(ɦ†8ÂS£`GûHº2–Õ*jûÔ}[ÜU¦R/ž¿œ·­º +A!†UnJ¡ñÒ:“`’Ã:½(ž’$E†vV¯RÔBu̼‘ïÑò1M?+n@Mس¬bX£nܰkÇm_È*¨ÆžÊâ—åååzr·Í¡gU™¯?åªþž·+Ôø8NIe]ƨfZ¼‹c«bö¦–9³†²UŒ¯§èX‡©ä šÂK©µ>åУâèõ°ð””Úg,ØŒYÛž4&¯Å¾Ô£U¹f|˜¾õù½Ã¦ea©Ó"½dóׯ-/[¨ÚƯ£vNl’¨æÈeà €fp AzmÞ5ýàEºa†€Ôj@¦D5-ËÑ䂵`aÞšÁ¯GþG£ª_\‰iý‚(ÈåsW•V—‡Ö˶;²ï{UÔ@åŸßN.—^u«§™îQ[£ ³!.ó?•¤aF×ñÂZ¸m„¨Hˆc`~óÝxýG]9äw>ºÎáyVv•á«©õ6w2ÕÉÔ88~E…˜x#Ž P:?æMæ ¿{}0G +Oy·´šÒns9¾WŠ¼Ñ Pý³Í7â,[³ÂÊj!Žw9ýÂü~³Â4 œ‘FÌ1C¬_†ÀJ—çav‚ùimDÃg±Êùcƒ{IˆiÂc§”ÞXurÑšõ:0ÈåƒÀÙ Žtåa2l`b4Ù,Psé¶È{èHÕÿÁ‰nV”0õò­Â;tdôøàÊí/Ál©Ž¹>d+‚0“ƒ>ÂFž|L̪ìé9™Š£×À'­:f[¨qð±› Íâӹ»¦9ýÞZuU¬8óveo¦°ê°ÌZVó@½#>™ÊÝN3B vÑh÷j8—ïз:fÂ0ÈÉßרã¹fùç_2׃ª”Ò‡f&1A·±,Qïë­¦ˆg²eeߣ®‚Ò$Ï1–‡{Û…Õ[رœþÕ‚-ò¿±¥%—+ÿ–ÔâŽöé›>>ÝÓ‹òŠÏ4Öå(j‘H%©š”åJËõ™Eneádéh­x á) œ`²0WÞ^XÒG-ñznؤ’l—lË™ÊÌÊ2Bœøé\Ïéª ]I]º[]PµKÃC¤$QÁ[4™×ÏÎg@ððþ¤£’Ú{<ÈXnYñøÖ^xýÕ¾?è:Mß´àâÛLSÜ'ƒ:TÅ"Éç4.$ šß2äÑ ñ{«Ù-]]d>Ñ»;®\j!È9›½×co•?§ /óKKÇÑ`çáû ,›DfT'v‡-,ñ —G;» ºzR×=4c>ÿšá`s¸g?œû«{à½ë™î(æÇÉÛÚü»]W¾ÿ‹ü4Í)-’°F*‚”oV¼==û3w“té'±jšÓ}ø¸óÆpI Ïè¥ß›Jj¬=8Q”’…#ûò}õ£®í¤Mˆ©ã×V¢Æ7• M.ˆšä<Þÿog8 ›&¶ÊJ••$‘²N­e\Ñþ¸Ëÿ¿˜gÈlJµO-ç¦g¯Û†iØ*€y U*Ÿ  nCE­Ù7fÇâr±áE¦»;gÿ>ÃÚ±e`D¬ìè˜2ɺÒ5ËÈ H¶\mE»)¨WÉ„Fø®îaJµalêLÚ.ÁªOýï½ ÆB¿YñK¡<Ú¦Ìï>cH¿sb‚gmö¶U¯¿ä1ù,?zJÙ§ ¸¹úƒqMô«e?ÒHqO?èxc)ñL…ÓÙÜ\j€¶/@´>Á#‹÷ƺª®P¿~BK†8þ¤>J{ÌíÙ*ðà=téaá¼ÕªÀë¤fÊ0q‰Æú9u­¹²eÙ¹ÃiŒÒ×;‹%äœújY‚-…ç_Zñ¢7LDl\:¾ŽL«NÓ•SiðRB ¥ñ›é¾Ãÿ,¿ÏŒòQ‰²ÆZ*§h¦gíˆáO_æEæÎ×*Ò"ÇY8§®Ùëà´µÎÀîü>W ¾”Øí»>; ovË7Ë͈‚´ž®&‡)ZÂKüÞ‘Áj=cNHÐ<ŠÖü£±x’©†Á.xP´ØhpHq0Uì6pú÷U´JD•{ÒäHhTŽ&º“ËiÜõ03Cð,„¨¤b*QSÃ…KÉXæ)-S'’vü.à™!Ÿ|¹Éhäê8x«£…zνÂl OÖ›±&[+ve’ù8m­á¬X è!¤ä_…2øãƒÅ¾ÉoÍ«ªqæÚp‘ùî„zi&!‘áTWerP:¨Ov1‹o‹‹LùÚ>´f)ZlÜ@0ÓPïä /œý§„ª³†XŸT;N­Æº:Q 'EþòOßT lH—ó ðÔÚ?ê9 Q¼‡½ ÚMi¸iGÔ•½3 Ôâ§uljÑIpãÑ…±I°“ÇÁ¸[ ß0éi§öò6â×|6dÔV%F0_èm¤)zGÁV*Ó·?v乂¹ÍmXÿÄS ^Ð|2à_Õ,ÖИ3KDó1J6uSO0ê‡QGqӷ憇Þ~Ṷ́Ωv82Ò<` âö8r$—´èüï’XŠºÉÁÓ%îkªªÙx–³vÓ­¬åKÏ»órEòç¼¼6‰Æy:c9ûNû¾Ëó—Ç(ePÍuºF,i=-ú?CUÑ‘@nÀ«}K‰Ž¦Yó_dÅ¢°—Tß·Ìt /Ý,1Z†T§Ÿë=Í`yûE9*›¾œ/±öODˆÆ×sŒÐÚó´ƒ@_ÂbuLú09iCÒ]má§œæC ÄEá)“áÝv8q5y‘&Ó`GX;»è:$¨Î0gúýi¢0Ÿðm–=L$óŒ ”þk$z¡cƒ×_¿ÃCJ„ºp€ò³ZßÖqàò u¦"À5Ì^ÜõæÊ@ëÝlÑ©<Ç•<Ç›#–·tuŸ—rÜ/^i(ó¹ó‡Ë4À™l‰Õˆ[¿‹ÈÙ­Ò…õ@ÜQ¨7ßT”¯Î?ïe"О ·eDhl&-b¢Ô¡i*1‰7-kœ‚ ýqH1÷& ™¾\[S k¤Y­O‰C }]é.L“¸A¶ÜGºEæ‹HneŸé® cffWëŸÿv‡@,âq€•6“mµæpúvŒ‰ú+ê¯)¼q¶¾ê¹êí9ÚÅ/aI˜P-€Z‘o.¥«¹«ÝX¥Õh¦Ç>Ç(œc eÑ…B%2€{­”¹‘ÍcCþÝšj‹÷GH–‹Õ}gzÌc!uĆƘ7öÍJÓMëKË6¼³Ùw…ÙÊ À»€Íi/ά'öI ÛF8ÖîèÊjÁÑe”Ís~ fòô€S ÷x M}dÀ@@£¢è.ŽGÑl„;Xé z¿› Æöo/™ÌVÕvó¸³â“§äw>Õ(rX;^õAk·¶âj*9¢ •±X–ç~(‘'³ˆ”«8+­tlþ¸Îb‚ÕRù°ƒ™YÍÜo&›®¯<€½Íbn½û×JJ$À3œMå¢;_©C’×!;gÔħU¯c­^òén¡‰Ø{ûôUÑâUr…8;¹ ›¶ÞvHmšüAìƒøÞ†a‹]÷ÍþŠšc=JTÀ¼Ç]2Àº0ã‡uïÖ|v¿B6‹î*tÙÖâ>ý 6N)'.úŽ?L¾ÃM<»qW*GgÚbi#úÖ `àÒ¥š&¿ ä2+"â² áRHÉžºS#,ÞÒ‘=êØ÷ÂåÚm¬†m5>§·vÿ;Šˆ –w+ž–ookiI³ á¼‚1Cô²ÞÙxPB…ͨ…`j$ |¨À»Ú…1øÎv<Þò÷…œÔpYëŽÐ*¬ÇDñÅèçi '®*—ù?Ñ^v”LvÙÇŠ4,ÄK”jÍï3øävD»©XUWp$ºh4®™ùˆ3—·Š'ÝmÏð]{RÅ\]æ‰/C;ÿ±P#nßùôž\ÀÆÖƒ±).–´µý=F^Êò$t÷-[Ó\B9A¡i,›E¹h…Ì&÷о½h¸Ý¯â,{ËvØå`\ØÉRÙOÝâËøUAê‡ÞH+=ŠéôÅy×è_‡Ð Õ‘4E÷,žÑåîñZ™Ãú!«&ùQâ9š§ ¤ ǸþƒsN€.÷’< `hŽáb”fY’uÎß½DzšãÇÒJABÓV„^Ò[!g9bÌà¦É®[˜´ÃO³=}8q½çV,µÞÞŸùþŽäÄaNÂs¦Ó #Ú X„·aÃA!­ô·—*˜ä¹M¤’ü8£†ÖhxÍ.ó ¬ý¹vÁ¡©ÿo}¤ÚZ¥H˜ã›€Ê” W(¿`ÛÀ<¨y.²Ž6§éBœÃÄE LltÙÛþ˜‘o&ÿOé~öŒ õÔ`ü/Ü9„EñPiú”ˆ–ƒ|”bPl18ôm°hÝÚ›<º>,°ýÁµk‰zoß^f9 Ô‰›kzÒ#³˜Hàr²DŽ”€~P®]ŽS^³ä (tý-ÃíŸß²³Ÿ¦–-­Ñ#¥»ïØ2nÜÝ´êAôï¿>g­£¾}²5$ÖH—YÞðHƒÕõŠÄµâÈ™»i,”µØ /{gÔ½Øúy)®òt™r/›˜ñÇ#°V(Æ·];ˆ´ÎjÙœŸh<Û Z­r+ùÐݵΡ7kãÝ¢ß|Ôû©ƒ¿1Ñ¢ƒXP D“ÚpØ,$Œ Ǭ`F_ªEöÜc¹ÒÝfo²²ìÐÛ:y÷‚£x,gXßqŒ¿›A,>º›Ø¶ðó—¬A}†œJŸüSc×ßz'aq¼jÖ}AÏ"„þ.æÙ† [ ¿¨ˆøô6^}šab.—eBzqàÓNÉ.5 Zbìv¨åòŸ`õ¾ïH®3syFµx†±lšfu+`V»¾fJN¾¾OyØ'pPܹ´YoÊTYerƒf">™Þ—»ý¿Té0ºjÇuY:¯ãsFÚ´‘ò÷MÓ,ýÔÇÌ-}à¶VòK:­ïô¿bE•P5ÜOPìíéoüÂÂÇW2+ð‚ǬS(Œ¢¤Yi‰Óüž´Ðh»‘zóä-bæ.”&eÒ<+6%Æ}\6Áà5˜d&·HwÜÅïmËK"i‹ße÷f‘(Üô?Qz,"/´iš·æسÚhø;;|8ìG•‡œ¨%ÈèÚð&k–`²üÄR´S/ìê½á);^Ìòx«á÷:´!³ÉŒ–ÌŽ®3çÒÞZv‚Ç`QÓŽZ?õê3’w³5àÁP¢¼ŒHGjŽo;Ãn‘Õ¶ƒD_¼lhÇÉß¿¤¡9̸óûÄx5+ü±¨¨<©Ú¬NmO6]=ɵ(‘ôü%æe?Ç­ãã †åÇ«{Ê©ú¹²c´Ù_kâq`« ã¿‘ƒ;ae´üëiÊ ãOm| Ü Pk¤4›H!ÂyùiÇ(‹opÁsûPâ$| ¯?Wúœí€œn–¶Ô¬-1°ºuÔ‡DðÐêšQÓÛXÄfM[°q1ÏG™«jyRìZ’²¿i²•æ)œDPœ£ˆÞëÃîH¡%æc+Ö”iÜÿ`+þeýí é¿„°¬:ÃÂÓ hFŽý… ½Ê¿ƒXÅý¦ÜÐÊiÛeÏÀÿ Ñ[÷Sò WQ0ûòzaîßSãå~.¬hϴךãÒVw]n3Ñ°ŽŠ„sˆ+{¨·¼ÇãÖÙdÇ ›!™Å§Wµa’£ñpPåöã $‘cEOUäh†óŸ„—^XulI-àÇ{à9-æe\ÞƒäÙäšÈt‚§^/΋ջ|owåâÐh—›Û¨HÄŠUž¾;»Y¡Òß´ôÏ÷ÉGÇÞÁb^s½ mZ³Ëo`FÁxí’4+üœ›iìµ sI‡þ5:ô½QŠÒÉWÒåëÿ¬Zö^„Ôp•88ywV ŸŽ+´BÐï¸?¹‹Š:}|Bb© :ööØãb¾ªUz¾ZÑ_†·Š £Î81.X8;~å×KV¨ÄHca„Žÿ]¸ŠD1Àü8S”ÚRšþ„ ¥nëÅ3‰¬7êæ–¹›ï=å¦P¹ ®0å±;3ÏÎOï];†=s2çϼ©|§LŒ ü?I”Û}í«yòì 8CÌŠ)!(­8”(–Þ°7–n ëËÿ^ÌÙBpúS/«½¥÷Þ œê(8…FÝ=¹ Þ®fõ’.ÿä3ß'u?{åž‘‰ 5™hŒ,ÀéL^× ,šä_'?¢åIE{'„«Ìáe'šèÒ^ ?ÖŸœôPÑ…œŒ·HgØI“P’¿âÑ׬Æb­!íÙ&µ©Uù?ÈÞšQ¿Œ~½Þä¹\ÿ¨é ™u‘Á)>ÒàÁãivÇ)%×+ýß´ß“ ³·mUá¼Kn †ìÖŒ#¥eŽyˆj“Ú[;ßí^ÂË¢!h*a+†¾0Ü·´ÿž§®—‹A.Ó ðoP‡¾ß³k§ÿvGÐð× &“I­¤¾Cùv#&1¦ ÑwG "ˆÕD†5ˆ»`Ñ!·o¬”ú6Ùkw¸ž/PM“HŸPVÕî~:mwpý­¼®˜~“¤JxÚë/7òpi¾²<¡úc‡,ùÓ)Ÿ¦®Ör(ÕmS#¿øÜqhÌíIc­õK÷Fš—â¤èfD Ë­RA^ÈË…õF*´@¬ÐBE#[»év:ò Ð 8Æ#;´^Ö£bEÚh“-%Ú’¨@ÎΨŽd%Ã> zg6C¹ð!Yø#¬Yl”Y¶APÀ¸ÂÚçw}‹+oØ€Ì ð7<€DƒÚÙi;@Xw l½ 7Ö Ú@³†ø« 9l´áË/\©¨"„»ÛfP@0=K™)ËöÐüA_Ìó¦@Ž=±ðvöBChÜ Ö_”U®T …ìz[;ýqô‘Yìiáð`*ó¢c§bŠŽÂbâ#!°@ˆl¾³”Üï»b+Ã8ó[+IÓnZÈa1 þz½t«î•½Tp±˜LXÔY8Ñ,¤(²Rï¯l]nï¿7L&èL ¾åfgrMž„g*¥’oΙ0q£FWK¸ÆMÓ±·g²:ä³âç*ZšÓåò å\¶8h4ÌOú žå A…‹,™Ù=IÂ*ÿËH§*ž­QP‰•‚NhýÔq!éçIè™é…ø¦€¥£ðÏá`ö°ßý"'˜DwsßÄ- ò˜Ç2l‘%ŒDp ?>v>Án›àz®ÈevƇx‹áÈ’êÆ.ÈmA³E|ÃúÅ`J°K!öÓއ„lBK?‰5š¼Ùì¾Ò¸þËNKÜùòäÒFçòÒ=ñ>L¹hœ?•ãò\ª‘)7£c¡¦ej)ë¼þ~—ÜMDÓgíiËÛ︱7~P+lΑ§ÿ©i®¿ÓTw†—õÀÀßÿóÀûôãT >w*”‹Œaszt5 ÎßY˜ü{`ù çÁ³-,h2ç2* ·æý…²æ87ÉþFŒ´ÒàxÃDK¥X•éÙ´‹ÎZ2ßqʼnZÔµ†PÆXì`ÆRNö®#l`Ú7KKi:õ[d\²%DÇ¢¡î© eÿ ×§Nij›DÌ`;gÏnÛÞ×¹ üä0‹?Šß&™ºU=,iþx™:]ŒçñÇ*±ïÆRdNcû„8ßìU­»„Ñü‹ŒêUP•@µÜ &DäHÌÌãòîaÿ§¦V²vLAˆâV§³ yíßêU5¯¨íΗV3ZMÛQªY_ÁÆÄý}œTFœÒ˜_uË]}£:¬Ü ¤„òpWúr¡®¸¯é^õ÷"áA=j1aë!G\Ä%µ¶&ú²Ý‹Ÿí ûåŒ&ʨ~Óæ8ê€#“#r6¶ºðÊx Öpl¶o µõÚ48N…@A3† ï1€†áßÂ0Ö.Y¿PLqH1/)ËH\Û¶iî\ ½@Ò—3EÌ0ß–—Yócùøkl/!J¶gëÍÈŒ¾ãÄ*v<ŸØ,,øF*ã]Êñ0zpqOû‘aµÐ¬Îs û;s ë÷ìM-ð?Ìrf®ëJx+̰KÿdŒ$wG¶9q ýjMh¥“Ô™¾¾óƒÖ!ZXƒYÚWfýÏê>züM–¢Ÿ1ÂAïâˆgRgl-c©ù_±'1Ý*j»È¾™[jç.WÙ"98“-YJ“Psx¤Óƒñ½™SºOW`°­ôMoîsE¡m ää~K;"×5{᡺'§€I~œjïÄXÆ3«/G–¬uøõùó?•šÓø³!§Ï±.c7ZZpô´´g|žè`~†ßg4©žªÌ`ŽSòŠìÑËoHqnþ?“ke9ñ¬ë™dæ¨SC•©|o‘¾b2¯Aªc´†{¡ +І ˆT#auhß ªi\ k¿Ù#þ%-êK;åæsª<é™? –n¾2gö nT´‘º|‹Ý)[+b’áp†^X­$ßk  ¢èwQþãehõ‘½P9a€ƒ³®– Ìä@êÄ…03AUja<»ÀÃ'òÑnë-¬¹±7#¯»Tڮ쬈I4ï–õÕ?Ó¾ø+4ýØÀÉßrÌ´ÏdùDÜšN¹÷gj=VŨ›så&Œ%¦úà@iŒ£ïÜÚOú -¨0’g8f©$[ЬêðèEdéØ|# |·šû ¥‰NU²½`4¨ œ¸—Çúˆ~Înž­Fî©dV†Ç°¯²ï1…‡mY£ï&î­»Õ°¬¾3[µÚ}(Ø@à°BOoœnµ<ÅLLù*IP¥ 9E@LÌäW$Þpº9ŠaY®Ç^¬ì$ŸÍˆ>]ì#¶Y•ðK#“GÔ¬qCÔ 4¯4¤#ï¿)oσ†½öûÑG[MÙ^ÃK³3õ—u rTë‹á™Ÿ·>¤â¹ ¸óé¯Úg¶¥©¤¸DÇp-÷<-·«¬áœ¢ÿBÕ† °#þ‡Sm˜œà›;"F()ÅkC›YyCª ö×Óž…üw¤;íë%8Øð¸,ÞÔû—ÕCý>ÃsÄ$¿¡/4 “†K“CÐölp{Ã&(·S¶·ˆèéV奸д2jµöA…m‚“ŸJ. Â[fžLŒé"€¶¤~V+m ïeÞ²ŒzNhš%ÐB¬ÐÓx5Ъð¯ìï“À8ÆfUH=p­†Ú_K¼©VÉ÷]/$óx°ƒÑyDŽGÕ yÀ0¤"ž[â0íw@®ŒÇä n•<«G3æÏ¯× ³›é÷ÎξV¯üå\Õ£nÒN)ÂH“ÏòTJaCÞ)ÚEúÀΉÍïqö6"—ÕýÖ][ÁŽª–1‰ÎzLBñã™ç•rÂa÷J~¸‡æW%Z¾JÌ|¯rÉfSŽ·„ 2N4vS@Óò²}æÎÓK”âÉ"»‘¨1cÐm>åÐYûÕ–\–”Èe”’°óN[/á{Ãկήë1Æ«p8SG!h~öšÍ“ÌGug´ÆÌó÷ž—€D&éúÞö•$à4ëé ìN™ãô£¹ð«?!EáØýHÄ?^¨ðh¹þ–c1¨c)X䣈뢖$ø—)¬Ã Óy ¬oÒÿ¿éP8‘/ÿ°ÑðÊú×õ´6’d p)(:ê·›fÌ•I mØ6ÝÁ q÷N.™âÂïîý>7=¢xs£{± ÏŒ‡x£°í«ãF0ììãþ{-ÁÛ!ä´wÚ)@>¶öcÃÖå…=6÷w©9­?·Òâ G=iCÁ–­ãFp¦á¨eÑrCoy^¹ž)«Wâ.0|íUKbþ1Ù+¾r’>ŒC z”ŒY]/»ÊwwëßȾE­$[†6̇DIÝ(M‡€{nIB‡fq¥½Þ¬Ëvû­P¬w¯‰"&~»^ŽhtÆŸ üföÔ)ƒw…¹¦e¥ £'H£S™&ÒûóP*éžÊ?´}Ù»SR¶ÿÍx ‚ˆ¾°›Btr07ˆ‹Ù–¦rn^ËÑk„lŒ,+ªÀÏ6T÷ê·¾Mâ 9ÿu±kœÈÁ@–Ö„Î:’KN¿)Óã«™t'ÄñûO~lz ¯ù„¦ç¢zˆ´ÁCsЉ"›…¼“Ç 5n5r3^®b›ŽªïÖÐõéMºÊ2èeÒÆ‹ þót8LÃ¥ äk”©Šçñ8?w*Q¦Ì aô¥ WÇØæäêÊ€?s<ó||Í3ÀΉø‚ÜtLŸì×o”ø×lØæ©”ÕŸ¯¬ä_SQÐODή” #f’(’ÿâžLAàõ²u~HÆáο†ê'ú§{ˆin=®\üF"´'¦a¯¿Ì‹øîÝÐÀ<¯]€î ÎYyùK1|íSzÃsíéðp Ds À·Æ\÷‰üFª`³k*sE4盧k¤Kw Ñxq31à”ÅJu‹^ʧ|)…*œI³•à•±“æÒÓV¿OË"2! ¬”vßíÈ–í}õsߌ0ëwÑ>bˆÇ 2ðƒv‘•bå¤åÉÄ…&¾ŽØq‘QçÌÛ®ù‚¯ï09Ácô¨0üëì,Rãq„†©bÌy7–ÒîM󬼔%Þ%}¿Ÿ8Üm’ÜÓ½^áH"[Iƒ*ø¸+_b{w¿¢|?½5ÌÆþûÒ‰Ð**¢~8Í!ŽGýc˜B“j~]p5ªÜâNÏ–¶©ŽEš¯o&ÜgÊvx° Õ@WPb¢o”c'ŠOà·dx’[8Uvð¬Ÿ|0á]¸¨RðÚ§Œ$Ôë¨IBž4Ÿçr&?«Ñó¸Wz0òqïãM}Ögeº³Üí¯˜™|ë‹PkH«‡*¦ç;ÜØÂŽa9û-Ìd.H<¾‘xð1>$;Œ_ì°‹ºI71ñ3Ó¸G23ÒJ4Ý"gÊSåÂ`EMÍCªÙO@˜¤W8¯/Y¢¿e‡HÒ0(Ñ"^!KÅðl qX™®"’>‡bœ·¶qrÈ/¦"3>ÝKÌi¢`Æßâ¯ø9Ófùõáú|‰µ;A¶vÝ kœ´‡ê¸i¦IVxgÝ8¸Ø@! qSDþýRÂ+·ˆ‰wg6á!Í}'%ßPÙ mö@m5i÷ž· ŒW¬cjIGuèL¨¸a/ãA O˜|Eð®´O#&嬊£å` è 5hþÅïœ ‘'ä`5Š¿’¼½ë‹­ŽYošŽ©zª5 4ë ìí#+^›J‰íåŠë¡¾žÌk|úh!gûTì/«K” ¦¯ã<^Gbv ϳ÷OÒÏÙß+x/±TfüQ&ä%@Y7Å7³Äd0wýt+ç¸Ìòcô·R³®ñ#™´:}ÓW z,Ç™Z¯e÷nÈ».€V§a9›KZ8©¶N$À‚—†B1íá4³A¨ú¼¯èžª4’ï)êL‰‰»TX­«ë‚Â5 %<çcJ I0 {Ý^ö̬`ŽYEU51íWž©&ÍLýÈ(¾LKOš$'ŠdLà,aÌFCwo7¯~ 4¦Kvò6?†”•kP;úê`‹ÎƒOíňM°k«²)$ä0„‚t©E÷;ÌÖˆ)‰_¦àp3éö;bÌ<Ýb'<€ÍpüßE!soÕ €í,ǵÀ¼ýÍR9oA ¹©ÍÆèµ3Óá‹éßA“@>Aõ”§ÝŒlm52~רy9‘ÌN"e•¥{(:†÷±¦x¯Áœ~F ÐTÖÐà^(BݘÓcd!#¾‡ gEX€³ïl©>äÑ_Uó9/„âø‹«È¿ÅO—Ûô §Í©üsŠÄ#,Kcu¶p‘¢å7>ÎN3›ò$ÓŠ(Mœù ?íå_zWHS£Ìà0 \oàiÎæ©×ûÛLsÁÙ¹˜içiz¥3ªœ`*-Q^EUz-UÎ6ÑØk¡h­T÷cRm'cDâ¦&ÆZá°ö-„è­«ØnCD/ÏçÚ]êA€«ýcté ÈwN+JsEâíIÐmÛwLA¡Æ¦½#zz uW\ªXxsP¤bN’küÛª 1ÇÏŸ²RlݔЕp 幪A£E¦‹W6¶n %2MvkZUycý|lÓÐØZ 'è @n®¾(Àò˳±»'™SÑøŠª^ì¶þ‘] î¦h¹Ai%O1eÚç‚É­I\xý<3,’A<\Q~Ï+ÔÕÈvžOD`q‹~C–ðrzV…ä¾¼N/¦ÅÿÀzáIÒŸ¬¶ïðÚÖ¼öÈL˜þEÓ~`¡ÆX½t“o«ÑŠmK‚Ðpía÷ð|Ü]«ó!)ìÊ©|r0̉Þ,•:ñ¹¯1Ò¡×Å•ñ]ýCš¸ì9ßÅ”hVd[æƒ4¤\¡˜NÅ)khÏm§…uÁts|ÐÖê¤Ímž’}ÝVSDÄ"/DæCÒ“•µ¸Ò~ⲟ›ñJ|‰7/Ĺxqä'ä9§îùådŒ ðõÆšV½±Þ+ZŒ=îg ÐÁ'¢Têϼ‘"š–õå\ý%ëîyò3`'>`.õñ=ëb†à«EXãdÞSµiûúÌ<Ý颇ExZÀ]·éí~RõwLÒšTM‡6aLõjL¥# (¾%—ùÞ…”F_JONr¢ÛÒÝá>HØTïô8ÚŒFåÍ}¬¿=2"H„:Δ¨B{Þ¸R‰0ÎÓLæN¨û6‰»ne×¹æóºò6ÁKö›>X²†ª…BèX·ë§zÔsCÔMnS´ýo±Û×WN(Ž„ý„‘´hêÊ+>+™’G”v‡ùpø ˆD¦_¬‚æû¬gI©6>¿ 65n"™uÍÔnþšEDñOxØwœ+I!Iý©ÈÉ@=Ž^a_krJŽo…l´º&iè!âÕÛ“d:)¶Örí¯ŸÖ;ü¡ZOý¼ÒÀ2ÛmûxÖ …‚ †6{U“À>Ö™§¹C€ŒšÝ¾M²`3‡§0Û‹Àž+þªÛb.´÷˜è‹"sû–¾†o6 ˜ÜÔL}Xî©ØWZÐc–N¤ð ¸ìLe·•2:Yö‹AUþ·N”þL°Oµ€¯Qóþ¼QÚ»5çg Ê:«ÜÄàÂi °Š|p’^LœDÀ!СaPbÒïæÈWŒžú6ïYT1+ZGæ¤2,}¦esû3FúÚdÍß‹FI{Qå/Ùñª&4h™îû=Lºr¼ù3¼Ñ½UÚtÔüå©™.4hU8‘ú¹¾*–®ÙÚg­CLNóãg(€ !µ$ÎÓf ÃN|~d›fd0Z"“÷÷I ‚Ì» ¾ºŒÅ%A¢ ¥‰¹ÿä ¬×ñó ñ¶«ÛªUicŒ#« ÃANy·dI”½’O¡q†Âþ˯2_1»m6ëÿ¢ÔU¢Sq>G|—~ß@á瓉«k½”bSÌŠãÞœQ]‚OxÇeÛ¢Mç8.É“6QI–Æ–‡]JŒ?ˆpÕ\’ …~ðúÂEðËï1ÄR8–Kó‘„"ÆS³p¡<Æ&,ZB×ìë–Õ­« k¼‘8¯ÓÃÅS 1¤°†6¶Yç…YÈÇËäHïzÊ!¼ª.M—´¬aíçŠlå‘MÛ&»ü] ¤[eF]iM·—IhPz²Ò ^`[ö‹á7‰0q4cïëœà‚ÔKŠItتÏYBàZ^bU`…,'³Ñmn§èCU¥My (/:â'˜¦›Ò.*ß7©SS~‚äè|S5´õóÅüôO¦.pÌ©­’ñGÿ¥Àr‰U”ȹ.íŒt ²Ÿ¬ù"c‰‘Ì×–—ö8¬Å ¢Øè‹¬R[ì)6mqõLÄÒÉ6F«lo0ôfAŒ™®«S` -?pØýÒúEtƒµ Îý)„ía+ßËïK¬0„NµD;ãH;ÚeÃkÐ[ÿ¤œ { ós\ Jg5‹dôX}9îécriâa,F5Ùdùßéu¬Nu-¥‹z=E[ˆ¬$Ù‚ö—žL—ø”žK×qo¥ÛÒ_ˆoûå|ŽrCÌÓƒœŠ •šÚwøÿ…‘¸Þ‘ì V[©šl<Ë¥€†Û¿dº¹ËìÝ4¢G7"«ÊŸ7“’ôgìæO&µf~Æ+’¢¥ËqIŠhûÃÁÇ›ýL‹5Œ®ŽC–×tu™Ã?…‹¸¾"©Ï@'¹xZ‰)ŽýË#‡ž˜c†þ HëûÎõiБ+–õüŠÍ醴jÞ±¿7ðø ¿ÚÐöï=ü^´|þ²hnõ|`à (Ià@-“¬©c­ÊÊ7=²*HØøUGõPÊáí®N˜70ÑP›Åi;ûZ:ÜñSžÜ?Í­WR‰XÃÒ¸X. ç›Q‰ZÙøÝº`~¹7ê9ãpe„É¿jð æf´>x4’áï6é²#µe5®=küÚºŒÈɦ¢{×\›’Y‹¡Ê¸=*qêÅx>f§Zõ¿Ä¾'xKõý4JwœA>•ÇNýûq?Õ85!a zæ.wZÝ…²á8dÚ*ôA|ñ)û„æºs^^¶Wré–¸"è ¯Tk_|äàƒFoð!W*nMTªÆ'|Gohb³A+ßÁš5¿'5+¾[Xcf¸nÁDG£"Øóùv¿FKÜ4,ÅwF:þáv×¾¬üœs¬ì¹‡‘Û De~ãØ •QCEÀû"üÀÆ0=‰7ŠÂuE‚)0D‚øY ÇVí‘9ÚXbev )¤ãx­S«O4$mæÀó`…<<`îßš¬çy¾"€7úlãÚì:Mýò\˜D+܃dÓÍÉ)w˜;”G¦¤ fÃg£Kxz+¦X©ÀÃD·OkënP+”Ì—m™xr±"°´rø6È_¼Êð?3Î2§}– …¨GϽ€ëH™þŸÊÇÎ%À5Qb9ѽ-~¡ÿ€ ´QÖª@è16"Ú+,+LŒÿ&8½‚¦Ú•šî¾UùMxåªõ(Þ¶Cæ¼^UGn3¿^ù}¡=Æa*{7š“ÙkªÂíñÑ+#GW(õüQó¡¨ÛæažÉ4’©ŠøÒˆ(èð€¶] ˆ¶bWSŸ¸KÝoO„·æ¿üÿb‰&Šã\¬8œ.ÍòO›ÉâlÒàW8¾¬ZO"¤öúsF¡µË#)u‘Û,÷Ëwvïæø4s€ñÏã¥WÓè´|efj¶`A*ôTÌÄE{›œ‹ÛäßÀ}Ï÷‹ÃØN·Q›‚k#l"ãS—Ø6åТ¸ KñÊh-•ò˜.{X¯’ùd%SíÖL½#É{$‚;&„6ÂPƒÐ¡{ÍYš­¹:Ö¢­üêÖ=läU¿ê<Àè©¥BoA…¹Ë¾Ü*ˆ$ЊrÑn£•§Î¼–Šm>ÝÈC:˜A,3‘+=sŽj‚²™1©P£Õ‰}•,äUc¹¼ÿ.G‡µ}αú]±8«éŠ&Þ´ª'lôCÃýÞSUZÐÝP#é ÿ“h Já2È݉ÞÄ&9§’g±~I¾†©šV9ñƒAˆjs_År*ÕðBÁ·¨èIð‚‚$›H_–YÅŒòf„äÐ:Qa)] Êî.ìÁ+þ“•üúößÁ˜ŒQ`’ÛÏ[ÂÏïÄ\?åqOS!ÕvQ€gêÿˆ'HJ—N0¨ ­vûÒP,[á›ÍþR¿hCáp,Óê“&€$ÑÿG0Ò™öciÿeôÿ‹´\(Œf²°¥i—æJ½:´•GSú*kŒx ÿ1zû4ñ1Ìóë“c;Æ‘IúV—xúè³'ÈáS¿u5O&ŸÐšûBhÔ WÒ+éUæO¿ @ØÌ-¤?ÈÈF†ÒSB÷v€3PE)ô|ÈCAŽkªv@«ÏÃ¥ÏõÖ2“î€OZ|ñéd°˜ÆÊуҗ¹)˜OOz…¿:ORW¦ÿTίÎ!Ÿ±|B|¾ÈyŸ;ƒèýñïQâ-²ý%"S’5 ®›øcå ËlBØ‚¾3Éa‚\òÚ*GÙëÖZEJUNN“oÌÏâOÊØµÇg²¸9)·ó&EkVÔG Ý>?N×]@o¹…2I¢C§Ú¯ê'=°ˆÔYX”áž+s_æjAüÛä'_]3¤}0'¦'»9 í}³û6!ñ6öÁ’;‘‡½jw‘ieä0rÿz“݆Hl½KЛdœ@ðá6æåÇšœ Ùùà÷Ï«’m|aÛù Ü¥µ å¹°N¤ÓWK͉ØàÞHŽt½è«ÞûDcßùG$ú·;oq—÷|@*Øõ.Ô @7±ˆÕ¶Ÿœ–ä šÄZ`IÛWJ¢RW_èŠ`,WFåüŽpP…¨Ýдï^EÙßò,±|ÁàÔG›ÃdÚ®æÆ§Õ¥žÔ´•ïaÔ-¬Åѵ{ž<9ñl“_‘~óªÜL*2Лz.=UskbuôäR ij¹YaÙ¨ûô¥1sfZ†X0@…п¶­Šêœò ¹·\2Ö^[‰ŽæÙÎŽsýÌ_ù²#Rþ«×—nÁ…MAD )mxá˜0–=Û ¼9‰ÌZˆµE5ˆ)Nþñêvê÷}ä›m¯È,ñQg&øD˜£Q„äÀ*„FFɦbþ_ Ž š¤io S©–_8Wg×ß’è?Eœ„Í,»Žv³r¥D›šz‰Qh;Kï ÆÙíY Ö€GÊöYïžG‘Ðó`¥€o%̈ ¬Þ8J;Æ0Õ2=ŽY(%rÝPVªõ0„fIö5t§]jív½:…|–£¦ãm_þÁ`ð·ýÛÑ¿©=tIGõh0†Œßtë:hHŒ»0JjFª#ÂLîù%Ûßr]küˆ€AÀGg nÏIæg¨˜Ûíy S•Û&ýο2s›Õ•±.knפVö9pLc x^vÄÖPíÔrGÃ|¦pìi‹¯*G\£œý€¶ Åò¶}MM¨‹4ãÍÃof e°>®%&€Fýaȯ׮;?6†Ê“á-õ› ¦TUïù)~=<^Ì1—2 ÉËÌNRÕ1SÉ  -9[l¶+Üt¦Ç4¥ÖCzßÔ–õPüÁ™Ðο)(ÅEýÕæö– )Ûønê“l›Ëë…·Õ,¨ €¨lŽ¡òºÞ—è´ú>½(º‹E®|Ç‚œ]"âWà^,FAi$Ie'6ÅÄXNŸ³¬V%Cj¢â‡Ÿƒ…J6 _.‰¡I®Ý$*iËÉòˆÕ…Hñ~y³‰(t ršS¤{üqÓ„F¸°¤:¢@G&|%!2¶ó¨j4š nö—³ÏY‹yVÙI+œ=sJq¥x55¨OvD†ë÷°ø¸ŒRdÔv0Uç™! Ê\Á§µM+ýC/p‰›·§r»Æ…º«È¯l=4ÒO´½3›41bóî çñŠ%¤(¥ž¶Mèu‚Y|ø·³Í7k,njÓBŒ(–âM’7Ð~¦–!Oªž©µËhý†%ÀR»µìÕ?$™J_uogÏçÖS"Z怤ç"䟦 ªÁpÜð&ùkI³^ª@CWßDQ~ŠI&å|bUáš•*ãoC ŸúYœ"ÌŸƒ ©§ EC×·diöŒ¢5hJT÷ M.­í†o[EW!™% ›âÝò˜[™òÒ^CŘCº¥gýçx.­ë_¡)¨1ÀA#Ÿs¡´+M1mÕÇÅ4ÓC#`ŒÌçf7RÅ„+–t ÉI={%dâSgcÐózöãþÖ˜¥[«áÿ«‰c±ŸšVqŠqªTòu[…„R{¯þÙ÷”€üÇš|_¾¾ä¤Îä ›¦@ç/&\á…ºYR²ó­ÑðaÌ“}/z=¢Œaöx׉%4¬3ûe¼sªõ—äÌ¿–1æ’ÚÞ•ÇØIØNþ¾š›€ó"æÎà'¥G'³‹ñ8ªˆ=´Õ‹‚>dÈ@몖’ö}*™PH~›’äC#KíD‡Üm@WB'Äå@WÆyÄüš…àø Ì¨¦5E3DúVý0ø¾A¦íWýÃhN ðÁ°óºJÄëLµÉ‹†Í=,èà¶3n”·¾Y )!¼ü#—­ó…-ÐU–ƒ65|Úõ·%…k—Ýó´M죗1Ëž }d^TÁ“m’öñÊóß ÌÏcÈx î±w†°_wuêÔ÷³{F3›:¯;Aâ(´]£_Û”­ @0g׺[D/ í#9FÝ}7™(µúí¬ik‡5† 3 Ú%À;æ­pñ…Ûåp^ç®my¶ÆÄoS™·€bÝŸ~åÃèôCdÀ܆Ş,œÇÍÑ×ÈDt5\–Ð먺ˆôô˜Ðyγ³Ôþn #×KÚŠåâ@V‘y؆“ÒhH·; _fº|km„AqÑÄüÏJ•k^´…ÓC®½ø…@ ðÓ'£ÒÓ÷Ý€SíÌí© áy_'ÈcpLJó'‘Í0ÌžÅ7ñÙ®ŒÔoï÷”È/œ{Ï6 @‘ãŠXé‘}¨¹É "(Öíòùø«fކLõ2Ò7{Þ×I¯H.òqõ0Ô“.˜û®,€eHÂsüe…ú®Ôs–Âèµã.£dSÂâõd33tÿh¡ÀK¨¾DoŒÈþ{’·ÁÉíb¬Ô¥® †î‹\¸é/*ÏÑSÍà°ö¾:w˜nåt[ý ª‚tï îÞýW`¿N¤½ápG•ó‹±_|dïæ0®d/ÕdûX²i#,.HøÕöËÍbKp™“Šrr$[á5åsg‡ªpPb ʉçupc]É—a5VòØv.öÜ0HÑ×EÔ#Y5¹<ú ²ÂÔ´î?*)ëCûXmp*P€iBS¹~»âœÊ^>Ç&ÏÞ\ðÐaÚrêEŒ/ª¾mÔäöw/´^Å.{xÁúÌZ­¹[‚àëÄža|ÓÁ©ò—º„²}ºTrõ†'ÁŠY ÿtogp=ÜÕKOŽn}éõG·@»u1FýKŪg£/6¹)©GøŽjÑ»A/ãK#O|§åWzΖ–BØ ¾EæûvòAIÝ?‡mÝVR ŽªR䤯Tû(`5ÂÀÅå|Ù¢cMFk!­^`ÒjÙ®ƒ K¡0Ÿ’MpçNèhð/÷……XY+f¨bøíµ÷H’ìÑäî*KÑ4+bB~—FÎHè f•Çe©&¶c·ZÓ9+[µGæ÷ËŶlúežÍ ^=”³ò—1ù­Na«AUuŸu]F‹«¹ñ@ˆ'°t¹’6š}´Ð²¬(÷è¾”Þ.¿Ñ溳£Ê£PÎ;Z€ƒ–¶Uy8é«Î™“–z553‹Èma|¶ë˜ˆúÀü<}%rgÜ\ž«¹ëÃç«Kn½T•YïFQ!™!'U{g?Lb»Í^M’á¶ÝAº`nh|ñ ["!fBšê#p~öŸ•gý“ø+‰¬lʯ”¿¡"ƉºLw}½ŸxÜ=òX;vŠóW}#Ò?ÉŽ›ôàzC(éeÆ6à¿}[ƲTÄ•¾Õ´óÄxÞì*jŒ ϤäqJÎÎ:œõ—g+©ù4L°ŠþÌ7 ÚñQÇ^— XãK­öéŒ/¿tSdŬ«Eè‰d£-ða¼Öåj­Ñ´õbùäk1dÂ~Ó<¢™z-ËåÎi‡Å¯z…&Q(‰Ž°åuí^ …NA8dœ^H|:¶¼5ÖjÝÌ1L+çð:¾<Ô¼C¨3ÊeÑ6vèf6 ^1Mî7bf:­€';k[Mx_ie^íIDç5ÁÏ`î²ù¿(«Í÷<ƒ†ÿŸ>ÛØ“D8§S/ò¡!omv˜ jÓ ¿!´Ó$'I X¨QѬç{qL˜åœ]~UÔ)ÞQlN$rÊâµM3u¹T¯VÒ7}¯Lv Ü7Q^0U=OÝ¢BRe°äŠV*žsú òÈd­Ê#`:¿Ã0IN‡&Bñ„RøÞü7ò?›ê~CqÏ­céñ(V×ï5¼fÅÑ\l[ •o8ÓŒ7''àO˜Óò_SáçVÀëÝM£5äÚG ˜\'®ì>Œ.ò?—™˜Àõ (º Ÿ{?0P&ÈØ;—Ô¥÷ÜúÌþI%·@þ_M³“–ÒzÞb¤R´¿dFJ¾Úå6vµÂ%WGÅùy?ºÇ}ã’`¶«ÎÒŠ€m£`®Úqx§8‹¹± *‚tÆ•gÁ%4±ÔÞŸÑDÒ€ÿ¾ø’%m*'<;®ß]-Z… [ìƒUÆòslK¿þƒˆªx÷ÚŽhPäà<¼;am<%&|H(+eæÉƒ^Xp‘“Ar®8ïP/|-‡ѨÉÁÉaD%!ŽiP±–ÛtVoZ?%妻ˆS+w.ü0’<Àpt,Õo§ÒƒÍ5 ®ÜÚÏ!‚Èjýé¢fV&ŽÂqmS.ÉÓ•ÒN™fGSõÆÑÕ¸ Œcmú¹ ŠO)«<Á˜æ1‘Uï£ÈÅ…•w?¢/Ü]Ý…· C©ÊÄ )ÅÍdp±€¸èý+âT¤–€”6óƒV®Ö;;"‘eëÊç÷¹ 3Ë6úá ~Šô¨ìÂ`F{|´¤äŽ“q|AvÁ—^LÔkƒ¬?É<ÄhlИGõy>dºžb:‰PtÔç¡’§Aþ9’ÈV¢Êw‡D[Lßês¡»SÀ(,2špí³ï;_­[F´<,7ÅÙà­ë7~A“9²ÝÖ]¸õÂ2“ÝMtúþY¸„‡#‡(&9¼Vˆ—}6WW1žøMíd7Ãòá<N\÷>à×=¨ßŸ$áõÉ zì–*…êñô¡–‹¦óàï ènœWt[¬ç_QJd?üÒDSGz$k2ý:­ˆÎU¸nìÐnh!q«Žû"¥…*f#ŽsßMîþ=¨{Â%ò)†:4¨dvWïÖfuaH¢€ŽºÃ©Õ¨^“ç± ‹D÷ÏáÅ ˜;\6˜Ü›³¼h ‚ýÚòåû}%<ó=~.óͯÔA¿i"†„«iÂÞê|Tî’Ê'a,Ïý#ÃÁ@ß_zf“ï W~ëè©D:¶!fvIû(€µ4ÚG›x¹ÛØ‚cK9Œ“ÝXcèš[v­ùV%ÿ[~­?–éiU¥”¢´ý–.d¶mL®dûºfžb¶Z´ÕªnCLµÑ)-øßMnó6…(UŒÃþöè>sA;ûï|&¸ûPL­‘V¬éËùÇp>´›]3ôDžÙxbóIaMÎŒ9ÁÙG F©T½ño&KZê—{iës‡zŸcUKónèµ”éçÀ?D‘·DkÞŒôB¶(ÿuN NKÏ‚¡wœšDÁg ×T¿õÞ<Ðý­>Oš?§¦S@noߥ¦9¬’¤f 4×ÿ‹¡´ÌaºqíÙt\¤ò"C@­û{ÅC7"nx[OžŽvâDµŸ(·¢Ëí£ëÛšT‹‘+—ƒ±¨îL“(ª_‹ö+âLONêSo*y+T£õÉøÊO;ÝY<´<ø³“Y~Šg×[` O w"§2Íd½#êŸ8‰ Vèc²•dI|uÎ÷fÄ„–wÖXÍoÇ ßn¾ôØ@׌–¨¬‘Ä—ßlÏå’(ê C—´éeçÀøàæ¡E£Z à@I$m ÅN%kýsþ•Cò¬ð¶ö„ß$§³[´4øÆ#O®AuÐØûWpá<þN^ï+怦ôöL¶ù2x2q˜ÌËèIÒ?RK—gÙo×Ë^}hCroÅÚ 9ÑþH¢õŸqlù|à'}1\·m;…þÎgüþš# º—§Hât^>«˜¼Q„¥_÷¶Þ} ;:ôló‡b°÷6œñôÒiiõ¦Åÿ+¿È•ÔRÓ®À Ðà–H aÿF±¬áÁ¶ªV˜=Õ9ØÊÒ=1þé!{|´é²“­Í ë«*½‚Q„*²ÿõ,ùüÙ7³‡ÎËkÁ§ìJ [GŸ¥ß¹NÆ8W?ùø´Þ€sՌ٠é“[ê‚uE¥(OµÝÈB­–‘G|ß"™ç“­¸ü¦©íZT_hJ KG´ê?˜©|þC£¼’u!*Ä>¡Ór9e1%Þ^vÏ´ŠrGú~YÎ0‡n¯!œ¬?öa&Ú¯†´Èkâxõ 'ŽºÔÁób’4zR ÀRLଷãÕëR'€z›’#ƒßO ÷8d½ýµÆ½® ó¿Ž(ƒÓŸÁyѼ¾sÚ©8aôþ½þ›ê/¡ÿZÈhÄœÇ<¡¦éôtÿïQhÅŒÀ…£dRÕ ˆ§l ©‹râ¡·,]µøð=µ¿a/Øð¶ýF“ kRŸ (R×F™4É=iQo^Blw aÝ/’£‰í˜Ó€òFA»–ûH%f„ åj¼WÒ2¨ŽËÈϵðªæÔ#mDÊyÓ¢pW–¢…ñ Ð)w_Ž7­”/uJ|pNËû©;=$™m‡·ò4¨ôà9’ò!< Eɶđˆ«nGQ0c$KØUªBxi„eà²M¯¼ \›þ>¥š&zêuEd¾æ»ÝÐ*b*a?â{ÅZEŸã˜ìnÛˆÎò’Nª[q!$S§ÍnÎB¬¹=õ‚ƒªcžlÚ"´tQÎ2ß2ÁØV^GkH9èÆX&Wĵm"«9×x+²\ººLŒôs§„Ý:`ob‡ò¼5ÊŒ¿VòìEt ¥ä™ÛgjÍÜnsDµ¢÷)Ý! %Åþo¹ÙµŒô $)ë¦r‰ 9ôéè´’âÓxu„O¶i”à´ÉýŸ ïvÃGPIކ~ÅK™iµ$p?—=«q€eÓQx¶IšÙžVÊ^¾9ú7@‘ûJìäôW¡ «I­ºœWv¬zrF#V=/~S¥S™¤ÊhV³5Ä|”d?>lô‘¿˜b5ÛœQ£° ½…qÏRˆ×Úã"Fí.º¢¤<‘ÃaåOà¤(ýŠbÅ¥sÇ‹!W•0lºÉ2Ï?ѨŠ2UÔ) ÿnø ÜxÛ^_ûky^—î\Øžãå𵓾Ë@ÛÌRLÇS4ÊÕ›êC…ü‘r,^zÀ÷,xÙ”Õ…**–œ©P Ý þR¯ YxNÜsÛ(–÷d§ýlMÁE.ÿÈÿ×®ÁÀù{DÉGËõm«j>¨ÚæLò¦6$~dRžÁàš£à–§„q<‘ Ý¦AªquÝbdøµ{ü(¿é- S" ¶Žœ²O¬lé§êëÜÁÄ´"¸5W"@ká¨÷óAªW1ËÛ™ò”žöÉ ®µ¥?ˆÚò·i^öø”¸YûR Q¸¤úoï`&DEߔԫ'Øã¸j<¦7F-WfÛÌÞµö\’úÇJs„"Þ]Þzáñ´‰þã®B(åÞ#Ÿv•gäàÓ¢.M’–ïzDþ †$E,‡iÎSW¥õp®'s2„ÑÕúæ0Òj¤Î+Í'{‰á`Aõ²s¬×#`»¸Y83ü¡Šúa¼ÜóÂö>ùr_'l–%œVê#{žßÍÁ ‰]Js?,1t¯JÛ K“±RÐ5"ÏDÓ Ü ¡7)DR¾å]ÊI¡ØµùÈj˜{EðFã"8°TÿuI„®ø Ëî?7( ìË|{æ#ír„{€1S‘èn¾\US˜7—6€¸“‡@ ®V>’·ì¬ýh¶q»ÜùÍË#W‰÷²†Ùd¥„J+qŒY;Q¤´sÁç/’í¾X<=ýϽÑ~¥‡˜óùØü%%­ÐÁ-=ÉîM#K2gZîY‰ÑO]÷Ö!V³ÝïH˜ì—Z^9A÷‚XzÝe‚¿ZaKtYSµžß•MÇ¥•”ÆÜƒHíu±ºÍF”³D/–.&ê‹ÎÑëG )Uþ"X5—‘í¦E›Lz0±R¨ðAÒSËp¾h©tË–*è2h©ÎЛÕážÃø·d“»=žÌ‹uª®¦2ô µ½òIeá«qkT˜u[4Ótn–Ú—MGTÈvÍ9©º²¬°³* ûÏóÙÉEìu—e–¤‹ÜaÍð ÐŒê÷×FLx,ÅØøTKªÿÝDlN6´ÿ»Q¯D'DàqíÃÉš‚°Á¤VŸUhg’žîÜŸkÀŸ4<~¸\Btjøi+Y ž(ͯ뉫«îëú·«>¨!$x Vz‹(‚ÁûõÅCB{Ò5ÚišÁß*r¡á¢<¡dY OŒëwÒ[yö8 Ô¶2"`UA³uÀDwb@6©Á…4ˆÚÐr?Ë4ˆ%ù öDpTñºHOè.<ß¹“‚PoŠU'$Â]â› Ýë„“./£ `\‡+MQ¢k/PžØ+àÔ°à\µ~»uJÿ'è Ìpv°ðl†Ë±Aet›Ôßt®Nö~žþx b8ñ¿âÆ"’S¢›ß4Ç>LJUä\Ò)m+—²áؾýh ¼¡9Ãá:O{oäí‡£Ôæ„ö¶®Ákµ„Ôš-;“­Ò¬ ŒÅ!0…€]0m‹]Ù"_@ãKL:ŠskX®‡¹Q—?Í¿;F-Vê}ceØp‰½ô5èUçVnÂA„3¯AYŠôÁèáv9a¿ä‰ÎF&Žû»V;A®šKyˆ!Ý1+Ž"WI¹™€&]/[Íúÿ\Øj^‘—_Äõ·u\iª(7¦72”ÞÝÆAS…3躅sFkßñS­_/¡JÇ| îôb'ÄÔ ù•«à9¾åÀ¼M{DS€ ZÃxJe¢òt?!ç”(Éâj{®ŸØñgj(Vùe¸IDڡ܆ÐIœÜøÐ¼'Ä’RáDI‹UÓ]Ô%–ñ5y ‘®“‚Ì›ßs`T'zÅšãüäS• ÌCe?†ÿ Bd»r]§D?M™)ZyC‚p˚ µÝkdvÊHbCðs˜5Kâ_“=ƒ³öÉöJV¡¿Á!—3v>ròòW5ïÖ qÕE¾­­4^ćÙé¬N¾ÂɯsfÁµ6—ƒæ¾÷IÜvÏÖ¢½ /1{%BšÁÿh›îçZšýÎ1(úÅÛ6yÇ~éòfºâÙÀ¶Qc€ }°Ý úßÖ㡸C œÑ óÿÚsÝÿáO‚l,e¬"q‚Áo1Í3å¹, ÿ3áZ2†É]‚gÎ !Á¡bªsV†ÁBˆs‚ÜwæJyD†i`Ø–d||)¯‹¡ÅØšg¯÷f#àoGFˆ7ÖPׇ.rÁ6ÏMõÙGúï-é*šêX ›÷¸%êúo‚*éYhQÝuÿÕÃ}Hƒq8†Ðë襰éR (äÌjTI„†¬÷OA•ärM£nEš2o´é¹ ƹ8üxAh;>àã)àQŠÇí–ø¶w™ƒeò™–â¢pG˜ìÌ/¢6hlžcÿãñyéC§‚ g¾Ô#%™á ÍL‹Ï³LE>NÛ[eÂtäÙ$”â¤xGwVæĈfºV¿èœ÷- å8çí£W¯LǵeMd²"O%ÊMýµÐNaD$j¿‘ú8%zKe$N$ŽLxdQ°‘°É‘ŠNyI¶iw¹ÞÃ#÷«VÞz€Oí³‘êŸpÇD€ˆcCšïÀÒŒñÇ™Ïcn ¾¤c@Á,ð9Óñþ{ Æ ˜çÂvÒú zÜ„HM°Ö탪õos±õÍ.fÌä—ulÕ÷ç}ߨPrÂ3xÉ,÷°Vj ´f1$þãÙ!§ÃÿÓtsò‹Î=¬£I);‘; _:ÓSz†ðha™ƒ^{—Ù]’b`»¹Š Ê=_LO§S;|Uèj6f΀B²ûðmÁ OK>MŒ2_¬b¡öIõEüu´Ô£l¿¸&y—ùC^Ç_­ípY˜.ÞHýR÷Z:û‘Åt*4øÞ>ȳ¸€J£o]gªº3ÜXZW8è>Ðl’î‹ìÖÊU±%Ýs´vÈ ¿Ç²²yaû®Û­ëˆT=ù~ƒ›ÃÄ®=³±?1ü#­ ×µz­jŒÒ«ãáÉ,žW‚nh@Éÿ{T'¿A㇦H”‹àœ›ç>ìÁÐ,÷HŠ ™Õ:Ï; ]Ø=Z5H®|w¶–°@:­ŠY9á߰󰔬E©aèÔ0…B›ô/”–£DÕlÈœs£C[Ôîÿ‚jÞ1dëQ1Á €þ60 Çy×L¹úc°~G/+fÃdhG¬ÊAÚJwFy}2wr‰Ë²,ØÑÞÜ£Z)›Ù¹hØ Awf‚¹å=Õ7]¥©6œ ÀCZ»PùT¸µß©ûÔÑíNŽáÄôÞTT ú$Q=Te3JK=È~wäh³¦P¿‰XH($á<ÁùÁ‰+çë߀O[@#ŠåÚ ¨Ûqÿ¹Iu‰X¯5@¾‹pcºë”èîK‹½Kå§íÎøÊHX”¤Â[éùH`d»u¸x,A0F{áóÃÎòñÃIÜ#@C5tT‚ŽXt8ùC<æÅT°tYixV'†ç#ÌÜlpðjN8×YïÖXÁͯ nm“›!KwE„5èÕ̀߫÷Ÿ+ôíò:!£“³ÓîíÈß YˆìÏþÏF—ùÂcBìã# {«¼þ°dG$åus­&¸½ðˆûhóoSÑÄ8䋯žír¯$› ÈPLj¨ÒNÎ Ÿ?¨ s’ü#eÏFàÒ,—d!ÇÕEövèôÖ¥š=NžUwR/~G(ìwþßAÞ[™`GC)¶›ØÀÁ®¸ö€‡GÕÿ»Ï©¦ÛàuºÂßEo!)32õ9¬LIª(Åø¨ü÷‹”Èð͈ºö@üÒöÇÄM‘¢k6}šˆ³è²¢°/xK0æC1c vöÞW°òZš&‘jÏâôÇ[8zgý‘BÖ÷TR?’D¿°`¶ £‰¦\úgë, u5ƒ(SÝüCÄFbÊS_Åk§´•è©jcàaÖö¾È|Õç~CÙ’@Sû;Ø:OŽ•b–7ÄVäâ–¯®©IDs’KÏ„ígéÇXú² ÿxéId8L »2×^»ÏéR@`P=¦—çCj9M»úú—¸RŠÀ À1÷ê„ Ó_çUª"E~ñ€”öä;ŠT‘YÈgfyÖÆç®¶m–c@Âô* ÐJ4ß'qG°v'À€¹Vô¾¤VÅéÏÏäªöÀM:r?Oñ(XƒšCmSá³AütŒÁÓcŒ¦Z?ðÆDvü°îÕŒ_çq~¥F”4CS_»;_­ñîиvÚ4ŽÍRur¢yCWr3-ÉÊ/G)¼N _5%z…H•Rgò”Ylq ‚ºØ‚˜m¢%ÛÅ ,ˆÈ8£Çb‰K¿ç5ÌÛR[;LrB¿%·±ô4ÐLÀïo7÷JÛ[N\ñ?Xbd|% «wð—ã?tïYÖ÷¢>´Ižn1QrlÙr.´I;Ò»æä˜z]äÓ}ñMFlDçóùdT4iÎåÄÌ_®š]ð¼=|( ´=g‡)\@ô±¤©‡¦UÀ‡ÃoátP\‰°{“âݺjÌ{™Y!jo 7ÎB}6#wÞ FOˆO'y+hãñ7ÇE=›"¾ù±ÐRŸ¹¾m”cÃNã´–“'!F…ÍɇD„Ø ©BÞmi#†ºèüW&4°{TŸºEGø³ï®õ:º/Âà&€)È„,šL»•®\=~^ïy¶»\ߎ~—†b· ‡"š‘‚*OÉó­®óµÊùýáù­ &È@Yg"NA{š¶©7{ŸñŒß>²¬5"J³×Z’’½cF@þ´êÕÎ 2œúµ9sUH“Iû¿Wì\j€;ÒÑh‚s®·$)Ë*àG[qâŽdyÁå1å[~8O"Ì+Í<”åŒÙÀ>'ð-ûÛÈ̳å*oÅÿ5GK+}‚¾ìÄ%ÿßçÜ*n¢J¸«€ˆ?fÙl£‚~KòLi‹Sß<—:ÃÊ:á¥$‚Œ¼Ä*tM.ÃgÇ÷¡¯¢Ú™ˆÇýÒï;¤ (IÀH´q,™gõõùÜ0oFZþN„Ý@÷ßÕ0s‰)ŽzÊ…U°µ½c,C0åp$hgÁ Q¡Ði "Î…TYtl&†™[’]òBÁ-0_Ï¡ö‡+ª…†RVrsvИ~*o*ØÍÊÀRã_%Ôe0§4WQAq™ÜÄM„¸Ö}èÑK˜*¶%_2@÷m•â õeª’†jhü(ƒÙÏîXn†IÁ“·ßÉ‚`I:ÀÉP!ø) ÍöZ«ðùŸáí‰ú…è¢LIÞã$aó!¬¬.Ü kŸàuˆ |ùù‘§÷@4C!š³;­‰Íá]ûè_Šá6-áîKëI9Ïü„êqÔŸ¨ê•t…7 |‰™Ûßίb›ïNõ³Àü1= ´2X± Ðï=Ô&hhß½­ÝG[oX¯ã!P,³ZÌöÎD®+FùŠåЗ1Û<¼ƒiu«Ïøû–aQ Œ.¶m…f_h´94ƒ%!c±WwÀgë5$(þ‡Þ ¾µp‚ùFS'02ÓŒ¿vª‚Ǿ¤lô§4íÜ ½tn‘®ïÔ£µ«¼íØZÅ»¾O0¶¡7ìüÔ® ‡Ükä㥃ëN’U}’so‰Nû^ë÷ZÞ7ûÉu.Àp©¥Ä-LæÖiëÔkàO‹¼ÊÕc7ƒ•µIµRÌ žהǗæ©á‡ ±~‹’{/gã&ø Ãb^†Eî]P× ‰Ô„rÅ7AçyZõ} ¢ê­5{ú šr›ô¢kÃpŒH òÑðX:NiWÉ­óÇó&bë§Á-9²cZMþ0R€¥îj—@!Ú1Úyw‰KêŠ)A-Ìg¹‰2vk)ü=tµlúÎN|Èí%¦~YI±39o8no©ÔüËëô•Õ5³Í›|O˜*‹ý”ÇEÁW{[°†áóNÈs›…Háë%׳dCÏÜÂ]Á.ÿ@m_ïéûG[D?òŠû;å³$täéó_]ì¯Ê(à'{”ÌnÖïºÒP{u‰²O˜‰Â<(€$¹ˆÙãÿ·6RYù¯ãžªéä‹4ÛN *”÷!$õá¦ç^…m”çGÄÙcV;£V íBÙ1Û—µõÑ×;Óæ$)ò¼– ØîÒBÚ#\Ö ðÀc3[ËÂÈ$J½4Ô@`¶˜CÞóùyÄ?ßÔ˜¥•„ ¡J@ ä,ƒXYX“h×ð‘ĺ2ýÕ4eU ±ø´-}\óh"˾³ÿ£º×"]¤vÙq‹M‹nd —%è7Êi¬-ì ܘG5¹[<&Å™@œXí› äÙ)VSj·÷iKÓPôn¼"ñˆb2[Å–ùÄžŽÞ‡gA6nûmÓD™#üºiz%ž@Á1ƒ!´ñâ²`µ~÷=?h×I~aÝöôŒÐrL¡Vgâ{Äb–3Z®¡By{ñ,ÀgÀZ‘€šü 3®Oú¯hèÕÞÏå.8´€xTžÏ~«mÜÑö™ŽJVŒ5¼±1‡¦“6%Ó9¬ªFÃÿµñ°{Zõç¦Ö=.¦­x§ØÕt»Rgë3típfç€ÕîÙlö«„š:>ã)RNîr¸uY‚ÕNÝ"}¨ÕÈé¬8œ~°h.H€þ³-Ë1 PóK+ö˜ÆuzÈ*[çWqŒÛx$:*Ÿ‘Õ¬\%‚ˆ™DØ+'f8RMÎÉ¡Rw†HÉ0ÍîEÅš–÷†º5ÆÂZ¬p…€]&¤xHZG¬£€)l›a>l!ŒØM¾Äø! ¾ˆQsá²{ô—Ð5$/‹*‚Ö Ëö/™rJ_o P÷ŽÙ0^ÛeÕG–X£.SQº£H¢º`oUÆÒ¥ní´ 7ÒÜÚ£6š¬D+Pƒ%÷|±è™I¥Þ2¸õ´ÃÿP  Ëo9¥¦=E#(x¼‡ñ(J{,&}—œ176&dçÆšÿ3!ä쇤«ÅÜÛ´ÆÐÇós£(‘‰póÚùEû‘é@WŒVttlãUàÛÏ4Í2i°ýÍ4c6a{j$«áù¼’Z¢¦r^ö”˜¯{º]ˆ”þÃí çªéyìO‘£²rãúÖ ÚcQ­ý°<쾤bˆrtrLs³G|òYX«ÿ<ßÙPìwDã„Ãú60øG`ä‹$–hûQ+Øþ7Õô‚w³s «DÅk9J5ëZ2¦i¼xsW"?¥Óo†P@`ô‰tÔ}­¾@lÆRuŽçžØò4ǯ§+”Ë×÷©…½<Û£Ùq¤Ž6ÙzùتTò>õœøýÙ[ú¾¾•ÛÁjÕ6ð=HÜr¦X½Y;"åÃÑcçAü–£ƒ¢üœ"Ìûc/(èÒaÃ7²T.B‚/ò(„¯ãÜ™ýÆM…âŽåÃ¥uÓìuˆ¡ ;²SßÿÁp‡87§ 3PËŠP>'.°e Ϲ,þ¯hMvÍM §ãÒ‡¿ÂªpƒhwÅò¼PóT¯þqÓˆ…}MI†i \âþ;¼]Bn¶T'ŒÆE¤ÙƒÏâßÄÜŽ‚pã/>Ά’¡ 1ÒaKÔ!øp›ÈBáî­ö!Y‰%%[_ñ~ \î;pÔ«5[b®¨šgÖ—VÈ á•:ô˜tÚ^Äv"eó¯@óŠ?š»_O3v$ã«5Ýö@9ºXÙZÛ¦%;J+ƒÜ¾\}mÜ[½/Ûä(çVfö˜‹ÛPáV˜^aIè#¾¼d¸mŠû6Ðèˆ NšÎ4gü+Ë· γîG38øYðÒZèUâÃêÄ£“‚‰>䌃®m¼‚ûÆÒ0¥²¸Øžµ •÷H}1FðåûýŒúa÷°âå vìI#ô˜óe´hÛõ¨ú_¨Ð y|(¸0nãS*?:¶q?ù¤ÚØ^‚ŒV5¡ŽFRÑâo2Ö‹ï9€††.Ò¡qŒ¶8R‚*óCYNÌÕä}P‘jÂéNR‘wsÀSßÌ w‹‹Îñ k(&VÍáÆ…C‡Œj1~,ùÊê 1Öµdy#WÉ+Ž" ©| ¬§# G×J}š-DÚhv<„¸`¶ZoVL,†Ú5Û=ã»ëh‘‰€üÎŽ÷® Á„5[yy‹‘¸Ä·À±é•}ö+€ºÝêÓ![z“N…doïHö ‘{ý›€Ê—¬€'[68 @ÞÖ‰yG{ÏEC2N‡÷‘‡;%§¶w&üÍ =Þå ‘¿‡¶@-r&mÚÐ. ›D{j\>ÚÊ“ö½p¿²  ¯J)Ýͨ7&Š‘0x¨Þ'ö›ö ú÷ èü*sñ|ƒ³!EÖÝ/¡†m¶~P€ )0?—y1™áœáNƒ;ñMT¼‰ÁÐ<($äêN[}}»¤?°~[ÕÏ•KbÎlEOÁÍOàˆâÓÈ‚ïw«ÄS #kì ï —j“µo ¦ñ@µÍ`Þ<í¤@ ‡¾µdý¨ËÝøŠ¬„,ù Ñ{¬P®^°™·ý·wUöøv¹æû ÷”šzâP$)Ïr[/¿O”¶áæùÖ|EÍÚáãy G}^°Tí'9ÚWrÂóŠÔ Å¿,ú¾‡Oâ: QÒrÓŸ³Æ»¿K?ª>Ÿe1=…åz¡Ù3VdÐ<ÃqøC]ýŠéºQŠXp†0™>ÂFb©òîø-Aö8gf…%ÉgG"T#õ¸:Ïñ»¯í|Œ Ç¢'"‘@ö6gII€}½UŽA¿úŽÃª¯*ZÔ0Éâe\ëª@‰€M.ÝÇ)ƒûst¿I)/\ΡV ®<ÃÛ‰0f%±Âíë^ waŸ÷—DiVÍ:æ±çêAa®Ïµú½€•nµ…¢M¯‘H2\‡žæa $,Àpb^Eí•ÃûÑŸ{a;/ú¶ƒîǤ¹"µÐO¶kHöNï•x™µ¹›$uìsºPÓOP»ÆÞKôá@ùQ‘Î=¢Òr̯žóR£pÅæëzŸãß0õÍOçÝÖlê± ç¥l˜£z…Š~XŸ¢úDi —ê ËHò»Ÿtó‡GçœFÎ`Î *:,ö¨šˆ¨)ËÿãÁã‡IÓ†ÿÎ0€»¥ÓÞÃ×·1ùË©ÿ"QŽšñÐ8”i¦¡a0‘=™ÆJÜR¼7tK4VÄÎ(µiZŸ˜e÷^¨tXŽà¡x€ýw‚Õª.åJ—úÂ3#|(¹;4«Òø×ÖÒup¼;›ÍØuÝ ñÀ×ýÕúæ(ÀÛÛÓ– Ë sÍgßÞ$OŸÍ:‚xê\í¬UžLÓቮ ¹®½;+{µ\èFU)¥Sy»së xz‚yÜù¹‡tœô^uŒ3à]„!ÒÚd±:¶N@`®y&›”÷í“÷ªœ§¸ïä}Êluâ–°c~4«*e{\Äg奫gúÚ|/ßLä׉ƒG³Bš eà ÁÓÈ霱Á z³ ;¿,Þ1ŠÔñ³¿¡7}Áð·X?ÇÜÆ¿+¿ûåɤhàAsÍD64ž![–!žÿxn^gl¢Ž:Ì·ÐêͰëi€¶q¾ÝBŠŸp©K{ЏPЏ'ºhjõÒ­—B‘s¤Q%5V`ÈBKÞ#n5vû®”¤]9,ÿ¥¥60ÃÅ÷Zë¤*…n}’|¯¹“Zp™×+: ÆO/#4Úó*XE’Þ6à6|=Ó ¨BÑu A#6%Êóuî Ê@š[ׂ1>œ”JbHán™î¸wƒŒþÕáÈÉî+Ú´Þá+ ÕÞÂè8E”Q+† ew–îK¶ºPâŒIü7m䪑t¶DõÁ4;E™B+r*äf™ ‚í*ùçÜð7ÊÛœ“:(Äœ…–Û9“º°Nëc¹éeдÛrŸëeì [ÇòaTî0sìþÚ®Rg¬²òyXPlSô—_@I—<›P3µ*Ű$˜?€‡ù¢žÅß×¶òÝÉyÉé1·@U(YÊ?MfNqD¯Â*@ÞßÛí-¿y¬Â>V[ÁJ¿Š÷3¬‘ÿ[ ×0âq±-‘6/Kr_wÍ^/—~ëøÉQ¬Ý­Ï·4çxJXb0 BLc§#½D³ã·õ‰LÅ:Q Š÷în+a­Ë;êjHt ydM©wˆÂ_}šügMªI¦à´m{ZmóµxLx±†Œé.Fd!uWV©7¡¬Z_«‹ê²…E“\ÞeÛg;™¹À¼·nWÛ1¦V8=릸(Ó—qœ>4iT·9—2.þo.oêJ:X³+§ƒ`[45¨5b~b)MX¡%5<Ͼbñ'qPtH‘. ¥Cž¹¤‹UO[ùLÇÓ]Þ ç,<ùqÀ%HRií×ÄcØÀìøphiÎE’¸[D¯PD8ó] Eáû{Gì¥Tq{5*n(×ÐM¼øecŲ<¾[À'Q~.RÙ'ŒÓEÊ«U÷Ó8ØöDö¥øOÿq)Œzf½Šý«=˜ð—;5^¼‘ô‰Ž9^ée{á7ªÑ¸DìÁùý#‹ÝÍ  '¼Âö¯v1 sŸ–½•c&µVHáÚPùTŒ?’d}ƒÕ²Öö3kê¥ìée%€çûîgB.Úá½y†¶ø¡Glpßc¦ÜeÛH\©£„ê”Ù3Kæ,Y Edô>*`㺃hŸ‡vß"•UôwK:î ù«#Zwü,’1 €ºëë‰÷®?å7ãv ¯ÆÞNÌltr€Ù Ql$7}Ê ¬dXØñèå¤â{Eê­TÁ€úàî­ÿKïëQã5ø TuÚ3ÀMD5LÛá_Éä~mˆuYTð/-'Þ§í"P…³uDˆ¨:wÎØ3΢Döð¹Ѿh„Ôl†W§ 7mvˆþđΎfÊÕ:2Ýè7©–oÒBQaäQÔug¾ÎtÒÅòÒ&·Æ:CÀOR¬¢ÍW´‰,é!±ø½×Wiü0ë^¤Oõt†ÂÓK:ºgbà'Ô›;öÖ+–‹tc¯¼T¢ÉÿŠ…¢ý5kþÐÌ¡ëÝâ5Ÿ°Öª_µXY,?Yþé_Mž­Û9 î7ЇfÕÀPu°[£Ôîä1³õhë¦ .?(:Ãþ©µ/¬¥ZÂ<ž8YÌ_ ­ùpžŠU,ÖpöDdE´“F¸ÇåŠ#¡øg&«¯M,¹6„A”esìãk9äCkΙÏw—£mä‰A4ÎÙ˪.†%àádeøv–ñ‡ †Éº÷ÝB44 Á®¨Ú*3«‰×´ê¬aí´+”üyeJ ö¯mmè¤kajVþS•I§æ±§ ¹9|-ƒ/!ßšÚ0Bž×gÈ­İ@Ìü¨Z ù«bp2À™‰N?ÑĄ‚„m§n!Ï|²„øð?á>!]òäË+x ¯9Ï4“•ÓB6“¹˜ræ—š> \þõ,sxyÿÅBúgŽ· ×nžÉéŸ}ŒÁ} —“´Ü=‚³ŸÂáRç£…Ž™Ìíz¨dþï“ADB8û/$Å¿»ùò¥þæ ~œä ÔäŸû°S6p·O—ö½âJоù°Qšq)*å‘ì3±à:žËz FZ2ûå“åäûZB»Á¹Vžö ¹ñØöôf;x"–t Db'T:6„ê¶©ÿ Ò9Uk{8C-YF4? ºµ¹S…‹ìzpTâƒ@³Fj¥â¡KZö4KIeW#|ÞPÔqÌeFD‚¨­^2y-æÉàÄ?Kéº6§þç•cáåÁ@zgž+¬Cô)D¡™®ÕÚDw™§ Ómæ*›~å~àÓö´¢s?Ý€$ÝlŒ©l¯»E È@À´<·4 »Bê9;2,HŠÒáîöã¢ti¶g°Û•Ƭj?#æMÅH³Ò;c—á,ÆÔMF·µ‰"…ÑõÁ G™@1\ÌýÛáy†òä«I…ÇÕM›c$fø ÕdIçVqI 6Âa6,.‡¨ë.Çßîy’pid·Š5ˆT½êžR|×®IúØ&hhB°ÃÿßÞ•¤ÚFmÅ4tН÷«uFxüËÃó&ÿ Q‘^QA¨ÀmWâŠÁìKær/…/Å›£xMmfȮʹš“·7ûS›À)º±}ÚÍ$¼fþ2rÏ_ñÈc”Ù°ÖSý¤íB©Y¶TèLåNälHømžørOü0ØãµôÔÆÈ¿Í·ÑSgÀ0Æ{ 6a»¾Qå÷†×túy D ä4DèÂʶꫩxÐ) l'µð.ª'&[ê>j†Áx=_&rèyét“?OQaf¶ùRÑ3X"= |Çs£›Eq\'d`ó<ô\²‘ B¬ƒ–"s×UÙõNeŠqR‘@kHi£ÅF€E¡wÈõ#›ß$juŒÉprxØs"¼éu¿²aO¿ÚgÅü“Vò?´—[¯=‹M*ýi=€^™t~Žª½°‰­×e°å€Î}›,?§³â>®cˆ¢Ïüê mvÆ#&O¹™É}pl¼ér¢’f”ü¢é†cL_À‚Âà©Ï¸Î Upí¶Õî‘ýŸ]{Ïm)„$û‚=ý ˜Fú pØ$K‡&$ìÎ㈪{$õ:1>ži:0ÅÒ|ºk¨˜‚{TÖ BoÁêc æÄȦ$õ€êghgD‚e–ÜœÀ€<¼]» ˜-&ȇq|*z`cµ Ch7b8M4¨?ø…3â”åý¤Åð)Æ.l%Æü;ð‰’cKZæ»´™éoÙì(êv•|zÙxñó&ÎCgäßÄ#”¿‡rð7-d(ûEÎ(`$Ztà¡Ë@AÃ܇¦Ì(¨9Ì©‰B‹peÄ5Óf$ó‚Ý@ó^iM"NÈ\uŠ®º!7Á×/˜ª±’ÓHVn5M9©¶lªûÓqµìâžÇqת÷_Mµ·I‚^ÂJu»˜Ä®Ù·²,`÷¶øYE›b[aÚÌ)ÈÂÖ*ã!I‹«Ö›­û†ù%Tþ¿ËVÉ¥·È•|E &Š'ïZ OEþïþMídX‚?Œú¹´"Ëg&f û)Óñæíµð;‹{ ‹ý0Šå¾‹ëâp-Zeô°(š"Âm»=$ÃAÑÙó ­`×׎¡kÈ2y_ar” 0’æîàC%ìÃ&úÖEÐÆHÂø‘GÞèd.Vœºx’äÇ +÷7"‘¥ýÄWImŸ§Yã2ÍóZ©jáR…†Ãð¦`Iź]ÕD‰Èò w®ã0{¶h¿ñ¡‰ƒc±;~–ŸøLa¿íÐ ŽngÂYD®§†ÅïL[ÄBš{Æå2 #6 nÎ]Qsú(Šjç9–à o¤Ò‰-ÌmÈw•f•߬—ÛôS; Ìù"æÉŒYé ZÂ(˜XáÙh°i]‚Ê9¢#ŽÉ^ ý^ÌrÐ3lGï°ÿæ&Ò¯×ìW;!áè¸KDzh÷-ÝÊ­4€—ð6ë4ÕO,v>€qÆAÀ„d–)_íº«ÊÚ£À ‘|ßj&•ËÜ%hìÉV½swžVÈp- å¨)Äh‘ßÖõ¿­áäCMy¨û±ëNAê}ÜœŒV!='þ'¤3æ¯A€ù3ßî;ÙêÆý ÀÓ¦§?)ð‚òÊ=4oÞ©·>ºI¡>ƒY*ÅþWæÇSŸ;môÕ…%o×\Pj ÓgXpÄ UàT‡@óx3ªÿŒNj±OˆèÀ6…V•}¨— ÷yÀxôo›ÅŒõr5äDHmMÙ 2¨Š2аÇx¢¤‚ãÃ-,*Xf­\Ѥ^59ztÜù*yüä %Ú×K êÅÿ@.ꈬ™ä›˜Ô"³š0Ñ+9wã:©È4ºKÞn}* ,§Sœm“†› Ì-\6Å:<÷¾oMð_ÖÛ;IîëŽ×™‘‡íZôö@ :Ô]ý¼RÂüaÔxØ{‰-Ÿ£DÓ‡þÅêp1‹ÒûQˆá¿i­œØë[¸¦ÀSã~êñ 2õ$Ý¿u±AÞuˤ×á4Ç)Â|A™–mIµ¿ÃøÄ­œÕè=Q[žª^Ûüí?]º%H번 JZ`Þ³Á¶¿®<íÑN:‹x1J¥Ó¿ÂvfnÆß&*z“e©Â5y7÷ÎrÏÅšUBÄMâ–¾s¤ð” Ö˜¤þEkãöº´½Ô)š¿á’Ú®2ã\(­t ú‚´`ýËzßË~œr·²ûA†.t‘÷¤é©:¹]®G{‘*­æ#*[«0Ræƒ?›GNŸ1ÄnH\x.ã`3ç̾"!J+{åkÝ+ŒÄ‰/`3‰^À0k9Æ0‚øMŠ~Øql"H±vàŽ¾y|•G‰íæ*ùB]›¹üg? ÜwÃG]^¤YôAÕúª£µ M‡Þ-€ òïcìèyú’jQë¤L¿Z{ÑO·3ƒ?v!Eâ`’ôXD„+\ b5ý*®öÖ_ZÎeG±¸Áü ̸ãÙ°¥‰&/èX)ËKõ¢éƒWä±BŽyø‡§ÓÎ[ÿ”ëÍÌ‹DÄí-»ÒØMÌÓ3Q·{XL™ŸX/¦Æ/.¥Ók—ð“,±üëïÛüu/¿Ó¾á ƒŽ\s~û \ÅΔ„ÜÖkb3×ò_ûÛHzê¡Þ×ß~JØGž&Q²z–£yÆÔ=P/Üç-1¹ºÑæ"+þïxÄ; K¹ ÖX‘åýý[‹OŒâ3t¨Wj‰ŠÂ¿³\Î ½Äi]´¸ç²E‹ÅÚ+‡2é8„)F »¯;Ú….ÓíÈ&B-Fšªq_ÄH¥lP°!=d¸-ý œ‘%ýe7ó †„áÙŸýeiÝ.Ç,Oß#—PM„ÍÐþv#Jâž¹Êbt¨e§ÉfåÀ½àó€‡ëcôNÐ<ëvVo ÕsVÆ¢L;Z>7­¬“ÿ› Â鉫dTæãEò¶§pWvÛn™ÎTGdý•æúo5®ðššƒS¬5%¥Ù:¸ÛíUÔ«t«°¦¼#Žƒ0O§5¦H¶ˆvãÂE]‰ –Áe~â$´È>ùZX Æ–±‹n³=ðO÷/g¯‹é¯3%fê §üQ„ÏÊF%ïµ( ‰8‹™¸E£©a$!ŒÔIªH|*?¦‚b©vâZ|K|P¶¤n«‹%ëžxÒ£âf¯…F%ɧŠÏò€ÎŠÀ%ðÚÂè² ;µ ð< Ë(€bq«ˆlé©Ê8(áÃ[‘Þ)‹o–Hàü7m†÷ c>¥-ÐEC1…O£õxˆÔ£Î0—æ’Õ¯ŽÜLnßùñn˜µ½œP¿3¼?Þý‰o0ïnçVμ°cÂHg!ÅQMŒî²‰LEË$ꫬaÚŸož»ý „݈¶0Óõo ½‰ŽHÑ7=îs{nx0–Uˆ.K^£l(@¡ÿüG[@5‡Äk‚åuC6abŒGªë!î‘8³b¦b€ïö‘±<‡`Mco0¢w;°6“#¤AVXsž/QÝî3•©îYÃÔ˜ÕtA þ@ÐŽ óÆLÚi4#$¹Y´ðĽ-HËk&õ×\ L6YK·YßíÔÎá[u¤‘rÍ䫳³’C­W­‰”)å~êb‰ß=np2Áßx#,*ÕPŠ“ÔeüØ®Þ͈嵺Ƚ_À…ƒOÎßõFË% Èê}:¬ºÿ: âÜLþÓdk;Rµ{]g ÇêVî`ÄcÙÆ¸Ü=÷q>!×Ðr!Î`R”Ìb=¼§¢ÀÌ9Tþ(Nv ›ÄS-¾Z´Q|3ú ¬0'û÷G·])åe”O„FSãû´iÄ›µÖÈuüQÝ>)Œ%i€¾Iç¥`‚­›ýu÷iÕ岯7/üy°rµ-R|‚i\⪛ÄA›àêcx‚$Ö·Gx;]b0·æSSÆ`ïXžû°ãwÔÞñb”;yˀĽîã)àÐGĦ#êÃ…)³ÕD%eí£_\>ïòä ÓtŽ×TŸNôƒùsý.yt:ÇPJB ­Qüçc³ñdf ÔJÆÕUA<¬Ü?+¿ŽwW[¾ŠÏeèy=h»…î’ìÖóB5>AÀòði‡Xë“ýzÊ Ù€¾þ¼ñ„2ák$Á´Ï߆ù Ú3Ù0Ï’(b‡hã9î#Zé=É¥!§hvœbŒ6À(\r6_¸ÄTñÞ]-ü6j˜ÝkÍ#» ›&¹ú\Ã^ß4`¦ø`x½—˜TÕiú™$øV?hæDbûZ­N.4zsC•6²ø _c¾”Ã[µë.*±}Ÿ­Mþ7óRFÄ«˜Ëf¤ÿ íA^}Û+²HXL̹Ø`c ÒÊ,ÀÃöä ©«‰¨Ï1­ñ/=‹9!‘Ø¥ˆ¹òD"÷g'xà/ˆ|ßob§àwJ‚¨×%À<|¨Ë¹;µÒ3øªGD“PžÉ“;jøê… ËçüõcUN&zW„YÙ CŽs‰nY>@Õw «[…@%å9 ñïð8@è>nU‹S{äh'>Õ$¨ïÆï‹¯æ|ð9†I«~ ÿ4è˜×)¸‡(€L˜CbFm5ô¦/p%~}ÈÔZÇK7CìWšuòúúõКdŽ7Í)F´I‡§ªUy'¦ô<ãÉtQ¢ ÃD’H+"ìG&»‹{i‡É? ç2. Àm£-P5ÄÜ©Æ`ê§Ôƒz›8o}\3Ý|Ùj-Ô+£]fr †ð–¯é†ûýví资k §±³Gªã§h3nøg' Ã$YÚ“y€@íðT“”ÇN2c<$·E 4Ý®n?Xúý•äQËJÝé d·{À¸Zð§¥ß).ÍŸÚBÜ)­Šê#eaĆÌ|t h5Öº=9w .ëeýγ Id|ˆM[`żáxGèɧþM’{Å9ùáèïÆÒÞLبtt,8$xÁjj˜ RhJÁ–'Ž3Ⱥ‡ì…dˇ%½µh• ¡°ÿão…ZUœ ݰ”ѪµÁƒÊ"WœÄ#ÅÁ-Á¥äyˆà<?‰öÞ™ê¹ÛÑZ-Ñ͆<Lóöo¤5Œ±T ÉZÖðÅ»ŸW‘ahFÆ’_÷Y(ÄNºÃkØÿ6„r¯MŸ¢–“F2ï²:åcV£B^Ãn$ùã¡Щ-± 1ò_„wh'¥y¤â”ÂÆÉ³®£¡|k sɇ°Å&ÍrÁof¾ƒ¯Oš>dØbUWÉEÔú-!¡Û9êÌq!4F5<^Æ5îd¿²š§Q=&=ÙpÄÂ*^ÌÝÃÇ]ª¢¶ôðÅËŽî×6àì“/< -*IAC­Ï4êëv'´Fþ”Ä)QzÏ0€6xØ;ðNw,ÍöFJðkÄÆí +—£UYë«B6îÒ?O’ûAÐB„0óËfr 'bä—~;£þ?Ü[hU ~¸‡§$Š=sÝs¢©ÂeØØF,˜Œ D¼¼²OSW[›ÍëúœºW)'[49쥟Kõå¿Ë"ñœïÄÜR7‡G"îÏu³Rg»üD¤'àCƒÿ }ĘÁiúû¶—­Gª˜¢Êú¿¸¦¶Á™ïŠt{¡sß»pe €â1— hRù‘ÊO­¿b>t5*S öMêå€së#™Ah[=À&“ž‰bý‰Ë8¦[[r@hÓîj•Þmbsžlúüg¯#›: M wÒþk®2Þ%ˆTù€!w`Úª ÚI=òÏÐB‚p}: Yïv˜ø+ºù.ò¸ó –å)?ruS ­Ë ­}^Ì’æ·…ûÀ 6OôCœ4uL­¶°¥—à¥!Ø,9’ „"ÞD"BÞ4a”7¿óœVþ¤c5¥A:¥k ŠþŸ£]1ߌ² €ßìR7ئJ8Üã^ˆ§c¬àË€QË9«–Yqë’…S´_÷zeoÿõJR '1|¬©½¬"Ù9šð/[ÝCOAÿÒNJ÷²X>IÉ5"ÃÙ×ÉL½3®J{dø¸Þú4›/šOá ÉÒl‚c…“w…|:“™w.[¥ê£#OÔ³¸†I·¿íÃGPõÚ‡ƒÊ°¹Þkð.$LTú¹gzñòÜRç⢹âX™·Ñôä<¶õmŒ¸ C>ÆØFÞÈÙHøî*Ø"Ypš&vQV†F4e"`}õÁÈ™æ$ ö&T)s ÌfåÖñV¥8Ëæ9ŸXõ>(²=£ ±mr鯹}y´Dkr¤Š¤ÑXÁÄoz‘&Ÿÿ$ˆ›×–e¿\ƒÎPƒÆÄf_‡ž6©‘Š"TÅËΛ޽©îËwë¿ß‚ ¼™päÙ¸–5Å­ç¹ÿŸÚ #9 ¼†ÜCnsñƒ{k'íÞ&¹¡rY„xØ/ùnÆ—ìS|bg1%»¹ã6ònžgŸk¾BW^þê…›‰’ýzâ9ò/B;«¸©-/*ÁšÿÛ´èóÚ«'û'{Ö |Ê; ¯dÒ˜¨Ç¢žU)WYï¬ zî$e§’œ]„8‰Ÿ*âPùžšà¯þÜÖLM ÷0>ï¡;Ï­«­ö>V!¤aÐ݃Œ ÖãÃ:i ¾4›¥Ze?¾ü¹>†‘Â}œí×8@›G‡ŸÍq6ñc7ž;þq¨¨*„NmæCy;Àd×ö6W‹¨2kˆYŒY‡#¥†òaÓìÿK=]=T?„eÏÙ1Î`A•ºÐAá™=(E}æu…Þ›ª#"0Í\AjšîÖO}ß!v-CÏÞåóqBnF’ÌÏ~PÆ.‰ê.m¯gñrƵðOãm¡óöaÑÖƒø²Q]¿oæC¤¢‰X ÚtÓ"MS[>o»Û%¨`e›YÉõ, øiäb ¦x‘˜½jsðj4M‚mÎ*PXâ<rN¦²IÑ©…LžëÑGk·áU^˜ÁŸ ›IÞ5Á¬–Xd1ݦ#¯r0AJÁ¿˜:‡²Lš9Ý_L—æ"¾fV2,iTT’‹Íçrö€^¯×¦†7K$ß7ÁFltÊï‡MÃÈA‚À¢34Œ^cÏéxEÿƒ¬d û”ç/Íö B-¶+ü#­<ìËÇø~ÙŒ^ Äp· 2ƒ—8fŒì5µèçɸf5‘2Œ÷OÈžîuýñyïa¦dÛm†-ì¶r»Â¦-øõº¬XÙi‘‰÷¨-½ZG¦’‚^`çáp1¾ Ú¸£"ÇCú/¶ÕDO•Þé ‘Ow ÛÆÁÅJz€Í orŒ#Ñ–r`JÔ¶Cx®wB¦A†?‚½ "2îš )H.QKê ;…±àwSŽú<ï™@ïëwWˆôë ´×›;|¢D?.‰jË醖Ø1q¼Çg¢û9ó°ç+ÐÃ׌ŒIg¯(2ë)Ok 9ú¥U¹•åC?~>ø ßÀfËñÑ…¡QÓTö “ÙiÑ“$UòBAmSñ|$D}÷3ÐfµË½=áÀƒžš¼ÏYŠY]ªîª?ÅŽòÝ‚MÍž÷=/˜ôœB$ÞÐKæTþÅd¡(5¥5ù%kr¶Jˆ9ó8Ñ}äM7¹0ø…3½/&süWå`O†Âk‹-Ì % ­à%ÝÜôª+–®Š·Þ&”â­9ÚȤ3x¿–5QÕö¤¹ –»b·Qgr¾#—XÛ†¹¼ÌÒ¬ÔüéÜ+bNÈ tOJ‚Q€Ë‘ ©bc4ÚÇÛGJ½¢±OiÚ9îç”äÏrÓ ³/û¸ív/u›§z ý5ü*N¸`é<ÂK\¹:2EVŒPåcåÕWÖ!ÊrÛw¸™Ö*ð…θ./tÃ>Ù ÔdƒT¨šã žÎ;•ü3)û”üv„wC;0íçn8ÀÑnŒ!ÕýáW^ŒˆO­êS†Î9pÜÿÊ»C)…æäÎéõߟµ’3fXÃ(Ŷà¤d?•7fÜU-×É@ð6dpç‘EÅ6?=Åä‘å]0k‚È Ò5{ºX»38ñZ5÷¾Qi‚€‘yr-Æ8Ò˜›'>ÃXU‰åJ …+FtQ:,„ˆ\‚#Z¹ô‘IS×硹 +Á«…Þÿ ÄæÈZ¯¯ä–½ +ö1Q¯¿øý ¼(§ Ooý<®DËàç²V¾Ì> Ü ½WˆʸùU¼p¸tkûP9Îõk%*~/Þ¯ Œç†›øÃµ’ÒB 2HÆõ«Ðù_Zkè|1(î“ÖMˆËáHnñ[ „›É¨=”@{ºöÆYþä:÷ QU'úàßðæN¸Ó©¤ó¤­ÅËí©(êù\þCÁQ[H%BfNh¢` Ã43*äî%еP7̤ˆ÷l_€9ÍŽÌ«Ý÷¯g¾²ód{*ØëLHÀy`­±8§ˆtKƒ1ó#‹÷TŠ»ÞØÛ-Ðù‹c&°tÓPÖ jA§&ó€^%ö6ÏùÞW²[YÄ%÷÷/ŸÜ2fÕœTEùß&릈ƒ¬ÚŸƒiÇÿ¦Ú¢…KÚNËŽbGò#…®=» =üG¾$z¦Þn„…ÚM”öÐC57ü«_•´$g€9œ)'?[²æÇz’Æqùòöþ¢¥«H,ïb=~× ¨ÛïÉ^°þƒÕ`^Œ&€àÊšõ¥J›Åè}¥V·^ájíW°¥fðoeT tŽ[ƒd£z£Ë°ÐýÞ™$ý¾oוRÒ‰*ÞŽr}¢wn¨-_T&£tbøýƯ­œŸg@í˜Ï= /ޤ%ePGNÚ^9c8{á‘Ëû6ìmèÎÓéQIÐöûþ\3¶uŠWpc‚¥(ÑD6¢Réˆ}ç¸Ø®Gš ýÝIý0µõs*›I’ñæú‰¥U'ãÿpÅrxHjÑ© DÉ?|æÀýÚÔÉþàëbµn´™¹I­K/²Âm¯ÄÍG;YÿyÔ1J¹ßÌmS–_Â¥gñÃÿ¾ÙíPª­Of†¹Å0rÛûS1MÂmÖ MËEúÓ%Ç«ËSͦkR„:®mß$°Î!A”¯kp1ëÏÀ.²~LXdwIÈþ÷ô±ðñÎ+¿|¯¹Uo«Œ‹¨míK²¼Ì'ÑLØ›[&¹G2W±ãG°¦nq˜óPõsí†ÎŒùÚöZÚÄ^ù„%â¼—›Ò?n«rè"ÖÆ&³ŠnFf¡ÆªQ»ïeíÆ(—Ýj!zÑuL\šQ™}JÞù~„K—ÄèõØË×S¥Ú«e)s¯¶™hJgxt°j {~p?{<€81“bSúŒÞ”¹Éjù¯D´iy¦U,8tjŵ.ÍncôŽG%ì57€3pÝJ¯‰Y¦dEp”B9;2uŠ´|꜄8Ÿ’+è‘›yf·™LfÝõÁL'@Decú1¼ø„í@ìR¸²çjWYÂÿ ìöW½•gH€%ALFóRøÄ‡9"ôþ¯¬‘…ê„`$ ÀÐ_´K½ýOø+_†˜<ÝÜž§·ÉïÆö¼rDYà?‚>¸Ù&µT=LW¡6A SËæ£Í/ #9dËÚ„¹hSãüi5Õn‚T÷Ÿ7ý;öÿM'ÇB&Z®âò0[ÅöeùÜå‘>Z ßgû‡?ÙÅ¡îàë~.ý9· Ç@ú›µ£DCÀÇhÿcêN1ÇfÒø´U¯3Z^j,ƒík>’ZÚš¸EÖ†:4hM è ÿû³çE¸î•(¯zG+Uª7¬/c¿%_©.u{&ÒÐ0A0 ù彩ÈVnF`GÞ̃3ÄHê1®þ¬È D–à’¨µ‰ä\ÐÄЯ¤ÚÇ•NvͲÙ÷ã<ùê j4&e×OClg`K ­&Ù2’ÿvŸË|j—3ÞiÝ€û8‰=§;fú˜Fñ” ¸…¸‡XõŸÇõþøcíÀ—èùåEî°Îv4ºÇt‘Qspp%zÓZN•mÿ 'Þ×2›_ôã@‘þѤ}Ùžg4H·’IPÃmŸ¥¤•{i$0LJºðìþ­Hò‚7!Á Ó®Þ~ÉZHcd#øh¾¢û½Ò”“Ÿ=ÕnéXS…%›ÏZC€ä£!ZE¬ÞnÙ­¤A‡ 9«ÈÿñƒÜ½ˆ(ý!ª~LŒcÖRp¿|øá@‚ Ü¨8ã¥tlåv{átÄj›ôßêòSù„®>¬x8ôÉÔþ!^‡`A‚r´ò#º=(<\« ,Ó§Ý[¼ÝñÝ™ É©wŽËºYaé㥧‹,šÊ2¸|ÏTjA.táªôm)Üm¡‚br(0׆à¥Ë¾NføÒ%ó ¸·ÈÐ}…,ûGBèÙZoà“’s(-CU“á4,›‹ëµ°42ÿõöñâ¿Õ}Ä,H©j>1™8ãÊP9"νô `)TP8ä«ß’Dsxþ½®‘ âÅÏÛÇGÑW’]'­ÐG>vºR?ÐQÔë+o¾(ùæÊ2“Ï(2DMÉBþ‡uÔï6‚¦yTèÁ %&£Ðéëà*Y.)ì,|Œ“˜µè ÷Dm:wìÔ2–¹ÀÓï7šï÷Œ)ž4úänìË굚ѯ8–€æÊƒRà·W ]gÉ3OwKE^3®¦QŽ%ÇOÞY ~Š£¯ uö‹ñ ®­,©õm^ -qäŽ6u›.,XJÝÑ`ßòàXlQÀå›%²{SÙ:GDl«²ò’4Àô %t²}뽊ÜR »J;±ùž—WzfWcŒê0a€lHÅ\H5Ã_²m Ø£!Ã,CFÇ̹òôxg`­ïg¯ÃOÄ®dá¤ÕûWmâÍ‹4ˆ¿Aµ˜‘†@ &Ú[D )5:ó×q¶‚cíùò†ue«$س‹ßÖšd¥©ñ076KÍMÄÏ#\ Ũ²ežd·.5 BzDu a­Vo@/s*/â>þ¿Ð$Õ´BnŒ;°àß,ÌÑ_Ôi·”“kÜ$Ÿ}˜ÜŠPƒ{!,: :-ÙÀŸõ¤°;¡/dÜh ™çÑ2%iÀ:jQq!åKøË¶&mÒ7(‹¾|öÔ‚iÜŽ§l9ú÷Ԉɗh¦…BK"Géþ`Mä[Ý?AÁ:™Ùå(É ‹"0ÿUÙùù@–jpPN6M€ƒpÕª#†à6Z˜#àp«gLa%2‡M+Ã䦵„¹áÙC·mÜ)3F¥ûÉóK?ëÎ:Ø–Ì„áîÏöÇeÅp"ÕéÔ§or#³mæ¹Oÿ†pÞc6‹ÉWÛÒhËÕŠ,V;i¨™9´d˜µÈ•Ëð0  2¦ôÿTé%]ÿÈ7|½ÙW\þ:€ä8"ÁÀ‘"X#¢EÄ#m¯±÷â‰mj=)+"èmxÃÚ߽܅͗ÛÓ˜´(л¼v"nÞ_‚‘=h"GyùÛß¹w$ˆ¤‘¨ë™gPEÝÇ|BÐå3Pº°%}„ìm+%„QÃ@ªï~$_Ø%ãÞl&€=Ûö¦Ó®m¢væä·OB–†±¨ nF„yÙ€ˆÿDñàé4e§×å©«¥!yÏÊÞeIi°ųÖà;Éó5§:ª~«<Ž”¢×„÷³îW›öKÿ캑8¯göÑ:ø±=zPÇê»X·sB·–ƒ# CŸü­fAÕ¼?]C'nKšÿˆnVJk¡­ZÆ/ýÀ¾\RØ:K/¯¿)H=Ù…ø¨ŽÓ:|ÅŽ4Zs±{HüZôFìþ]Ê:¾:˜>Öóƒ3h¦Rpæ)±Eƒû¬_òò4£Ç"üNÇ‘‰Æ'æHˆ*Xk'Å4Y†e™p‚E5€üÔ±êJˆºôgBÖô¾‡yÀNÛ‹Å5EöXÊâHQoŠiß ªHV Œ;-xÔ+ DJ±0žÏhÑ9²ÉÏ«dmž5kC)c±J‰æÁµ©g{8ô=­*ÃÒè«RZÃÜEz-«P÷ýŽÜÒóœD ¥7;¶íP P„åùL¯¿Wž ž¥ àé‘´ôÄv˜¶SKäöŒºs¿Àq;!%kÝÄËÜ‘mÚ| Œ—Ýý·–~î[‘ úK¬s1“Ù8-•r¤Þ¼-AF/óºêÜC|Dœƒ9rŠyR+í;NüÛî+Ô~<ÅVG‰2[P⬪#Ç•«2Xwúmí/šóF¶Gߛـkà0qÓý™§mUI²h©çM¿°L")ØAdG é£Wó<8(ƒÊ Åe  T¨x¢çK­Âµ‹P0(ðëÐÐ9‘–â@3øâ¶À_„÷Ó¯Vx9yŠZÓLE§ùkíÕ$OéNÄÏ3IKa–{À-•À?‚0 yˆÑ²ŸÂ½ò?`Ó™½”S.ÝîæB+–ž5ìS{Á:«г^t/S;ÚÍ2𴡈¿‡vÛ¹é„õ]–DÖpÝX!-CB…P>pJüÞ˜ à´ïÔ`½¿Ãl¿ê …Duü¼ µ ~"ú¡3˜NúÕsµGfݽ£°ç´¤Q"È)ô( ¨èÄå5| SáÔÖ7¹íe9ð@ý½VÏò£r†»ŸIå‘ Iæv$¬Ž]mƒ{]w èî†O$À— JÈ-Ð[îË Õâ”È«2#-nT-â(‘§%ÕQD}" …‹ÎS¶ò$"‘Á":°OVhœ¯¸,å©ÝZÈ cVÓ ×ê‰W[áLª1ë#nQØT(¸‹¿Œ~w!œñSð¨u_½Q2"Óä,þÒuÄ: ±V9‹œ[¾1Ð8Þ½y¦Ûe5¸³Ÿ–陳®šD"vn¬@Üõ2íØÐË®˜B`k\ù«G•ƒ¯½P&³&T(Ž‹~³¤2opÃŽ!¦«ûI¡·ä.~C®Þ‹úm58÷ùê4ð3oÛÞXü+nv<'¼§·¥ÀbÕ4¿ŸQxÆõöf3|­êÂg!·¿“&n þjzçĹ’\÷ËZ¬Œ ñ{-s Mªx=éB›ªóÆã+Òé±U´9x ‚/’Eq§ú0cÞÌòIZÇ,OØü‹ˆxVîoØÿˆÖø„€ œ²(ØÐD4×ïvȇü§}ɶX Ç9zÏS~™DÆ ï†Á˜—M4öŽl!¶3G¸rw¡±«†ì;Ƈäq7gýä|BÀ w9vIßòÐ4; IþH ‡hG!È¡¹aÌ+§®ÏØ^i½^KYûo˜kÑ¥nÉ<ˆ¬ü( «­á*DwÇž§-}±ÎðÃ*€[aÊã ›¯ñæ2¸©Ë»Ú:+0ؼ“p7§žqzÇÌ_’ŽîÝ,¶ ¥pÎ Œ“/œPÿ"²mHrwgµöb4ÈmÇšªÔwÍ ÷rŠ”‰H]ßU.—2ë­ž¢†¬oŠûiœ×ÆêÝ&;u)¹Haoþ!) îN³Ð¼8¬úpô÷ å~qý3Þ¶ûÓËa¾¢ãËs>.˽ÉQeWf¡Ú¼q?¾ çì°Ý 8Ÿº¯s`÷\[JŒœ£f|Az<0É«ýÙc&I­ãÏÈ! ‚ø=åT}t’’ZœoôËoBQ°5?>û DÁ'ŠEf€g·ãu2ÉG¯•ê¸M•i7˜~…¤Œ “Ça”*êeêšëè§©Œ ÙŒ²7¬×øI™u43®3ØXžÍØLàÓˬ2‰²®Àªx žUq{±‘½~o;z fÆÁ€RA¬PÑuæDÎÐ1 ㇓~NCsÝó%+MFׄ6PÖ³ªŒ7ÿþÅ™"÷ôœ=@P>ênà†Ä€| k\ñœ×/5Õ·ö1Ū)˜¾åtix'z"úŽÏA ƒ!×È7èYj÷ψPS>h¥·-wßw‚Îìð/«~ àµ1Îðïñ¦Þ£°ðÛÒÊOx¸<ôJ|)¿‰^IåéÒ†…1iX"8 zYmÆ-íçgzú#€‰³·Ý`X ;#Z˜n¼š1îóÅ ¥šE eì˜ X±lÅ’8‹¦ŽBûŸPâݹTÏ4:n&f%Ùìû»Ê1ê@¯‰ ™ˆê í÷M^DéJF›ÁEêΖx¦T†ö½ô3§d‘üol³;ÄVèŒhÍY ()IT–!‹%Ød ¼´I!î¾S6×Îðþ¹´È›È”C1¹7|¸¼ŽXN' KV6:·ºl†û´¶vNrÿÿø„kE÷(blÀÇy*2—ûÄßT‡4qR3ÑhŽùj¶o –цϚ]ÿ!ã÷Ø%БÀÐ<ØL~vl­…ò"u_Ó„ÛõúÍiËÜä‹o €w÷ÿYË)"F»Áƒªd{A»àZ[“Ç•°)t † ЪcHi|€e3«ÈE Ζ‰‡¶¤ã-Q-ð‚Ïü¹À \`ïΪwͽmc_¢Ÿ!bÈ™Ì&!Ö~7k¬ÿ -m[…¹øMd놘ñßÅ~u¡ ŽLñÔ§‚{>ò°¾Æ–À¾¤~I?£0û8ˆVâB?ÌDz|@I7Eêá9®èuyõnç­ºîb3•«ÒEôÎ&17>÷Ú É©7qþêNÑž•✅¹*Íïl؈}ÿTjW8[mö1€MÎÁLÀddW­ñ)ˆËZ¸Úûþ&ÓÈ[kˆ×¥*5ªR9‡“ißWŽ1ÜÜäÊŠôºg™äY?÷À‡¨¼¾ã6Dk@|ô$z„_îž§2Ü;'$$ñ&T7së¶=nD£Øx§»V¨¯» 1·S˜XûÕ¤Ñ*\ß²>]ªÅªŽ§…”d„¨«Ó÷',$/Jíúx1¨ÁäˆqÇ©èõçP”Á á“´…%ü°Ö’¶ù:I ‹½FÀN¡æ6œ`.$è€zwJ©vÑ„MËKDgã#Ú¢ÙŸÚöe‘sqEù…læ"(ïÖT¿çzcúbÓY%\lÓ¤b° ¤l'ŽH%ÿ|×(ƒ2üåßño]¨–YƒÙ:b¨ˆ›‘<§hH|¦»¸}s…iË( À›¨îþ“4CÝ+5Ý [2³2Žÿ…jt ˆ¶ôâíîQ ½ˆîfJåzƒÃ»¶…”à÷g0-±Ü*Ê÷’.¨o·›Ó«Àu„…jƒ7ªp®bÜ  §ñeqΑ͖BcYíòÚ½Ðÿ"'¶@,ÿS¡+ÛS5zͧ¿èò.v"™X=OëRA÷ {}sÄdÒqŽÿεðŒŸ_ÜËeXÝÞ-¢¡f OÏs±­ò`’rXŽ(Ïã²c«‰öÞàÖ _Á‘<4ÿ­çzÔkˆúPOÉ4*Ñù ÏPGOUg½*Ý·/i±Y‚²ÅØ[ëâÇ<î­‘8<.TR­é:H•ø_,D9L¹÷­û† r¢lîQ:C÷?ýÚõ×rý‹:†X‡Þ„q9K‹ÅóéäèP@Ph·=I íšv:ù›ûð_¶~C~ü õN»Ýš‚Y¤•ÂAÎÙNC2 ¼[­šÚej4±¾4ˆ@­É§ŒÂ¡*ç:{ȇK牿Õ«ÌÞ,¬ÇtA¬ÀA•»-ÜúÈ^\Û­ÊLáÎò]{ )ºê¼G‹¸m˜cÇyéL+ÁxG|;)(5IË öD˜êÇ©™–ŒQ¡ %[‚ÂÈ}tÔ.§Å›£Â‚ sHªí¾X÷ÉÜ™âAпþDß¹×WFîÜEz³ï{ô˜©.‡R8™*`6öûÃ?G…å'É ‰ Ç4û öîk—åçR¹ädmöŸ4 O+]84ß´Ž8"ßæ}‡ ø¡‰#Ò´¯ˆèì Ý/\-d‡àÁ–ÊâJ’ü#A(vJýªçËà³kf»½m)G„—üø½Œ–%™äÁ|i Q¦ƒtxN«C‘‰|0þô 󀪙¡|Y£\ÈvV]µ½Sgºv‡}ò[½•#Ò‘Û*P@ Øâ¶¸<ÿçNÖ1‡¼ž1²a©£B—ÿ·Ñä´þ%|p¦?žÅ:Q7ã!Ã=høÍ÷¹RHÜìn/rà£ÍœÑ§0>cÅ'h´|{¬™Â#ª˜t f+½Ñ;$ õ;¬wR•,:«dÌíý©‹ ÛWÐú)ÒmÚ$R¡ò·ýH³ILÿR<7Žº¯æÕ±k»Çp¦üîF{Àr ¹òôÚÛ1x³›!Mè$Ô­Û™Ä"#òžQ2ÐÏK }Y_áWú¹/ÉKÂ$B5^•0ÈëãŒï£æ+šñvìp}÷g?œ˜V4éØp–ú|=pÍ-×ßúêF6rIŸ±à™öZš¢`“;\í‘g1Ð3‰0LÇIôA"±bj-åªð/éÍ10¬/ùˆÏ­6Óþîn™ñå£Õã·ú «Äß`ôÏß-v_h‹#›zªeÇ/6¬<±’pïvÂ÷ËXÚ.í;¤O bÖRdõAÈ‚C_…–HæÛ Qï"‡ÔúÁ¾Íùò¼mž ¹1æœåÑV¼êøCQ/ßé ^$¬•Cm³0m1u]¦6µÙrüãæÃˆðv°sOH‘ycÃÿŠ]ä [O²Éæ ÜÌv»¥ õÈa0)ãô‡3g; ts×,Q#ô×,ð×ðÞß 9+ö]ä|hæ îâßù$yHè{KC®R\4eä)b¨ÍÝ»¨8÷uÄ4O«’=—VezšJÅè-‡²pÚÑîx`)Ð@}ã²,¹d é÷~`@OÀ–Úí#ƒTTÝL!(j¸fþ"„:Ö?èQÿîqŒhyëâ‡7ȼ€¥°f\`y.@G¡Þ‘¨ÕPD§„ìÇíÁºÆÓûÁÇ›ˆçwÏíqŠœ!éC™rthÚ®P+èç`ÇHRÔ:ñý= >÷§ª!œ6?”©ý`6ÝòW"F§¦ Uš‚Bú`n°ÄhödøkF‚Ìíˆj;}ñ?R÷awZ„=¨•q*ñ÷ ã’£­Ò3«³­¨¢å3@2«4Õ湋¢ç DÅÚ=²ûlò#¯ðQôðøÑÑÌ¥·_ Ô?5öûl½tƒa<—4ø>ŒJŸ?ÙÕ>èìÆ.ÞÜCêªlÑPêÓ>(Ùæ‰û°©«;Ö€*ªl-¶ÀÑ}Óéð¹»j°ß£u ßýe€¸Å*Ž:£…TJ&qðEÖg¿ÀàŒ¯ùV4³¦¹i,]F¢²u§\Å0½³ÚV8£ÐÃÜzÉ rÿ!ã•F¬ }þ¨ûl Eej‚1sгšÙè•Îí J¿à/=ȺÆü³§&Í`Ê?ÌÃ5÷NÿW‰ñÆwzÄOKþ?ë‚Á W~Båà6ÃøÕt+´–'ŽýÞ‚Øœ°1ë|ŠB+ H1¿M<Ÿ——îå¸LʵõýL,€<¬†± Á©Ú5Öî׿ܩÓÊ”wÞY5^‹¹™” űð$Pt-Çå=gרÔÅÿ#©A±pV°‡J}ÔÔÑ.£šSH}¼±õû³ZVü“rÃRà”-‹¬%j¿ÇŽÉ™;Ð-½àÔ¡+¥œÔ­çÓù4˜䙃‰:…Ò÷p_7숷0¼ïûŸino2µ·›#V RÝôáãWÊ>bXF*c'É?ú€S¹NÅx$KŸ C¸År²qŸY4<€önÑ ›ËõrGñ*‹jÈ6fGàþ“ú°60ú«àÞ—LÉ¿“ᵇî(S˜N=÷·r˜úÈŸâ‘¿Vó_ñ Dœ?T._g"•“1sö‹þ¨Þ-ºç´ŒÙæwRîmOõr.Ô`±ú~Š)ê¹HgÈ ÒØ¥’3Š(ÎÉbQDŒ]éͪû§§‘2†m(Á÷]L¦ìŠ¥ì”°’)~s§P¢<[•xHƱpËgL öãc_¯,‹‹“Vë¥*o“!ߦ¬ä®Y`#BÔN_m@.œÒ§Ñôlè¹w¬,†~³Ü Éd±jÍ-[ZArKÊPÏ1#gö¹Ÿ—¹bóDŽIŠ9aW®}ÙðM+¶wÒÈØ­)X¸¬jSpÊŠöšáàa6š¼*p½â+Î^Tÿ"bÖ¥†áŠZ¼2>îO§¨D@™òl³ÚO „L²Åzl£—a,ò>ãp4eçà¦Ò\]¢®Dææp9Pm—ËLì(KO+­u–;‚ÊRP_÷mèÚõ Ü„ïFxUx];ïwbc‹“‡ö«|ÚÄÅB°A«Ç]Q1£‰TuÍ´%yx ÛºO¢ý¿Ð¼¹æHVçxm^´J¡¨Ù/Ôv< þvö3Z_vç#í#È–î=A¾9êZã…gÕ;oòd† ê„ÍqÝÒ@xØ&_}JX:d4ÈÒ½²±‚Eßí·>Y¨ªcœ‘:kfqPJq8Í aµ)×·ìw’­ú¤qH4™»µÎBÖ):—byý%&v׫¨3¹rÿº)á|äYÃ0ú ¶#†7~¦h—ÒÛÇ.˜_·Û˧/Ö ~yw6REwäù{ä‰þM‚zÙü³ð%ðX.’Ó{ËQÙŸ?º´5r­!¹ rèúŒºßøzÿÓö¼=ÕÛõÌ…z¿/"ë©B Z¡´Syœ£F"î^4é‹ÿUPê°Í¶b¡ŽöÿŽm'úþ2®á8³D‘jQTcºòYM9õf3«¦¢Æê•òøq [ãG„-]íE¸ÇuÌ<¶V›&‘¡pu€ƒÚËÌ88ðÅx"ˆsýM#-°úpy”Ù8™xØû¦¸èoÕ͹0é –ðÚ ÊŒC¼ºXZþ#¶$€Xaê÷)ÜÎáÇÏ'”&¡ÖÅbUk”Á4ZΟ+1Ô£ ÷ñâ=ã…ç;rË{÷~óoŒŸÐîÙÀ2Š•áõŸ†çÆ5Šjᑱ"̧žÎ¸e½—*½’a|ôýYšÕ~}ÕÆ. ׿éz*èCZC®ófQ0ý­½{ cd)‡±WS›þ}䣂RuI‡‘ÕÑoüªq'Öb?…ÑY)AZÁý.HäÝ2/`"xdu‡¬”´ñLgðËA\Û”ƒD<&Û_ÙØ n) 6uû#쨑 ˜Ùh.V´"¸¦ÚjéS`¯s šÙŒÈÕBöw©Û…Ó1TP»ŠêÓÄè‘ÙÑPg9lMýó%JÉUÒl?¢y~8(µGâÊÜœ£>y¤ó¿ Èñ®Ä°$ –iPÙ»Yã¯c–×måÚž6Ô¡®`ÕŒI% ¢Ÿ¾ãSÈ0\´•S˜-׉B:I" «gêm¤|IrRÎd9(Ã3“wr]A.üS}„‹@½ÖÀåmC’è·Ç4¿áS„zïÒ+§a5á{É«€Œý¼Rµ¤OÌ,\…`a¸IÎ=€‘‹eu¡bu‡# ; v_o™‘¿ìA­÷uä–:,xˆ€)¤éö Pþ6•é1-Ë,!.)ªQZKÁpQ秥輳$‰!šÆa•¯iâ¿ÐJõh.žFù)8tDÝ(™#G[ÿºçËýh¦c’¸ïY“=Îëñ}áùÜ6]öë{Ô ’úÇÉHþárèI´*õHUÇ„¿4K÷Ü÷Ÿ“‘©ä}vÄ»où™0+ÈzeÒ`‹zUÏ0pϯOƒŠ•¾Ú°¹ Hb0èI"Î1ã,ðöyq®öŽ<µs{*Øh:)Ã?<ŸîéØïœ_Ô7 yÅ!9ÜRa&’ư‚]€3u7©=êÚ]MZ'UáÄ ]1žG’<Ézð^êÛéÐ.ϲ9¢] ]ì8Ͷ‰?ÿ 3ʳ[¡ ŒßWbßg°¾{9½ÿUýþ52PPgŽË¹ Ä™l;îÉ®EÜr,°L¼ì²­2Ò(Î|b^áW®u©×9¢URSo»d±Â¡£øë“’š q%B}Ö!}ÇÛМ‹¡ é àšq½›è5(¬Ü/c;ÐMÑ´««A÷…R‚„ªkÑEJíd —(×ú„}.¿#‹ö«ûâШ¡KÇC0¨äìÊW!übß‘“4©èæà$¶4{½v `#SB2/n¥Ýx ëY¼Ë nû=µ>­Q–!ÖW"= ÂHtaDˆ…ÁŽ~”I.­×ñщ»Q¬}@hÇÒ98Nï«Þ} í8€P/Kœ)˜0¢5E…ód.$ñ˜Ð-JOÛè´`>|™M&øuÆÌ®½óbÿ°vr§áýõÅ**ô³íG™N˜ÎŽ›†}Õ¸ ÷ Ô¶?¦¼Ì Gú¬³ ¦ÅÏýæ½Á¨Ò¢ëìÝð¥A¶ªŒ?`'`yw¯ü¶°„¯l>l÷„ÄjùS#Ø†Ø a»fLçG¹¢ ± y錚Ҙ%ÄËØt9–~y’r÷E2ú7{«Ÿ#"=/;€Ö‚_.ØÅ®Â2}Ô”˜»K–Þ’Åi2w)Öá¹S$ 9²^+€H5ª¦ĉ]§Í÷vþî&K_¿!ÂÒîdPGT¨Ò1Kí +•ªxêTsœ¦ý iÅ·mÛSëtW‘¦¤—Ã+JŠò«j?««ä XV‰Ó‡`ô(Àˆ¤ÔÈúÒ$ˆˆA+‰ò ³Ñlï —p´;“‹0×ýß2⤊Ÿ‹o{W­årN=Cø²äÃÀÎÁ)ú0ÈÉ(<ò$pÑ%˜îaw†ìÈ=€Ü-4!èyòS¸RS•Ûi”Vy؉ ÉöÊÊ_ž/ömnú«C •åµ›Œs?žÀoç×R`#ÊT=ºt9MçbYW脚öÒ0gà;YeûŽó%|PÐ+à‘ÄÖ“ Z9Ë ê6XœÆsHû¾Ú²Uµ›‰"â/ÛD°ªUƺ€¸”îéÏb·Eì+Ÿpâ¢[t÷›…üT*z,÷.öš:RÌUnÝa£;"²+>!”·u–™éÀùê<]žžý°³|JFF—jtO(ÝÖÁÏðJ2²WÖ¦ñ×€[“÷OW4›…ëU s‘b®˜53Ä&^™þª|]à¤%-(Ô›Þ¼ÉÖ$ÿQ„ýÊæ£Í˜âßAËáÚ Ýhמ æ‡ÔXzäx€ бêJÝwÙèVÁøL<颋~kP ñ & mÉ1,çª-@XXÀHÔP¦à†ÌÿßRßp!Ía@ÓžÒ°_e¨ÆŒs»‹€•—Y;. îÌ!-‚LëVüʱÃuP¨v‡Ã,Æ]0ëS1† Ý% h ô`1VÎùäZ(Ë÷x-0Ùƒ<0g–ë†Djþnò./ãìXw„kWL}e~ˆÅ9W.fÔÎ2?¨ ›r}Vh?-h¡Ñz}q}(&Q÷ˆ²0:£áY”Ä›zà­Á[K›æºAwÜ—˜ßøö!nâf»çBÑ—ªìÖedŠ"à«è!ÞÀTµWÂÍh»ðil(^P†kþÜóó¸Ù¼f“{qãg†Õ¦‹-ø(Kuù;Œ‘³ÆÍÜãah앨$¤»{®ÞD¥ôÍV‚JÈËÆÆ¢z ‡Pÿý¾úЃk´B³hÛh3íw• í,øsÿÉP7ЇŠ¾¬ƒWP  ©sÝ\WâÍƵû—‡†¦ÿF¤–ó†fßçÞö=–Ñ1ó“#[õvÛ4Í WúlÞŠ˜„˜®‡¬±fÑ3*ËCXâ‚w/òµD¿[¥ÂMž%½>`Æ)¸§ËfÂt9‚¾(:>qã* H©¤žÚw0U©°ÖýÒG™³SËqïÕY">®oøÆxø мtŸ}p5Z¦ÚJmPs}S}¦>Xõªkëî†rÖ"£^³;³ ÿJMðßU•t ‘ógmØ^ ߉Ü;ʬP€5è)­¼ÉðŽœþ`ŽÉLlFí³!®WEf¬´,Hý±_ÑÑ›d†Öžò`0F`Œ2f°½NÄ1­”~›zTØ4¯<®;—-üá²÷°Sµ­I§N¸›ŠŸÊª¢©ÉBùpÔ¨äÍ·[ ×iBáxö.ÕÓ(^•¯ôÐ[è÷)jå˜ì°sæ½¼êdÂX°›&ãt²·öì¶a¼Æe*Ñl_² ØK»¦å~×8mP8)Ö±ïO)”†Ìãä™S‘ÇŠ%mc8 Q@ Núà!ƒŽ|·%ƒ| pg¨âx£¯Í"AoT½,½Ùa*æ0â¿×S6ñ“&øòϬÕÐ ¯³÷åû݆¢“øÊn)i0qâ@Ž­‰hF:i>ÕZF™•ªFZúW­/{àiùSÏSpL¯ªFÀ*µÎˆ:D>–è ™ú‘¼ðÒ¤zx¼3xŒIŠ…êMîHþ÷ãšßJÄ[» Ùkf”Ä!G{΃5ÃØåÒo3»äŸÄýWKˆ^8‘àëq»y§©¨z¨ú› A¿á{Å,HCKUüõ¼Ý°Åˆ÷-åà#OÀìÔ•lÊÈ'g¿–ÀP5¦n¯š‡I®ªÌ[ðÑ<Å%ˆJxH΄>ûEwîFf/ǰ‡C‹õNK¤ÉG¤¼P§Ä[gÝÇ]ž{‰Úü†ùQ¶}²Ï”ÉùÒùvlZ—œÑ­Dò!uDújáC’?Þž„×2ŽéN3?ž™‹R=Úk…ép5=y›ŸZŽÑª’g‘]tÆàþ*~=VK ±ˆ#öV×… µ+{TE¬k_+ÎüŠªïòC°CvYD±ð¬dUI°Å¤ç5¥ÐÁ ‹²oÿé³u•ÒW@E¶X‡d׸ÿ†Ÿ,É*ŠIl{ºx \rùp ]ìßB·-=öÌìúBé$+ö'uGì^ô=¢±´™¥ )­ZåœTâ­ÿ?ËØÛ³8Œ8ÍŽe\êÎé û^Âõl÷5¾¬7Œ»þh“>tÏ{ªQIyðâûÂí¡]º˜÷<ßÕÿ‹ˆj¾0º‡*<+çå¾UoïÇ,ºI2"K;DS³3jðvßå[w*àtQ t‰óÍ´´R—ïL^“Vãæ=†C×­2Ðn#< ñ}±É¤~O{±møW‰Zà>"¨„©²d–ñ“­hwƒ€3to⊄0‰ÄËcLÖ!¶eÛ–Æ:q´WÛû[bá?Æ“ ògnÔìž×1<út“|÷ÝñÁ{aâñ>°UnkëÔ+,óÂrÊÿÚX÷¹îžÅ<‡ùŠhó©Bµ¿+J¡íc;ÛˆÇ[« çç–ž˜t ¨:R\Ž5gø ‹Xü9‘ħ4ƒbU„ÊÅ\wX5)-€›DD×j©te˃½>µ¸É-¾$ò"úX¼Í‹ž½œ|q+z˜d¬EÆÏLÜCf-ÑÖAgðÐW·u¦Íìc‘ cÐ PrÒ3·C>’ä46y«=4w„ïWEÇ”•Nv6ùx¸ü¾+»wÅÀƒbó-q׳£ãBþÝO¨’…—ÝX­‡×b\<ÝÓçqÝɺ1ƒ @Fá ¹eDó£Ceø¨'©jX’?H=p¡?†}N‚ — òàu@>À±øRÔôF(š=ÄÌÚÚµiÈG‡üV%•×ÙN1"'o™5‘‹tÑ©a¿=;’Ÿ°d*À°Ý/²ýF`éƒ{òæåëTC‰|9ç]¿âã[§Î8 ûºd#§_W¼k~^gÎÈ>Ö—@²øðnõÍž«/ÀÜç[°ÕÓþpÑI;—xnø$pÚníkÛè –26C£Òæë†`mtìlEŠý_]ÆÕ%´Íž d늭p&‰ÀUî]AíK${ö‰ˆKh#ðµÞ+ §zg®¢èMí†ý]·p¡Áã!ó‡‚+­G~ræ¤>4-üãNí«˜># ‹§¡–r¤§àøzu‚æfjî2¥Àòƒw0½  ßWM‡ Ÿ¤ä ¸J|;˜ž·WÃ’ä$ð¨y[J’,°nÔå¶?òf‹P»M­ls2Ò–/ßp2÷Ÿ1ØÓ‚J‘z©˜\c.žŽB:(í4·‘˜¾F“`‚‡Bs¬ïâC³žÂøkÅ=#6¾ É´@(å¯$K&Ö—¨{ãƒiC¡t§çŠöòåk£¶w[ˆnŠ_®ÓUTñt¾é·eë+'€„sÑÇsy<¦Þ¡o¿œ&‰–FU߯?×P¾0·¤e,³˜KªXr£Þ¶(I w$E»wŒQZ³°J}AûbU}/ö!YÆxO߀·|šaaÊÒÙë–Ú2k®Vx[œc¿y“ðûzó‹øJÅõÃÎ/­§<dâ bƒ¡›¼=ÃøV#%G%»ËY½éÎÊÄËPö­ »‰ùº9HÖÊÃÞå–Ž«‰¨2 Åc檂—9ŸÙ"M[ª`ºÊɪM›¬Ô“ÂgcÕ€Fáž«Ë&ùøµq˜C£&\=iòÚ‰ÓD ·Í>IžÇUkŒ–ÒÿƒôôÄtÖXˆ>¥0UÖ…\ñÓDj-æo’Kó;h÷hvp‡ &$Î~/£;[V’±ÐËÇ/ØÐ€õ[ëõBÿO k`&¥«Ë€ô‡ÉŸ ¾Csµ¨)þ òÊÆ.›ßn¢„óúJÚâÕQ#ê^úèÊ>¸ÈršJF${÷¡]Ð#…ݳºÆÌŸ÷ý-µJ‚Fé×»uB²fçU§˜n¸î"aJ‹ÀWü2''éO¸¥ò_ü“¢^-§[‡€/çÚ°‹‰Í“['Jdîá3 Û—aUÕoy‘‚¹çÐ!Aó‹2|›–§‰¸P9ýF¢Ù…(ÌaŒ(ˤØÿ1´¢b…þsÊ×ú…fΦs×ÊÑ…ßä–„ê þ˜Ï‰0MèN†õ¯GÉi÷£V2“†]¦ú)Yë…îfÐä›3Àr¢T+Ûߺ-„n_=Ru&™’ÁÁ eÈ q/µÊG`[±¼_j\ ¢91yì„!’%+~Ã=Ž^üZ~ƒù š1öá¼J‚ §¸ ªOÙTDfJòK¢hMèÊEÙédrqñ:~Ë“m¥_zª%Rñ½Ö}öåV~M˜¾ ƒ>ƒË0ëÍ¢M‡ŸÑÍÅÀcÒî„2«4Dmý€·ðX£ ±k#{¿OŽ•ÉÀê–O/QŒFíO`Â"Ñm¾‹0sá‹@ ¾ ¤ëÜqruËÁX’I¼†ü,¦ ŸÞWõdœ™[e\ñ•ðÁൠ±IfT;¡§D.“„#áSš4}Qu„Ì? ˆ]?‚OÓ/yÛ²6+.®OÝ »½Ý~¬–°ÕÝ´=d…ÉÔ)¿ŽM±sGäcfîúȇ)L&b„«c*·õ€¤5·àøêk·"{;Å6©üÍ'5á(6À,'whVýõ ã"}¡, ÃÄ\ZËÒGÆZ·ø —æ4¦êÞäLÅutE¶wêY;²t9žôL6Ÿ¥Èº6B¯tÄìX~±.IÉ;+ ÙkÕ‚/SĶ\€`ÝØÅW±ÞjLâÌü;~¼DŽfp¾ç¿Ï•U«îyì²ItA7è`l9–@> Ov÷ù•²_í<á´}àŸ.”0ôHù%ÐoNÙÂ?1u°lŒ>7Pžˤ#©@WT†Ô¤§ÛSؾm¶+E6ÁAÎ+ ‹ãòã-MÕ lÝ÷}¼G,kg5u|w)üÍRßj–Áp°']ð©‡e¸ià —Ø݇ëW"ޏÿÌtü¢) 3<€Ûª:â{k9¦0dÛñïÊ·rïËŸ2ë¨Ìj þ+E}‘qÚÝÜ™æ“)!Òàâ=1‰ÅXÄ%‹’¯ 0‹n;ÿšzÀd¼×µ-SdWo˜–,CˆAˆF˜C^8¸×u¼þ-h°| Ã2Vmåù{:hѺG†Ê¢ï'ؽºãn´²ƒøD4 h°ÇÛÌNóYÌ/¸g?2 øZÙáÓ¢:£ÑD 2¯1ñð|áx›„ŒÙäîßq.. ó†®Q hÓMÿ*™3çPŸÛZ®+½t{¤˜-°å`ÀÍÆ"Òu»Œ% |–Uñ·Ó&õ»íl¨‰ /u“®yÛ½ã[ëM›4½©cõì(ôIŽöË$`þ%*)°ƒ4ø3¦>\[ížÆgæ½C†Tå£,Yì’RBUÎYÈó¿È…$?(ãY›™‰µò²ˆí‘žƒ”ி-‹ñ|ì<®}÷6ñ„Âl©™“J™¬Ö:Lµïê£7ÞGOúßûGq‰6¶‚S^Ö5ÎFÛìpÕ€)9õðü‰Ò’½¯æ!í ë•dI–ð|ïmŒ§‚² x¦—œBLÔöqts)(ðð(©¶™£Lxj&1y~í\ªRžML‹_’›`pÂ]ÙúZoÜøäxÞË`#Ýiï@¤“4ÈOfV0ĬÕhØÄò!L«°’'·»û½«{_ ¦X½]áHòÜ3Kßä`ƧcpNÝJT¾‡á‰ø%PÕ~ø¬ïä)I’Üx—%TÑ]RL~5_+â£.ëÿ.qŽû7ì†ÓCŒé†/Ð Í-Õôç`~T¸ SL«ë)Á|6±w¶ËƒçtÚÛ& T±,ó%""ÜpVù;1›…e‰ç…LÆÅçÖ]ùwUóK»—ÝŽw|h€¸0eÚIùÖrc±lšá„ükh/ö9úJZ.Zêy¸ ¯E(‘¦¾Ÿ“…e®x‡ÿšk¾\M”·‰¥,øfÇŒЧébAéšÓ¾åBˆÞÝpnžWàg8”¶w ÏyâkÈøI ¼>;%Kùa‹pù¥ê×&œß°`e)°Y -•ù?ó¡îÃËÿÛ‚ãØ˜>šc…ŸÙ§æ]˜….IjÏ@‰:nw^®?2 ¢Æz·ÖÄOµ«EŠ´ìÕ1ä2KßÔþŽZÂ×:¹–¯¸Ü¾¨õ²xÍï5aëëÓ¸õŒûïë1$¤_fò“º¶i@ª„$ÓÎöótÞaûìŠ^YB¢vÚ,B¦Ù^%æƒt‘ž8²¿ iÇ–þÇu®DÅò¾‡dw4 ¬ñ[Cÿ°˺W!ŵÕý ˆ”s8u+ÀVŒêE)KãWce/îØpHÂr@ù¢ߨozO¯j²æèŒlH˘”ˆ9ç>æ²Ì0Û¸zm·Åœ8ÓK¢p1#«ªMµw­ër¿Äú ¶>V j4^£s„fåÀЙ49QÅ"q&•Km- ö*˜[?Ôò\[÷PÛ¡Ógº2\q,$~¤õM‡‘‡rîf]ù>*TÁÈê¤Yz›„Ì—ñ™,X" 8®¿Ç)&™`ªÚ@‡ í úԻØzB6WrNF™Çr†þ ð?|oå0Ðb@¼=¤ª/erKË×S! çàG}Àޏ Š,Ð,Ü:k&—Ü9ÊAWÈ/·TN_U`ûõpÚÈÌ‹¨´7K ¦¤‘䀨±Þ压['=™bÜÔ"ËLr5šY™X@Â]D¦‹;än3¡ä7ÄØ²…ÚVÆý¤€x낵΃n³qá#·ãB¼ë˜XœXûü¢þqÍæÞ0Uø¥e‹œì])ðåÔÄ1Þz)cÍMÒd¦AM¸Q¬Åý”acÇÇöl<7Ñúù øß\ʼnli›.ï3¤Ø¹©ÅÈ”ˆãüWR‹¾F7òO_ÚoðÓ¿Û“TMH5>ê¼ÉêýÚz¸Áâ èê‘Å…ŒO"DqUÈümmì§1¸![ºA~”Šš#ŒF˜ Wb³ÊZ(þ¢Ü¦6ÛA³4Ñ+©ù·½p ¿ ÕwæåÇâ—>Ød9}¡Lа¿t¬adÜ®¬RÏ9…èk&q$]⯹!ÌèLSΤžêÙÍß|0ôÜ<]F_Õ¢Þ6 Èf]ä÷NÎC¬—wv™¶åxHûŒÇ®Ïýï+ç‘#H.U…iýP•ç”r3©Xß0™¿'«q(ËXßšBÝüŠ&­ƒÚÊ›1Ìc  '‚ThŸä0~ýŒç_(”±Æ×ICÜH`1xO# .œ¤NàÆ)±5÷^‹Wwi¡ `+1ödwBóüÑ%ínß=Æ/ßJöÕ3ü<ÁT£µ†…û™ýÀäÊ ÓŽM9+xo¿¯­ÄÇ{4ä@m"¥RÓ8»>^õFêcx›÷DŒA}AÐVf:éžr~´õé•HV9Ì ™ð±éGèˆ0'˜T”a†Ø¹‡•ÒzøµÂ¾ð˜ø·¤õ#ôR%±ŽmÛ(×5¥n¹ñØhlØnÀ‘:ÁaFmv„“Jÿ'ð–‘»\ÞÝÝÏŽ aÞ fáWm³ÇãV‰ß íMn}÷\ìIªŠ™Õÿ Óy„h#fåÓ=Æd¥Œ®Ã‘îò…½¡e/3®zä?(ý,ß` }5#¡ç·2ÚQè¦*ŠC‰KŦÔý~“aPV»}»3lnpïˆl~¬¾•„èAAÖ=:¶úïé—ÃÃ2µvɦÙT3xó+—a³ñoÔyÜwO—¿ôš{ɱ ©2a¥Œ×¨=Øì#ÛPt„ –üO7sþìê£A c@ʃº“¡Ö-2¬kk¿Ù ã0[bN‡œ›Î•‰»áxÒÝD$î©á¤p™NÈž‡÷,c‹÷e𺈴 7•(ÐÆa-»a¨ûM2?j{ŸÚ=zÊuÅöH:²ãv‡à¢4«ýæÄ®„Žá.¥ÙwUHò,c¤ûTÖ®GÌ*ƒ1‚ó÷èURûô"Ìs3Ej¦GÔü@³øÑØ‹»ÈÃŒæç¶F zGµgÒ)í¨Ïm¥`nå[æ¢Øž9 çÙG½~‘˜Šû¹êË›\ƒðæBÙ7^TÖa_¥ tûàÇÎjžÔ>²ƒnOËx„¹G„É¥[rK4߉ÿU9³eûº3W½*@j¨P"à ªC2Þ¥ ^ŽÈYµŒXÌÖUÓÖf´?-å˜ 1:\—× ç^îKùº9»ÂêâÏóßåKp§@hÄý÷i?¡Fj§7%“ˆMî€ÁØéVNñaC¬Ô'ÝIS{57O±S=À_ÅINÒ¡ŒFýUî+ÚV@ﺑ:ÝdîH;ìÆOEŠSNŠ R eP$÷Yû«Qó’T.Ípê+¢R΢·ä„„t§~2Ÿ¶³h’8G¢̾ÍêgÁøë LªÂÔ!Ò8¡$'378º=/à!Lo*m£ª¬BÐð>ÃÚí±š]' ñß'ÞŸü͘8ªo|ZÅUü_]vÇT§<`°Í–Sš÷‰‰÷Î d tEé6êÜ}î•OßtØýK ÄÝ[ç=Ù㊱½”Ž)•ð¯óñ<*=9ZÝèS/èõU‘(Ÿõ­ÜO ÑyšONmGÍ–ŽÜð#  ØÚHdèͪþ§ÉÃg.ñkqž—ngð eF…"šµÈ¼ š©š£ÓåûQú•tÍ\M-¼XÜ´QÖý[ ïbKº HÄTRµauü_ê¢ç«éj§NÀfý\1<øôîœäŸŽ@ýšPÞý‚¢<©Ù iì ú^?[j´™wfÉ»CÁÉF³¼ˆ ]áý ´jyxÈ xsh@aV+VŒJyð½È¤X+ùiúD¦,ˆÖ;¬=[Ãz”gê5¹Rѧ¬® ¬ÝZaH’kF{H‰P¦ ?ŽPF®|mÅ?PÁÀ°%ÐB¬.¾³cîm)Ù‰Âáéb€oµç"™óÅÑ(ì]þ²Xwó"ÒšT yZýL«œZ.â˜ÉÅٷιîàEcˆ›Ç#ãÃâÓ4TXó=ç ›£5P†Ð*qxPܪ/¥‚sûñIñ"o }§@wû¼Šë‹ðlvK)$†•2 ÁßQï® ï¨uw³ƒÍ±ñt÷Ê…ùÍ~vhÍDvÙÓªH¤m/âÒØvM`®,'°¨YµóÚa]\éu±¿ÂMBæ÷š-ÛÔ”í’~½‡ €{–•ÞÖÂûc- s^5Ï0 ­Ó¶É¡›® ê€\­tÚ= Þ‰ø3£à¦ûzÌýwSz;d±ý¼´ú™‘- {šì;hQcÓdW&¸úïÚ sµOŸ†ª°‰¤Ïd«þ”R?XS FãÚ…¹<û\¬)vá³0Î×XnäE»ˆ¹Ö+wyk Ã;ßô',ÕÚ(4kåEkq®i«Eøl F®Ø‘fûmŸ×ÎqH.rŽâO=›qãÝt»‹~zdA+ÈT)øeÓ2Mvt‚[%Š;-ëìAll¿Øøì„ñÿ?ÔïÕ,GÄPø‹a'Oe‡³û~çH¨…-Ù‡JT}»s Ÿ”ÂÚ®r$ú½ä)ŸþÙR‡:¨ûwÆãåͨ® Ï9FC¿ùZ™È°Ò[ÓÌ‹ 7sMºCþ!­ÝTÕ4y:Û¹0-y:|S$(TâÑ«ƒ@BúE*Úg]Wz@V_VdFÔøˆ!"ðxŽÅóÔP_œô¶LBtÅŠGV5¡ÌÛ#Ù_­Í—lâUÙwÆAv '—sÍG€m3YlY:bæ9|Àdª0“’Øyß‘µ+g:'©V;ÀÁ ¥nŒtͬ) T 8Ö‚s ”ØÝÙÞ ¹£†Ÿ(Ý„(Drf.HN tmOòóeËl+ã–¾ìJ ¨PËk]%dÁ¾5ùÅüWY‡•Ò‡ÎBjd4«Im$7À«—¤'@²xåJ,Fò;½£ØÎÒ©&ø3´ä¬EK½Í3´æf&Œã1kôŠÇPÂMoau¹÷Öú„½²@¸p>ñD`>Ð<ò¨@Z®æÿMªiÅèñÀ1hÅ7w\x v´)…xÚÄk]ý=.µ™Z ÁñÏ0¾çÜê2n4¿Uƒ÷´;s½Äæž$V›p}r@N3ú«ØŽÞ"‰à‰vO`jVõí½èãZäÒ€:ÎÁ®é/_³Gá†ýÓE±ýÅ.а¯”GO.²í¼þX{½á_š3XpZøW£pØîõh ^ÒÞÚ-ŽþÝÓó;Ï~>°ç{î}Û‰ùe¢’`¨Oõe{e]…kZ~¯ª ˜¬º¤$p:‹žÑ\E)•| 4P"E´ú|Çb¨ïn~~@Qaë?\’ò‰cƒ U¶ügÆBM7×õŸ"/ãV ìòF¯ÿæš88(×¾Úìß=²W¹•öñd§¶ðÉ) ÃÁª5gš/_¹ï‰ýßX¢{%˜±0ìh#b8©¹U ¼úÏRâSú¯ \þõ‰7­o Ze[ 2¦©çÑcÿ¢¨i.?Ø¡Ë*îüÍÁ|éFûÁþšT7g"¤ud’€„³GébÞøßrh`ÛÊö'ì'£þP†¢A À‡š$ùšÚ°«¢×‹Õ£{Àà@0©‚~FI6_n®f«SBxämQPIé§—ƒzçºÿcúÚ!Ò#— ƒgXz¬)¦$àçÓ¶fžð Ääýñü–!I¿ÚW¸­à$ZÎJY¦s30 ñ—!WÀ5¶d69Bºµ®ÝÄ£Ô–9HI×ä¥NïêÏp«SP íc‘ñ`{ì›Ë/®ÜäüÅ[ׂA÷ÐT% øí€Ä—ßä§‘sìŽ`âQ_ƒ)–wÓàèZV*§)f$õ‰¬¥Û“ßL~›É&«a‘›„Ú8‡Äl2ñtê ¥¯ ~6÷3ì©ATV«Ò"i–£øíäê†æ8Å=“å¥;'n½DñZmàŸ³väú¼…äY}]Øâ°Xê°ž9I‘”´Ùœ ÁNêKÜÊ«ÑÇ4t´£òªÄP€ÏF™°SË×®‘úØEG^sQï˜êðH_Þ4W%»ç¹rç¸clø’~ÓK”SÿçJ4_S'\>¶ öy®Ã0­¡4NÈ“•vÅ.Në†úÞ!~Ô齬ö}ÛÃ㺡g*+è.v kÙÎ@¾LׂÄüé›ßVí|Ž/6"–©ô7[~".7@4Fõ¬… +©É<íñCÞû@«øà¡qð²ýRkOHŽ 1:{{ŠHéÂï”Ò`Äd¿ÌÄ® f3‡X!~ã^ò¿ß ¾˜ùnÑΫ7bòëµëcÉY°¥h‹ _`„L“/S5¬©Ócú²v䔓ˆ F”ø<–à{J[H„†"ýv܃£%ŸÆQ.{æ€ AV×ÖÜ ÜÍy’vCesHÀG¸÷•ô–4Ô }ˆJµàÉÞŒýÈmB©žp£6 o‰t#b£¢º%^"îwÒ<À–ö¡s†*i eÀ û¸Åwî#Áâ£"½.Ö·Ù!.ß5­´»ú!V>Ñ Ô¤Qùy¹²Õ—7–âÏGÕ»Ç9¥æ¤<'*rÅDöµ( a-þÕÚQF}/ü¸ 0èκd3™Hm> ƒ›ì¬Z¼Yô”Ôð—‘Î3U3¥4 ˜Ù{Ôƒú*…-Y€€Ñ7+ÛÖïAÅÚ0]³ýµkZñ âÚ 7ø´ŽÅÌfcfƒÝÙzB>­íI|OU„q&€Þ©¬–‰Šøâ ¨²ýètÌ䢔¾‹t5@d¨Çâ& $æñvM)Œx]Ø8ò] ×Ü’ç°búÉ,#ù¢’x¾<»z’Õ|i£›u¿Ô­IÜŸD#ÑÅ2#CØVþ P ÃÍq)–hNàdš˜©|çLKhšW$ eUmÓjN‚e¡ç©ç®—ñüâÓ¿Ú…¥±ü)EЛBAk “)ç¼± ;qÅcryptmount-5.2/testing/keys/3.0.2_builtin_sha1_blowfish-cbc_00000644000175000017500000000005411402211766021042 00000000000000cm-blti‘NêçA‰6mŠ\LòfïÁµ7¦Òã0 šÀÖQ ™AMqcryptmount-5.2/testing/keys/1.1.2_openssl_rmd160_aes256_00000644000175000017500000000006011402211766017673 00000000000000Salted__,Ô¿ø|}? æãÖÇÞ „{L0 è3I½bÜ:²|äg¤½xšcryptmount-5.2/testing/keys/3.1.2_raw_none_none_00000644000175000017500000000002011402211766016657 00000000000000cryptmount012345cryptmount-5.2/testing/keys/2.0.1_builtin_sha1_blowfish-cbc_00000644000175000017500000000005411402211766021040 00000000000000cm-bltiæõ8&†2L)F$lrwÿ¯·…÷?+ã³ßÇ‹Ûcryptmount-5.2/testing/keys/1.1.2_openssl_md5_bf-cbc_00000644000175000017500000000005011402211766017455 00000000000000Salted__îE¥0Aå‰Àª †#±Ckê -ªPc °—"c㟔cryptmount-5.2/testing/keys/1.1.2_raw_none_none_00000644000175000017500000000002011402211766016655 00000000000000cryptmount012345cryptmount-5.2/testing/keys/3.1.2_openssl-compat_md5_blowfish_00000644000175000017500000000005011402211766021441 00000000000000Salted__®ï…Þ…ö„fK_濺-A9¶‰þ$VIuõv+qPcryptmount-5.2/testing/keys/4.0_openssl-compat_md4_cast_00000644000175000017500000000005012000461340020403 00000000000000Salted__6rs4©Ào‚•ʰëgÞ¯éèËJwv+-²õÃ[ÍŸâcryptmount-5.2/testing/keys/4.1_luks_ripemd160_twofish_0.hdr0000644000175000017500000041000012400360510020747 00000000000000LUKSº¾twofishcbc-plainripemd160%ëÎ˪)8hhß²Ú¶'„¾ž2R– ¨ ú!&IÃa¨^Þ?›P×5~˜KF[O410278cf-3c15-492b-89ef-7524db7e403e¬qó ¯‡ô¶çì<²ÅÕ]5jtå&z›¢ÙO>³W•³ ¬qó ]bÂVH cÃpÂ)¬· ϶³.é“—¸%#Ј Þ­ Þ­ˆ Þ­ Þ­ˆ Þ­ Þ­ˆ À¹©ˆDÊZyü¸”ÿ*>bÌ­øýeîèÎÀÇüÉp8°ð_ P¢ÅÅáXœ+=cr¯èvMÊ­QdµŒ ½²s,Í .‹h;›™º/®‹š²ÇßÑ»´™]íÊçPtqW†JܶÆÖ m0¼/A’mÚjJ CJÑ›r¾y昨ÅÑñ”‚ëk)Œí4°Ò0öFº6ʧòË­¬ß姸bq…RùܲA¯9`éâ/Ñ´'Îû˜V¸,ä´Þ­ˆ‡á¾æ&Øé˜òEW¥æžÆ1L2ù .‰/!GVÓÉu_;ò±#0¥t®ïû=­õeØÄXqð“tæOw6MÒ}ËwáŠ×"–ùÀ¾’Ø¡[õ~îV$‡³Àë~(X®Þ¥n¿V+#séÅ º{ri‰áÜ;Jõ5ëŸì‡m:ºœ—}û02/ð®\Xjv²‡G¬ã žïÀå%8FÏ‘UÈåï ;Jì9 ’Õ⑱ügÈ!БÿdÄÎIÅèûs•FxUDûö—“…9òÕT” i•4¹2͵&@>£¼’JÜsôŸ’ !P_em»ÌCy7Ê›uî’„ü‘ž3‰”4Æñ’¥‹Ze‰IßHc©cçgâ7´nu­ž6OUºTÎ÷OL‡èGLb‰Ð|2°8´Û`¤R—3Ê¡°A×I”ußÛì UèÍŽýªi‚G¦'1Š–ê§uƒx fôš f,xøæáW†rðbEȵ|–jPºD=£QÝB¾º,²¯â&PlŽ4.ãFËÿO:™I(î7‘;è@âŒ?òöÄy/&ÿ…òTX¶õáYË kÀ¸f\4Ñž&hÒïãØÉ³N—8¦\ØíÐcyŒm²K…ÿQ–ÍarÏGxbõNåÁ¤Ü¢,iZ‰tÄññ-M"yaÎ},°ø™c!Ú^“T³ÄdFHs%G}t *v«ûÁ^j=!Øx‹œ¶Ò0n«©`Ï´®Sn¨˜É%·$'wÃÉE _5F«a’ÆÞBß_øµNyQèÀÙ“ë!íÞÌ·Ücdi³HóiîF* NØ­{OÝa!¯Aþ]ÙŠ ãìGÕéD¡o»KzäÆÔ·PñŸ5«;¬ÉO6‘{åód¤¤«œ‚0HTßZäÛVÁ?m3UÙþ!¶¢§_ˆ­øµ„ö‚˜ªY½]6’}÷ ˜½=ï.ÿ¦"eÓqêÞÒcŽô¹ä‘¨¨P*½Bgˆ8d÷ª‡®ÙéçÅoü´VMG;¢/0øœ~$ýð¹5žS“›G-N{ç»ñNØœÑÀã›Ñ‰$Ï"vu û½³6ÙÝ ­ý$‰ÁÒþµò!xöÉÙºò´Dþòÿ©ËâxšQ=Ì]-Ò™×úrohQóCL[°è†Ëñ.w{AÍÆBÚšž<oö/Zϲ"nÍDó llUZQöT$ ©[¸Cš M‹õ7;M&›e¡€j•àhd^LXWTG&ãœîD_3jЕsÏ?f»ð™ïD@lå^ õ„ùƒœZ4Q¸ÂàARqáÚ™O‹¹@¬Çs,óÃËãÏõ8ˈÑ)J%Äiuв;c¸‚6ÌúÔh¶Ãi7Cª°iìá pn2 l.m6ï‹YÔ‘`X7=>¬b­¼u¥—½ÃÔ“ÒÂ:ƒ™Ûh†á£Î»«Îûs »íÍg˜¡Yg—ã(ÐŽÊEü–J Ï^çæý`Û󮑸UŒ^EªYewÑBÕ`öB— ó[ƒ΢b¢Yl!13W=~mT;.O<æ Ö¨kwM]šD 2Ñ—~ç K€¬ÌT†&ü”=€~wÓëU?È_*Ízc™LržåSE¤j@43û¡v”Zff]8èá.%*×ð‡6»¤ß ~à/“pÔÿÞøx‘Zªƒápž 1f~Ì<¢+¹c!EætÙüH$ˆîB{õŸ õ*ëÕã÷T2ƒ#!pˆŽõ§¶ò•1s6hC0q þ„+L6)a[C\Ýø-‚—“D³iú>Œ‡9dRÍÅ&Ð@\ä©hš@ÿûÇŽ¼ŸõWÀí8ɰ͋è9õ=“·¾¿h^êaÍLsØž:$=…*•Ö×·~€£™´Dò•]Ó,vÈ¢iv¥²×àHøy·í`”ôgÍŸ?(rÊX!€Ô;Š÷0ò ¹Á”ü`ý4V©mž9‘¾(ô!1&"¿1*Ð,挷~†˜ž¾]Rýër[UÆQ¾ß]„ñÌëwSãR+^›æû›³j–€–_ƒ«„½°Šå‚ùW-Ó\; n´ ß7sÞ»÷›œÙ÷bÞ­ÖÃ" Å0ƒÑË%º2™ÜbŸ ß±ñBi¤én9xmåÜÀò1'í<›¤Õ ø³’®#Cxßþ–BˆlÏüôI·o¥0*˜‹¼·ÅÛÇNÎsjÓyo•|NK›[¬]|áƒÂÝóñú:fü#@êóÕ2à#¤_V 5ŠkSL\\IéØ*•AÊÇPö~Ôd»Æv|ÝvDË1¡ÚçI½úîeæähÀíìðêV\]¾Dø<9Aõ$ã]F”Eü~•õëÉM–Ò'0Ì›²2ž3.6¬ÁVÀµ"ï(<“ìVº+ÿêmIJÏçeP2ù©VÉQ ½Åüæœ,™Lq˜rdx[š(1 Èã Fùa“õV®PëqÓeðJÆå[¾²s†6Ù²!ðĘ$7įÙ+—ë Ï@À %"þõ ÝpžFO+ÄhT†©[Äq57Èל4õ´õ®A«êÚÈugÍö£tª»Ãÿðó¹Ê ãY‚Å9)£¸|;·ÆE0Æzí̺@ŠÁ~Vv¸±î€èÜÏüvA_Ç»—»!!`»¸µ&+h˜0ž2j䜳…‡É¥dË]¦XDZCòŽqôàHÂu½´–à tyúΰb; jyiG…òJMŒ`ì™WEÊþÈ)d[,²àí|ìC £ ãã:˜O»Guvä}èïÿ¹åãköQ&ˆÖú;ö–ŒFH¼¤¾&º˜€¢gõØÄWìês—‰ÃŽDƒFï7PLÏÁÿÀ“$7k eŽÎˆ¯gò]D ñž‹¯–ˆ¤Á#·‹#œ Kç0üEi‚W±§LñÂÍE‰ÊÐtÖ|œH÷;“?ZæJ9é0—çÎÛv£4Yߘs\Î!âÒ¢Ô|F8L+¶6°r÷yÍ»i.¿àÞ%eìa‰äþÏ4X/~Ríf,uø€¢kñ‹´-uûh®ú~^ œ=|z UqåíWþQ¼Ö9‡­E_ù“þÑS¨h¼>5`FÂJ1¬ž©F?Ò À;b]ŽKÈÿöÿ©yaH.và?…=üš®BóQ¨¥¨O‘ZŸþEòd²1¹¨Êý±Þ$ðµ37 ~‘Pâám@àHP†Äkz2ëQÂS4 µ£fx©¡ª1#Œ·¹žÈ9Ž˜WŘ€¿"Þ"†OgIl}ðÞc Qäð Â,iÁÿò¢kŒmÊP4~ø×¬1¼\Ÿ“élõ”Szq%ºžßüŒˆ£Ž0ñªÄ&øßÑܾuª±<°³³Ã e÷w³3ayuDPùÕdqr›8@ýý™Æü¸ÊWäa¥{E>þ[öæ|cä×Û.÷–Çu4& AÕ[4tµEÿʾÞÄÈj/ ÙO&¿Øô§Ê¦µ¥ÖþG´u‰å9<Ï’ÃY±žãÒ¥ÎT`é÷8g)NüSÀWÊÉgŠÄÎóÎD¡@ÀM#Zf VeÌbwúxd¡zŸ¹2§À}¦!–¯¡¯ž&ŽyÕf?Ê­{dsLàÈR. ´®ø… a¢ì™#èþDô=G²% $h¼˜Ÿ?ÉäD }3®-^ŸEOF?a‡ÿÊfSåÑÇ´6Ä+ùêâ[ªÊæBïHÙœtrJpê·‡ç^f;ᅫ٬v#¶ðМ2\±ã×5–TÔŽ#j{OÎÊäùóX5ª­†úsùKàb0—ÎÒòrµª^HG¼a ªòyJA,»-ñOmd‚,…?ûD¨R2Šnv…š@”„,¢‘ø^s& VÊ¢wy²s£À»“üûH•SÇ.:É¿7Þ ±3xÈͪPÈ/!á(çZµ=­Á­Ë 22ÛÎÉww“UAèéZZlŠy;¬w-kº> (ÕP_+ÇÄíÇ:(DÎn$:,èVG0rL'Jœkı¯è2¬ˆ¹GMÇ…°F™.r¤à÷ð$LágħK¹ç-“£Š"@™;•fÅnB€î˜bÔ¹®¨íÑN^ A˜£¨¤à8uZvÛ!¾5Õ0×®€£wúËÀº®Ó˜G <» cõ3^õ®†­`S´ÁgÁ¤:Ö¾Ò¢âðô2žVàJ)Ù¿ÃDqñ̦)Âí<#kñŠ|Še¿¿“쮩™ýÚv(ÞmÝ{äIc¢z8TŒkZø")âƒŠëÆ’ö¶©éLè¥ÁÅhÔtñü¥¨<ùúÑ¡ßÓ[‡6:º¿æ"µ{‡Ùðf±6ÑÕ±ó%ÄÕËiu…<Öû ŠÅ+žîªƒš À°Ÿ8@;æ$1&>œßjžq•I$ídJÞE¹¯q@l±ÉâÇ¥{¦Gfã¬ûjÙÒýVø„àʼjð…cÆ«$0ÃpúæàjQÉØ0Fƒ¸¸ ütšZ|»`‰á å k.¼vT;tô,¾Ã¬ßËùFXÚè_¡‡^iãsg“¸Cã:å¯uµÉªŽ¨}ö¬˜qb3d”‹Äóg¸-pWêp'pÄú$Ýw¥±ÆK?=­›n‰ù¼Ž·?_Uë3Á9ú´€Œ¨VÜV>v±7™Q„P`áFVBR`™w÷1V¹Öz€ý`ñÅЯ³äš"Ú;(˜aVºœûÔà(¯ŒZ[†`!¢³ˆx¿ªÚºßÜÊÂlÑ#³ %MîëR)¤¡Dc%,¾Ðã·"ðÑÉÿ<—3Kb»²}óÆN·O0K‡æ€‰1´ï`ƧÐÝÁN¸97»®e03¨CL• ½ŽèÀœÑ"µ»ÄÌ/Ë–¿©Ê¬”¬š[ÕOF5ÞS .†dÑ·ÅÝ@n‡¥Àž/Iî9üãñ4—׿âÔ'u/ˆèúWuÃ%»âx½/ÖY›†s›,Ibω—:5ANw\¶«/âjYŠOÉÌ[ñ8©±%%«¥nÖD„qŒÙÚš¸+ؾ{qþªg™q†#õ@™ÌjIrÇ‹ ©õt"[§¥/C†Rš‘kq²j‹1Jч§Ò&§e£ßÇ~ðv`Nj-/€Z’Æ-.àkÒÜÚòèí”TÁƒŠÝQs}-.¹±VrsúŒ}5Šƒ‘¶¬xN_z†ppýáÔüL´ÓåRTã“…Š!s8;ŠL ÕÿMÍé¬%Ç;a-ú¿ÐN³½d‚O3KRþ*uÕAÝЙƒ«àRTD¨y/§(ÅÊ ö̈Ü÷Ì}z¶Zcï‘>âQ,{W•좨-!uKã@n±Ë4i–\1˜Î#Ð}¦T'ÞÁ@øôZqˆ8îTÐtÃ…#1ý àíîAêâ‰3°À³j…ÈE·Õ½&cÍTçm7šÙÈs³ý%O+sÍýÒ2¼ âñBòÛ4H°ÚÃb/ç5†è—6á®—_£–„R:–²a0gp‰öl1ãË¼ÏøØF,I{{-B±¥ë+`*cšðË(õ òfˆrU<ûÍßðßD<ä4“»¸éö,°Ôã¢3žQÈò›e4Æ!Ò¥Ô·Š@FFöéHþùŠöØišÁµÜ"{xW¢Ah]¹õ‡?JŠ‘ ê&nM@,y£…ãQðMᇩ§€¯_9ÝœÙ!Pd¼t_n„ËâïÜOñû‰q;Íã°w$k#ø|pÎn_±Zñì¡QÙI­ÆàG½Û,G‰xîåA:q`ìu û>‹ ˜Àúr¡¶Ž †wȳ¨¾C/ä…g×ä¢NÏ sTWê%z/s4éè™Q¹ðÓ¥¯§«ª1Qgϳ.ÓµEœ_Γ0OÂå1ï?ú“’ü·âAIо³coW@Kîh£9:°yò}Œ:©ZùØþH_»R¼°¨ÙnÏ›ÕU@5¯ërÊÀpŽ¢¾zú•m‡q¦ÆO¦Ç  ¥Ê#âŒÑog<|9…DÍ2Þ(C À¯ÙäI{ƒ;ËõEH5/¼Ø%Iu›#°RÞ…®%ÿN¦¡[òèŒ"ßÛY•Ь‹X«`“¬ª¨õÓ—ïÆSFs¹~9@ÔÅN–|pu&gã&Ø—Ï‚ ßî+|,ä˜RG6DÐs9x›ø\z8þ[Œìã& ‹·èþU4‚_Liúá.0æ¨_uµ™TRFÉû(îüuØA»D¨‚7Ø}ˆ¡@ WBG’a¶î0O·žíhÝ¥OðÃxv% ªn3Ä]ZÃ9ˆ—Cü5O<ô^Oÿ >%F×ñŒù­1Aˆ>C`ýŽxЋSyV8j¯RxD’ÔZk‰»?•€NeZ)GHImÃö˜þŽ¢ êk«ÖJ6ÛÂâåxr‰‡Ý*Jà—ñ(]Ëv#uF‰Âw”«ÿ’Š·`á0W.3øÊ|P[O}Ðl¤7ý%_"9gÝð§r ÎéŸþZÄ­¿ÆÈ‰*ÑÌU âÅðº !À&uª!ƒ9 ¸,E‹™SKÛìŒd°¬˜Bbv5ÿ3`i`LXª{!@ÙP‹¹ÞÏ_Ä· €…3]à†¡‚¡oëÀ£•‚å‚6ý–ý[ŒO’bQZX9[µs¦Î°aéUغHÖó­Q@Ü‚ÜXÅÖ“4_Úõ]؆ձË]ãŒE¥ÃŸûÀÁÁø ›†û²=T~ñeS[B×*ë1FU¬‘ìi8x8…ú8žgc×{k­œuÎWÿ%d¥“”0#q²ãòïŒÆwK1J2‡Æß¨°bhGùx ú5<X¼ÛÇ­1| ?Ø!çmȵ-·û‡ô—X\Ôgåk'ÈåQ†y¡«fÑp$¯"6`‰0YË2–Tôü¸)?αòš§RÓWd‹×{÷B¬¾ÚòáÖ”Ñsh%©—XÏK'7èK°ëáĉl)0Ì!zl3zÉJC¯ÝqÉRAéÉ™·¤¼Ò¹¢Ñm€ž$9‰7ãÒܶÔK¥¾K&I5`Xí;™{3e=JÇ—#J¼ŸD²;²Tì¹Y~G¿P‘è­n6ŒA÷‚¢zµž$LÙŸ © 1L$2R¬“'%o©Zo|p0\®ÍÉpY<ý“¿®²XÈÍ™ªF'òmú˜Ýž»s—Òc‚ý¦sð„‘+,4qÖÞ=Ïv^< îo*ä'1 Q †sA­†.¥·ã°ª"GF¶˜¯½?šß±ö¼ãÉ„Þ{ðk{Œp‡AåæsÁõ¤KrÀŽGáD[ÁÚ˜Ó½IˆÔÅQà]§ˆ‘Âö.ÚÃ÷xþm«¸yž~¸]âÑG䛨KæjçBø’¶+; =lnxç S1½.hÐ䘊è¼+ôà ?ŒÂÜÔ[é \•¤Åì»e’ŸÈÑ—Jðþ¤ž)!<“:|@Ã[ü>˜«œì{©ñÕ$'å@ÛLƒ†M\~oààÊŽAÚ>ú@¸&ê=†"Í–ò`¨ªMšqNR³ÅØÄܧ½løvÊ;…(³Ú)×䆹lËÉ =êTÌîÉÑ<–¡7ÝÞs£<«yge<‘µÉ7U¡ËnÊ¥¦Ì–ÈI°| l›•´Ð¶Åѧµc€IÎ\§ŸÅXäJe­9¼:ùÇ‚dè@qâ¯"?jô˜…0S!îÄ­é4í»9­ÛN1Í·ú2œ¸ë$çO†ïYÉUö¥Ép8ê§…8"Œ§Zf5kŸ¹Í,õoåµniû@à﬛ÙÍ›¢®Ô•æŒîD²É8 ä_Ü€Å\¼<‚ö¯ŒùA/iƒ• I¨ãr¦ël< f6¾¦žüK“ÒñáÏc•ô¶ß‚k~xùÏÆ_Gfa¯o]¢Þçšq r|&äù¢ÓS;gÁ¶™üƒã¢¦€á)é(Ü®5¬+ÇÝ÷µF,¨®|õÊ Tî§Ž^&Rß§ü_ãB Ö…ªæ›û]âYµp¦¼\é–;tLÏÉ1±qͺ„¼LõæÀAººnŒ®Ý¦‰ñe€Ö+UÛF˜•#«ÏÅW=öÇžÒ‰YšØ&$%IÁ¾g=3«LI©Sw—дö—?ú„Gø¥•$”|EP»³¤Ÿ§w‹ÿ®BÞž©ö„8„BËY‡ b8V”³ RiL×ñ›¦Tï0MÉwvþ"íó_mÌ ì¶:·î¡rÄ+´ð¡X¥BÇÏÆ%e7ª×ã#‚}…Q³R?.EFζÜY~2vƒ|Y‚ ÖaB¿ÅŠT „öóiÌvÌ+y—'q¤fq‰ïÇ—Áñn_âÉÙyZ4rádÙÒ=´½Ý^¼ëxZ®hÊÌp&D3“ଫûÅï—]dÈLS¬?•ÄQzsK°óùÏæ˜ò;?a_ø2¾PýK'à&«–¥f ¶õ}ƒCð€ SúÍ@ËÝpÉ*£“5*:×ÅØ*fåá7åKÛ^§4Ë}ÉJnŽm×8øõ·Gˆªl“M—2V€åë¼âû‹„æ¿Óv© ü­½lM4™…æø6Z:EOÃ&¦ÌIIPÎæck&$3½!‹•+‰Ïº>v;ÿ•ÎëÛàDž¢ò?°ëE«qTƒÎHc§Æ™G÷§-¡c ƒÌ,~¨µÇ˜Ù h,¡:¦e0æz-’;ç$£vטèqýRàhƒÜƒ‘G ?bºâ(s‡°DœkÓZ 7EŦ,Ful͉peÕ*›( dèϲäÈÈyÃ¥%wˆÄ®c}ù.LB( íCåQ^˜'ÛʰæõàdAL?‘}¬Q¿’6 £´Š'@ÿ'ÆS6S&³Ñì4ùÚWú)á°cN’“Šyp4˜ú°ðGÈfkæ „#¶Ü ¸À-±g1-ÃÉÁˆ?j £°½‚óËK¡õ[}ÆÞ†Rqè¿Myœû{^Ié#æ6ÑŒ;‘,?£Ù®O­å? î<5'k·^‡ÁŠÔ<>ñíû¥L¾w¨yÅoT8Wt‡$ ªÛ“ÿHqà}´°aœ@]†øº@†¹Ê°\×ÕÇý÷FÙàL^òº È\âRÕYЙ‰’]u BS x0ÕHoéÑ5Bå.U톳‚Ù!ðo9§8J©umÓ€«êÆœaÚ°mònËŠsµ+¯Ý8fd0 :§CTüÎ*¸5†Ôš­i’X¤šê .ƒR@äþ|§ÿ+*ÅLk~ÿ)òåòøª¯,Üëk=»(?ÆþÇþÖÊ»†-XÎ2¬ÇÁl¸]™0\côF„<ð»ú¹d÷‰Ô‹—Ã¥þq”oÒÀ:+ëîôþpäΧ…Vcê³¶¸iat•‘•àc]žL •ÝÐâ{rLK>\ú‚Òœ·Ú?¯‚–4m\"Á>8AfiÞW˜‰È–Ú¸ÍE¿wéq£mq]Óp­¼ë!DV¡tFWòh5± ïÑ­blô­Á ÎæÊ?¡#æ¢sû©c²™mŽ·œ¢aÒu2ޱAì–štG”yv‡éÛêNo?åç$ ¥(±~Ï@oø¢³^é\==:kÇrH[Ý^aÕ§¶ã|cÏñqŽoªŽ¥só¾E‹…Z¨ù%ÙÙšo’;Bû«„šñ=µ7i|©³’ ªÿfü{pÃüZìXâÆ3Ýk_§àߤ!R"…l `Ö’>³º?¡L\›fèÈ)¿î†¾ýIdœ~@m«‚=¡ˆ€ØÞÜxìò…Ú¥Óö—n¾“òo1÷Œ‚ÃWúN¾ÑΤùÍ|ö>>Mšd ÿ„?eÑÏå7ö>J=É´´ ƒŒå·©R;:÷.1ø$Ç’üùV_‹×p[\ìZ±á²‚¼E‘—ˆZàŒ#Xöb’Yߨ ³ôæA ›‚ò) HXzÄû¦8ƒ„ƒiS鉕nnD"+xCÔRÎ\\Y˜ÂÍâO¸^™”~Jí±ØE¯åóè_¾˜%²¨þ¤ ÊÿLæ®|¶Ë§{QCÜÔ¥E•”wûU©r¹ÛujþÏ«­LÆú6™aø€ý7Øð6Áfa?õÅ= búü²O·9kR#‡5{v2t`ÎfL#Z  ‘^*1ÚAädph¹¢¨©I°–LÅ ôþ ¶™`çW!œ.´ ‚Ä·„ÙËô3åÛñÛ,waj£NXm)¹~žÉµiŸ¡òç5kYî0ë¼v 'Éô¸õ}~õr¸¢rKsª5gÍ3.Ü-tÂÁLɃH]3éh'.Ð@dp%´u:ApË"k¹àá±-ÃFCÇDtže’þÌW"=Ef#iáÕ.%®ÝƒÓΘ$„+´tï.ÌИD".@€*ýw§¨8Æž8§ª((cŽøÀ\ îSÕ)3@-BÇŒ‰TÉÈ¿ó‡EÈÔ ÿÒ~ÍÂÏÊË{õ³ÀH>“Å)6§ª»K7•°ϯ,'É$«Hÿ¼õ¨nÝHsÀ”Em3–k2«´b €‡>LJúmÂ@>[rjŸ"jÚ‘ Hs“~JyzÈðwÛ®; ó&²ô•Ë{d/ã–äA¡•â…ú4%HEµ^’Ê;4út#Í6–AY¸a§zez²Àw@ûM?qÌ2›‡sàÄá܆®¡©I`šÂ$ií¹›¨c ¸×"5ƒBLJåïÐg7lÁ-"€Ô‡ñ“ V‚ãhÄ^!RÚúYÙ ìîí·0œv ·J«Ä2â°¨BÓã§¡2°õiX¹ Òç<ìv‹<.õË«Qê› °”ƒÒ·Bs¨-ä…(¹Œ© MR$MÁ?¨Cèz¼PºúÔÞ”al?›oñÇýõ‘Ñ(y/ØÏTÙ°o¶Ño÷uØ*¹OÈ™å ¤¯FH&NÊQƒÈéòF4âÀKHNÿ„í:çë@sžÁþØã»AY!`þt»É֥ɷBÿ3ãÚ½4¶üags¯¬tndz¬kCoh±Kö¥T9‰ßóX:V´5Õ~ðpµX’¶å¨‹i³‡pm{‘8ñˆÚ `%#êQÂûgî\[éÞ‘~ßë&w"/-m% Ä¢^H•›†Çly_~‰<û³ÚÖj nä°kŸ_EØu#1}—Rs0AÑ)…óã,º)ÊÂÎc´lD‘g¨Ö ]¯`C è§'€Çrˆ}( 5q[¢ãþ4§ºÉTïWw†ØÊƒ<Äí®îP/ °wDùíÇÆvz{!góæ‹ùHy›¤÷ì¼…DJódepܳ†Òû dʱ–oÖ‚¸ÑÞó:»„)=ùžR¤d‹¦Ì€ ÓS…P¿úß¶1¨1Ó äç¯E¡0Êö*3·€|Áé ιû 7T°Âêê[Þ!% ÉŸ©‹kûQÀÔ*J í¸â©ÅÄòÓ[½À88½¨xõ@Yä¿m½ÛK®£wkãçAg'ûjˆ¨}FâŸ#ËÒVçs­y桟Ùý:rÇ}\5jÊ Ä\9GíÂQˆb×|?Ì΢çZwJ£nÆÎÆh=ú#߀Pƒio™8þåÎh¢P×=⥠ä€P]8%™Ê ¬sN}´“¦¡59Ãs­ùR`Ùîå)Õr`Z°xdñ=î‘’r6B6ßhZz³'Ú¤/Œ¨êmåŠÎ³þ#±z~žÙÚi„EÑ"Ÿ¬ƒYƒzºiÁ©«;Îq‡>½uóø›cpçs"ãútÓDž3(“o=-r‹èyy¿È‹ñ›‹‘‹øÌ}T.¼†ñÉ‘w‡𠉌•ùgT¸Ù«¬Ï‡¼•Ñ<Ü`aÀÖ‘.f…×»pÒtãVov–ôH¹Ôó¼=¥VæzWæÞÉæâˆ·?ùy¼ý«¾á?@*Б6ií/AFje¿«Âc5y oÄ|±…xúíýÉz$~=)„ë掲ú¹|ºÄý¾ú4žY,©Ýõ®ÿ2[Ôè®ö"1g ~Þ$­¥ŠP†¸ná6Lº[*ó°K“¥T` »,ÕV—ºôî"TÑf±þq|,ÀR]eœ¹N+ðs=_²»`šò™." ¯‹Ä½À×ÁºžgÄÜ(›‡ÄW±ZƒsŒ·]“Ð16î£é ËH…·¡³æËÈæu¶êðl΃CŠmïbó!Ã!–T©{Ê }‰¬Œkhxñf÷,.6ãv)Š–U89´ü_Æöì0j}þó‡úx"q9[ég÷/©›°bfƒ¡]¶¦‡]ˆ[óc ?Jæ@Æ&­¨s›¦nìMèaÁå´ýfÚ…k³=©<ÅnȪ ¬\¹Âƒm_#zë«óðâ¾pkœB£±rqÞ5µs÷FfÖÉPEØþÉ ØQ»ÉmtkÓfý± l-¨çy(*6}«á§Œh—ÔàÓÌt¢¾vó(ÿgßxÍÄž.t¦hdøY¼ŒLô %ˆêb"EH’½ZÙaôq·Ö4F7ѾtÛ »Îž§ªÌ{Å‹9¹Üsƒ5§©]£tËá4Ì>Ê9p#ÞamÚTZ™ê£{{–^öIŸ„BÆÕЩ4ùÓ>!Ÿ‹ †íó9&);{¿£]ËÒÛÎÏ:î3Ú.†6®äŽ¿|ºcæøµÇ£Ôê_vD 1ÕiD­øÛ<$è€ÓA"_ïý¹õo dzRÞµ“|ùìuŒ¬eãåä£OÛNâÏ””´Ó èðVöœ=.fIžµÞuÁÜÒ€ØJ;Xpn',#móÿÔš”!èngáãFxÛë¤e9ÊЫyþQYa îÍ¤é» Î+ Ò<¥èÏËCEÙ…(ò¸R}Eó±÷çwù+Ýjpô¦=‰Š_]D£\WòEæˆêŒh”îéãMîÃÇÿpô‹ñ‹Žuu°É×°ÚVÂÒU·•÷u_'£ sgáAš¥ÈwLô`4k&Ó´CÈ2©{ j çÒIñhñó©¯å/Ùñà  ñÇôùðO!ÒKš–NŠH™\-Ì?Ê ë¢p«é)ã’—° ÊÛ±ÎAñª{pþƆFŒþp”/ˆÑ€ËÊÚ åg»*ò§ƒ«lؾ€%öHŽ6†ÿø‰³­Ð«žÿ äIB(ÌîSfÞmb"+ƒ$óI*^ ¹ÌMÏoñ½Ö",®¾E£A¡pï‡Ä±‡nþiHÖjÂÅW'«'iꎨeÓ+<+ï&oÜq?Ú¢S…Aµü:'gHO,¢ Ð4E‰tL ×már³»ùIÀªr’}‰5½Z*nbåß™€5m„_´Ö4.AZ'~j"xÃgM:ºâGôý`DvùöÍ9 ÕŸÔ]äæk¼ef"r(¿NTÐyÌ:uÁŸ NLòÙ³;x³N†AO–ïï<дÉnÕ«dÇŠé]v %nÇ“õEzGT‚E½¯ŠJx`Q‘<7Fyÿ Êðȸ MÞéåǯ¼ù6Ž¡'šÌŠQ$×£0äÌû_ÁIrá{åƒ:¤26ûMÁØýð à•ãs~6²›#}¾È¥ëšïœëkt{s¯Ä¨A+ü/]Ѓ÷Åœy¿eØòÎR¹ÕƒŽ í«!ã’füçúš˜¡µ>ÜfwôÓ l½>%›µ›V­’¯}^ôÕÕŒJîv˜ôv×%Nt×°µÇOÉhŽ5yïcm̳ ŒîQ*{ÃUé:òÁ¨‹a¸gãzRx\ض$»¼ÓZþ_ñ¸&)[EA€Šü„Y&=%èQ:JÇjÂç÷ë|>=0Õ±ÁsÐïŠYÓK†Ò+žè}®¢Wi€O$«z×¹SºÒz‘1ð- i쨒cåßÊZX¥áf ÔE³ßê·;ŸwdUÞ÷#´—£½üVô3™™xœuÛ%= Sþ}ûMŽé·L8èd?Œ‹5¶ep¤(8ò,~Ñ2ëÓþ.¼™9xc}4aAçJñXà7¹+Ï͈ÎÏ)7 l;³á8;÷ )WÒMÙ!úã$ø²¤ŠšÌrò²¹øé)”®9kîo5¤OœÃ|¬Å†Zë¹ÂŒ·8Øá¿$¡ƒ,JrŸ’l“‹Yç_šCi´nº²HtÙð³‡0è@nnûL‘Ëìóe]*Ò›–n³oŸFƒAp„ø†ìˆ« Šh†²Œ ’ÈB-Âèì·ç1¬¹äó›€7ø7õÝ0^(ƒ‰Ü€®ýÕ(õ¯¸ø‰Éb× i¥ï|FÂÙ¦Íoî' B¡^èŠ%œ»š1MJªŽ¡<ðýÈ\D2„“V󤾫È_ÑÝ1'/[ûOºÕÁÿ¶ƒ¿q‘9®ëÕ»møÏ€‰W;µH)­¼L·GûØà¢¤0\¸»…¸Yy“u¬UxýEÇ¡NîËkÐ52t#V±Ã/8³t±FG#ƒøÈðFná©B©w~„„ïü¥"•ÿ£6ÅØ‡,ãB_äuñÖø#*.MPöÅCÄÖÎC]7*eß\jÍ«£–xÃ[ÓͲŒ¨5ypNTµU.eí0q¿¥×˜Zú¡u•F?ŸÊ‘]û#nÛz‚prÁxPpïÚN¨< üL7}¬·;3Ö; ñD—Ƥâ7¯WRãÀ¥öÖHŠŽÄÏWM‚Öu|¿¹Í„­­ גиþvIÕ+¿ð89 Á¨[3NN¼o„¬/uFüÌ aä¯A&›©x&çô»Š€ôæbv•zS„Yl޵† x¯´¹!'óCQR[5!tò×"P/A8ª¿®·.\=Έz~÷ yõÜ\ƒ¿‚ü‘×àè}~KXæ$,“mê,R0ÆÁÅuáœ_³ná=3ì#B½Ä:ŽPųçÞ¼Af»¸šžo+÷[%†«XIŠf;”q®/9×™@`'œÿû½*uæ½Á+Ôñ—¬›ŠþÛµ[!HZ4çKvaf§œéÊÄ =|gâǘÓu¸XÖy°Ú¦Ý¯]™|t —À‘© «ãâWжY¡×Pp¹ç« FÙ¶þ-úàt­Úæ®8u”ÁÏ,ì×Ń¡gä#»ö{³±µùÝ,gMlZ›· òË{kv±/äë£ ¶¡ûÆ3ùª@A+ÚÐÛq gÙ¦ý«ÑÀ¦Rw0]GlæÕ’Ó+;ÿ’´ä"¸Œ'Àð¶o‹\è-üD¥ÓIoJϹÒkXÈ"í3qêž\Ö˜‹•s8g†V|¡ÁQ.vD!‚†”?Æï•WÙˆ»Åɞ㩬‹K»¾B2o~´Äœ±m•1Õ±‡ü¹Ã§F×G Ízáu‹+ èûØ MÆYâïáÌ5g¸âð=°Ý#™RÞãÚŒßKêä ^™‡B’㯮ҿ¶1àë%ÕV†Æî €Ph3uÑ2w:Üî\8së»7“±&j¹âýÍûÚ*Üò‰?lÁ$d}Nº>qËxØõ´j:–øIŽçÜoy$j…Ú&¶.#ÊQ  toòŒa9LÖ¸dH· lÞ¾ …ÌŠäkþ‘г9溳þ¬éÆàÇŒ‹µt›C™ ¾Çðó"Á‡éWfÙ*€ ¶=>ÚšÀRï¢g¶¡!ˆ½¯³Þ% WAµù@ ª}µr²-RGç€øÙ`fá3Ñâ(C$ «r(Çä„ëæ îÈõJå3x¡U™”²:¦=)F ‰±P¹ 86B£YÆOÝ ènêùšÜ”`²âN÷S4p[{Ó Š0ÖWà“g‡ Žž upƒˆœs‰\¡lÁ³S¢ñ&ÐܱÇŠÄj…ƒÆÒalÑ)št›(ÒÅ×¢ Ñ]½­+:û§ýÖz××þË05ªõÙǪ."£¡ø@4ZÃhË{êÖ„äפ 'ô¥Y ×.÷÷ÅÚªÔ&ÖòÅ5[¹öáY7Z†h´Ý bOþéÖ ù0C½ $™Wy×Û›& B"º"»í*ú1îe:ƒbDøeÿTéEu\¥â ˆGz⛡îÉŽRֱϬ熳kQ÷ÅŒkksÙC¡Xê(ðxàŒL7YÍˬ£Ÿæ ‹¥”Їiƒù»ÖŠë–/û– È^š°J“Mtê¸K(ŠpMÝF­,ÛÍ—`{½¥ñÇ> .í…¹èX䥋<ívâý¾‰ ËÎ8ìPÈÚ¹Ø^+úŒ…–‘º£äHÐXÊ ¦… Ü(æx hˆ½”±J×8 ™²Å5ŒÇ˜uí¼{ÀŠ ÔiÍHÖÓoÅôY©:ãØ´É?=[Í»>ù±WØzÈækÝ—"óœã/¤Fü¶N¡ñÒ{—„˜cÂ!ÂZ¦ÇþTVì‹E4ËóÍ›‰ã6'ˆ¯¿B‘²ö#IWê&l”©÷°¿ô&º6W³œ Š ’!ÌIDH¸ÛÓ€¸I¢¸ó€Çƒ"nÝø§ŒãuÑëáÚÜÍ.‹{гü½!ÐñæMœ4;ä«›ËúáZ}>Q[º¡~ë5œm kYR÷”ÙÓ${¡«Y$n\ûͦHž}6»Ä?ãØíˆ *¯êb-¾øìD†‹•ÛC±ŒïD#gCßïŽ:˜ Þ*dÊsÂÖ‰™¢cÄc.Q(^\Ö¶TËÞ‡¹àݬ’½+¢”Íy±'М¹:žç¨nËöXbjdk ÍÚ` ì7l12òŽÐk@ôþ÷mê·Ô†|z¾W¥ô˜²À€JºWƒÎ(¤—ÿñúI¬Ìlª¶ .ŠÆt]Ùr‰VÃ>£Äõ¾ôÁÚŸøÊù\åÀ6,Ù£í }r7Ý÷·ifæ ‡ùâ.=ËÊößœ¥ë˜ÏÉÑnˆì2Bî ÅGAfÒ”üiõî²M\¥î:;ω7ñD¢s°^“ –ytAOµŠÐ_ü@ÛïÇ*¹ÑÀ$o0å¨Wq [ƒoÐËáqÚäS#{^P$ânôc)ñp-ãÙ®’^H•´Õèñ(ÉñÜVڂŹ™´²lŒIõ8sÕçñi ÝBc ϲ þÕ™bI-C1Wâ¡ç¿bUoÆgåÕ¢+ëB–§Ijb Ê1mg̶×ùn˜®ü’І´{#”‹rÍy8SÌjGEÚmÕºwCŠd›Û[IˆêÙgÿ>£µFŸÛ×zÆâìüžìpv'À*fø(UP½ö²K–?Ü^ŽŸÆ®":ü¤RÉëF¬—M)Bd÷ÒÞíù;FO9{ü —ë œ¨¨oP5zQþHíòÊ–±j=YÜ>“•R’#rÆ>Æ÷»,-Ķ&À‚K·ñ(¦šªç¦\vG»¸ÿžÙP«<3œîþ¾jÊä6f‚™u$ñf m{ŒòC¬f(¢•Ò@ú4°`ˆ°’o2(ûˆe6)êû‚b>É ·³%òbÙåÓÁ("\12 HlP$”ZDèvÛY’t»rŠˆú²„`.+]J[ÊÁ!wW¥H:¤ã…–¼gp23] Ã:õß´ŸóîÔ-Wd´BÞϦ¨eì3Áy³G c]K½¹ 6ûIɘÙv8 ¥•[It\Z†ªê¡5Ôºü3¥m'I†|bg{A]ë0kFæe¤Nô½V³™ƒŽŸªu«Gõ–Ü™±!/e»r;‡€ÏÕ3‡Zt“LV'N ]÷F½[ vyÀÈ[UÅèJñçågÄyÛž’0O?ˆ0Ó8w™ÜÈ]ßü[(ÙäÑá3X#gÃÉéI½u»ó×¢5‰ù# ~-Úù–ÐknN‹^«úÜì7ÍÝì÷ys`õÉÔ3:FÙr:»ø.B5j­ì/?+T`«‘L>S0 ìÆC’"¿õ>³À'Õ[îŠ‘ã¦Æº®„F•ß?'P6ÝæÜ<¦ß,¦‚öàÈ%ÎáÀ†í|Ɇ¹?k8ìˆâ¤B È?ªójS~o1ô„¬D29†íÕA‚âüH°'áD²!£ˆ|‘WdnΦúŽ~ogœÒK`òéF(÷puê\Ç]Ëýòß\ïÛ—yNe8qø°s•ä¹s‰ç; hIHâ›ØT‹@YsØê—Uû‡Ã86û+•äQ–-ÄÄf²‘ÿX ÷Õ§§½ôж&$q3ÛåŒõ~¯{ìûÇ_Js¡ª g‘£5Ÿeeq”Ii)š Õ(#^‰ÓÂs?[—ôW3· êA‚î móño›[v¾»†qûØ5$MºÉø膕è~\žœøQJº8Ò‚w¥WÔXø¾{´œûì;Ë£f}gW¨+ì”/¸5‰¡Ït…3ŽÞǦÛÕr°ë·ëΑmiÄZSÕÎ'±'ë=“Ï(Æv! ßÔc FýVj—ÃÁ¢r.” Š´pÿ:ö†EÕšuÚPWÅ|ð;Æç7Ó+pHfbsLæ;T#Ñ<°õb-sx8KºGŒ4µc> á t8p…4m¿C œöf뉋õ_ÃÑÑ+˜kB¼®q ó/1‰rbc`ÌrÏÙ{¾2U&©.ücèÒ%73òCPäó8øš¨Áé õ£8JPb£W=Ň¾¦e_èx‹ QµÊn •ÞýìV=I±÷?ûºÍØ~î_ 0¥oFC„PfQh ¤Ï%èBf} ª~ÌjÈŽÒô9 ¾ 5‘ýá¬kD]u¸˜‰…lå¹_ƒk|"•A€®/‚Ì4õ½0u>ê}ϸԷ â¸àå6ø˜ÂÆãÄkŸc±òÂyß^ø4ù²îùDªî «kÊW³ŸÐ³îï3¥gfXm1Éô¹}þ»( “è¸c·ë3?oЙ* é=gÑd@Bæ%–zˆÍ÷ ÉXÕŒAÝÁy ÎjT3Õ*Ób ¦RÏgXQ)1ëAÒn.»;äàe­ÎúFŒ:xÑ‹âúªQ>@×Àßè„Æ(fôó‹·®EÈÂ¥J•::É¿0¶øœž'èA¹íµ¿Ø¸+¤ÚN¼0yL¦*D™£M"¤ ËÅùH‹Ÿ*Éö ¡¶ûd8ϬһÄ8`ô{Îs¬î±ñÜ­Ñ¥¡³”²wTÿ÷Z®u* »î¼Áå‹L’÷Řp·»åµÝFðõƒ(¨$±àë…•" x7«]°'Fl¾Èâ{Ûu†—Ÿ вly<ÒÂ4WÖá˜Àž£©Üô„¥)Â4;9kÿ,³ ±B’û ,%ªwÑWE¹þIÈø\KËlI. [8u•ˆaŽ'o;pôwBIk ÈÖþÆ6Ê  ïY€:ɶmø’)» Tl^÷¶ÝEꚸRŸÇP‡•2ÈpÊÖb—w`,;ÔíBŽ´MrÁ‹4©3!ö j³”²áÊnb’‰Ì¡ðd›6—àÏZh‡b™ÌUñ¦…b`Á%˜/Å#¸ Yðµ÷5VD×ûs¯Ê(Ò~I+$Ä –± ø9¼ãiLÊbP‰æƒÑ¾¶Õâø™Ur:ÉΊuŒ{„¸Ûû¶d“ÓLí€*¦mB7±ž ‚x‹Ö¹ö"ˆD‡9kµº¦M—zÜnC°ãú÷’_9©ùiA÷û¡²œ_ñLÞÙõz]kØÓ‚bç4Á¢U¨\-‘ÇÂþÅt?áw^—}Q§àÀsƒ‰·˜ Ó@ÝáPH4 ï&>ëM¨•hMwÀuàþ$ŽÓO'K+Ž­ëË%ãý›ô‰&—gcõåÚ2eí,ù… ×ZÇð\³¾ÅV,Lsv÷à ²¾ÇlEœ],p 7EVî<¸›]0Ù Kωxs‘Ö¼÷Jš%ˆR‘)ó,r—Ù}rXPõw·å>Š"¾)-ØM X¨3Åÿ‰yß›¿UXE£~IºJC(HZÅ*Ÿ­R݉ûý®à–ïxaJ›M•ÑÀ®d…JO;³“J©Úí½ùV yª >Ï#—I´À®Rj.•.‡qp'«ý0-FŸC1ÀÓyì+Ê©ï‚a—¬_ ­K8¼5® (ûù¨u»;à „ƒ„% L×gÅPÇßÚ „¾!¸/-{† ‡ð0¨5EÒ9šõ_"p˜éðÏ>ÚÎÍ¿³‡îÕE˜î”)#Û;J!6l ‰ø¥ÕªPÒ§ïúk™Gí36ºDñ1Pï¯+nÆ;Ô´ï"‘GC„¯ˆ‹¬Ž{)`rÁ Êøª´F <}kÌîO-ÂE#¾³0Lؼ%ÀÍë¾j-Ïüm+åâ‹/à.“#œ©NíÿÐÖÑéá'`Ú ›l’‘û{ŒΊ±%zFÔ©Õž'zQã·öøqìê¬Ýoó°çVÙ´š†]e›jV{ÙlåËMÙ†©5ô70ΡìÒª¥“61-7†XR¿ç:Ÿ§~'“+»Á!(¨_C e¸ݽÝä¾_ÈK+Œ¶lÃݤæCéz`¬d7Ê*ðµ#¯8qßÕQüëx¼•Ü,ôŽw”Ϊ]¨Œ¹µD1Ôø±Dc°àωäRÜœ¦¾Dxnà‰ß%Ê‚‘pÛj6Ñ^gû!TŠx"êe€ê.Þ@“KN:ã ÈûáÛwxÙk˜ÁÀ}$ÕÑ.äÔCR¥ñϼ¥eÄ8³ §òèC2PSK›bò&—zñf3z40ƘQþæ+=lŽãBdç¨iÔN±>tÇg6ÒÎ>”³]1ŸW÷™RüN:®ÊÀrt$jç…\&X¥œõ¬‚ŸT9BÞ”šâ‰ø‚'0Hà˜õþ¼Mnyìà ŠIÜ´f²Þõ_Ó €¥Ï7ÙE³e¤Ž0’2>I§ªPý˜Î ƒ¶š ©ääMA^XÒÇÿ©Œ]˜°jÛ@Ç5ù3áóC¶ÉÐñ‹‰®í/Z…ò¤_ÏDKgSá7ι£R. ÝVýÊTÀ¢^ÞÄ£0Ôýô=°÷¶ ÖâCB7‘ŽVs„½E8>š Sù%ž”;´¶x¤@8ãB¨Ö®0YBtÑ.òßÊÁ‚“ˆ¸"šhËsqšm°o!/ÞÆüR‹:<öŸm’ýÀpÈtߤª?³vÝhŒLƒ´ „–‚Þã˜U˜Jæ~žp^SöM§~¶ïÛv‹†n`XÅöç>yÆXsc¦sï@”ô.K'0èð ÷£BÔJ²òX~@Û$ œ‘eL­l–*=ãퟰ³‚ÃS&êJ!kX]Õ»±|uc°ÿ¾@Ñ®U¾·8\my8‘øO0´¸ì§PkŸ3:™˜Ö/ÿ¥pBy¾6 §šñoá#|ºN ÒW¥V/BÛèõ4êðªWí5"›knå'eùÎýÄ ¨uø'KËrãAI|6fˆ“Lˆ;¥¹6R±LÍ­&; ÚÄp¡“¯IýZÖÓY›-Ä+—‡a¿Pj˜Ç;Ñ;ô+mnòò;'Ÿ3\@×øÉÕ2—ïÚk^´¾©SÌsTàüMXÕ–å(QÒŽ±¼—ƒ?loR?!ÌÔòCöb(3¹•ø¢+ƒYšKãØ‡G|’“Rz,Æy¬/íª…!sýÄ"‰YÅJd3‘mNšº 5O§KÆúÐó´_£ðT`íýìö?èö`‰|QL4äWµÝÍáò ¶iÝssqC«cCÛB³;^~RÍ[>׆ÇÐnŸ6æ=З5ê¹Ù‰9{õ$ÌuU~ªº´¶`+ÙJ+ε6¶Kó(Õ¢²òÈ'_GxÏÏf¼"h˜…¼þMÂEN4²)T+íüÉí¿ÈŠä§·%»ÛàÝ«)àë´„ž˜vÆ|ÄK¼lƒ¤·  Ékõ‹6ÂÐûÁ¬îa»Ü´„Ÿ4aùG zÓ˜@Îe‘¾“gc™qÎëvoýÝÒV4™¸mÛsÚcÈp<×!xÙØ%¶•!5¼^~¨$ç˜o¥éxX/jŠ.UXÛ¬Lbœä'>ÂÖ2…w¸ú!o—‘™zœy1ø*ܾäsXÔrnâÜMú6–cúˆ“íe·½€ö`9È©l: 0kwph‰l6eÙÅûœi.ö ˆ‚¼çzÇ#ÕJTeºïjIï¾”ãÓ?æ0ôM;]`Dƒ3—OjmÀÕïn(¸³BËàÃý †ÝrK‰E8“Zkœè3gð†K~¨7¿ë¤SŸ©V7(dlt¡0`f[JÒßp?л`HpL’¥ˆ#'Z70ꄱï‹§)‹èh!¸,¶PUkeTõ‘½&—Ø•–h*ïÍó«¾|U韩àiÓǼ½‹ ^ˆ«H °¡ÐÍUQ9E¼I·ðÇq€ ýìyÏ¢ÖÅÊ—½p®U!Xk:ßI§ÿøÆ·bqŒ$›Îü'©ê4oÚ"V#çTzfµì™—-\é/”óÔ¦!¹µR ‰ñ2Ø^â)TLÈÄ›vEÅóº>÷ŠY] °fÓ‹Šp3ð€¶ÔOFÒ·úðË|*¬q£OS)Ôíósú|`…ÌwO¥CØeE|ö/˜ªdÅm)Ó8}EiÜf*{Ê:¯¤~®íÞå’óá"~ŽÁ`5L¼æåQžF˜„ °\ïÁ`rø$ºÃ §ÈªÓtôž#6Ö¯e¤Y³lTao>ŽÙ‚[œÄpEnf˜ö ñ²Žàj×x+¢È2p|+IdÐű©: {}õI‡C ¥ŒÕ°Ï÷J4¬= ƒfu€]Èa½x3ĵ~ ýdl*¤oÕý\j]ƒô( Æe5ã÷Òõ µø+€7·’Tœî ð’òÑ 9+p÷EðkO‹ÅCD÷«ðŠ3æºxÇ*Ëá×è³"ÆÔ*ùší+ Ao—D±lÉEÞ÷“sÝÿlç>g`ù,Ó²†¤†!‰/Ìn_œ *?Cïùð¤.l8"R'Їµ#S·¿òÞèŸ9c•Nù™ãLÛ€qaƒ§#¥MK—üi¾UÅÈÁ‹ « §ðšÌµ¢kß ·l-¼Q·«e¢TŸP!€ÚvIŸ®é:n=d´@÷ꈑiž>jŠn‡£ä&òÊt4Ë7b0Ši›FUIˆÁÇÀáUäì*œEº}7,Ø2áXÒô{ýD'_X¨ÂMFþ;3CüůJ–kÍçÏg)ñÖÁÙ·cæ?Ýéù>†yàŒ„¨Õ'Z:tìµ1T» 3b¦†ÏÔ<à×Ê3þR L,rFÒEù‚.£Õ®‰a'c¶½>«OØt·²Óÿo7·ÀÆäÉÛ[€Ä;. ›2Ó`ýéìøšño/dX9€Zð“c“lðŸ2'òóå².ÇI3_¬Çß{yìfi+ÅÏ¿k— ÑGïìØª&aI»9¾ózªý„‚_–Ò²ÎÞùôÍQríƒZøÓh@«¹^þp†âiGÑš<ßXj€Àîñ0¨šâ ë’þ·ÄAÂÌhÕC'òbTìèð覘NE®®½«Ï*¤¨_ljº‡ üöÅ5]cß ÃàÔJßR§ï¥án¥YŠŒP»áFD‹îoLŽ©ÓŸQ‘Ó88!‰Ü'Íbtµ›V«àŒÝr_\“vZ;æ_ѳ¸q°°Ñ”iÑÝl;¾âô}‚q"Mê®éŸPÛª üë`rJt•8äŠÏÝů³CÊÐ+!¹Aü-68ëÝu&šx±eÝ¥[V¥¥Á–¹Á¥‘ónzÜãBA0Íç“f–Õy}¸º~ílwH©Ñ½ÙøÃüWölm»(sHÃ݈·×œk^À^ßž>Ç”Í xÖ/EFáM–HÚÞ'Æë(~Õ78Ï*žæá-2ÓºNÄßÃ#hTÉùX»ÃÂNÙ,;)Ä3lvº E©p0ìÎ6$ùÉÝâð‡11‹ +PÔÔÅÈ3J™YÄŸ 6ÄV '1)—¦™ë©­SJªPª^¸°¶Êñ‰ý¹D ñ±}#âZðAÒšÖüѨÔgå´·ºü˜O@QJiW@²ôÐÅÐpT*d ÅD#qî&ß„E&*ê{nF‚œõDÒ0'²£jn‚x…0‹{ã­VY¾t/·lj¹ø”Õ ù0£ »ÙôÀ«üw5Nì±%[ž¸ò9Dù¢`£VïSæ8I©4Ôÿ1aÛ±4°#  Mu>™T¼í³È«Ù…'„8FŸŒ=J2R8â%ô(éèêõrY¥b‹Í;w‡"ã+Ùʶ²VŒÉÈu‰¸aø<&Tá zSæ g…Óz¢‰†é6Ú&4 ŽB'×ZÌS¥Ù eW<;©ï¢^Imå-øa°á*Iü‘óÙÜçѯGT w´å­ò®ŽÚÅD‚€–}öüœ8Üwî[2ÅIûúb´4q©£™¥mè8øçÊ ¾EÅ»xÙ Úpêw¥X7Kë²ómí ˆU¸Èw½„@¯KöeJû¦ø?Ge[¢S°"-ñej;[X¯×Þ“*×Rï…¾^uÔ+°…ÔǶm ˆ-¡ nÛ›8ØÒ¢KÛ‘Š¾N‡öÁÃã”ì’ÀcÅãÅy±Á„îm¬Çijg"ŒH õh‰;6ë‡D¡çSùÐY¥Ò»§+ò‚ܱ¬pŠšÁa¦¿¨•rº@¥5ŽÜõ§×ÆijÞcÊÅ)LDTÉJlž[¯êë†ÓU®³­•q;ퟬÜÇ3Êø GõYsWa¶nt êQ¿7ÿЀ–‹§ªU&Q~Äv%МÀcK e*¤ØcIJ3žpIK›ð‚â 2šÕ]H§½f"tê›A䊧°e­“,ãJØê&¨›)¨,ÃY{=‰óÈ•p8ã»û±DE¹×¥’y Á”îâé)ÿ¤åG¤~O¹PÔ= Ôñ‘\Œp‹õ×xºŽ‡KxpF;f¢¶°3 á¿[‡'‚âÅýg½+L¹:BØu3~‹bwfâùÍö†“.’Vk'· ·™¿Ø×LûÀ.GÊ¡:ÚBtÅ‘’1rÒ‡{9þ…_¼]‚u¾U¯i÷Î+‘bz¡¼÷æçT¢oœ¸çw?ÉD¯ >dÔ‰K$û€â!¶ÊôX¤ç«{Ò*תó<¦ݪi5XZƒk”‚>K]‡ý„fQ6úÒLùæ·¢#ãðyâ:rB#00nÑ~ÄG=HÃþ¢“¸|Kˆ²œRõ•´,]@F©ä÷™XqjÁ •Œ P-:[Xš?áÏTXÅÎ}ÓÆeÿp“ÇÑâe:W`êéðœz™V^·¦GåÍÆží·ESNw‘ï85­ŽBäçž)EèAÚPÏÛw Õ/¼²µ"šàßVºÏ1ÈG#Vë=£ƒtŸl-D~«æ~®‘uk° E–Yˆ¶…`®` …™+ Ýïì,2¢‚SÉz*MYÐ)o<pë·#×Èð'd¡×=^rŽ=Ïï·ï5 êÂ)˜áH`ÆPÍKâ¾b:y`×®…îP©A°(Hä)ØCcC3m´sË$ RÀI¥ù‘`t‡–ü= =b¡a¬]<àqX¶Jâ8g‡}yVvø#€ØzæÙÀ*ºÐ„%·üѽÖ8ŒgÑÕïƒÏð ÉsD¡&5Ä £Ý»Ò¯E]% ðB¦ÊãÁƒ )„J|‰»é§›hÃ.~'z31Ôtrm`Ùqá„AÎz®÷’ XÎo÷-±s™¬|‹Û†.º— ÍCö]@†d?Oê ;,’ÌhgWBs#¡ô_Â^ šQ¾ ~e}«‰õl&ÆûèyuYÒGQtI„ êää°G^Ï¢0öuQN·µMòf½ÎÉCžš¼¦Ž©ÁÖÂxŸÅ FÒÁ¡mÛh2"Zé™D{ R!¿bvO3)>BŸHÀÓÈ_BÀœèU ÏcÊý“?Mo|sÞè¯Ë,¿ƒhe¡þ'IP2ö¼5zÜ‚…Dè3ÿU¡‘ºÃÊi è§è ¯7–(ÕõJn¹ƒµHnK…qœøœÅ /5Ž–aj/ö‘2‡(j‡…œAÏRü´¢˜ž¢  ¬›éÔ?‘¨&©mQ؉rëôôei>n:¦9úPm9‘»¨Wc>›ìøëØD>êýV·[zïéᎺúšy8Ï ”î¿h\n× ùÚHø³<><+²M=<òr]Âôõ^&˜YaÇv¥¿ñ‰8E 틆E©pº–j/+ ‡kzè@{ç£÷d~ÍÝÿ^ao‘æ.Ów­9\ó/˜õaöøþ/3T)JÜd‰µ b];¸!ßp m°]Ò2ž¦•™9àÖYZÏvtµÎ¬—,CÅ -ØIòc3 úI8[Ò(гÀPÎÎ}ÏY‡fY¯Ã£>+ žUxBÀJ+p·Ô5æU<ýÕœ5•s»¦°¥“ÂeÁ SðÔÉÆ˜½ ç˜6ô¿Ê—mtVÀj2p©™*)nMéõÛÁA«O‚Ê{r‡ù‹îÛ…1ëm†F7Sa]ÃÍx÷ŶÚoMDƒÚjlú¼–õÔý¶ù0ƒÑ'QÛ>PPÒì¸öL}âìN!¡šxšÆçèÁ^ ›MßÊ~g_-/'­yÄ;v8L:æx‚å·xj7ãÿ]F‚Í7¶—FžÓ ÁÍRµWoг^¢s§Ç=5úö:j¹t¯¿;üEïÊ’†1 ÛE ÚÉÕ‹L¬m-ßfjf–ÕmqR/pÛN¥.øKç,ÛH P ÕÑá™%Ó‡šDyiÍ™~ý/³UB1i¾ú0„µ“-"c±ÁŒ œÆ vЙTŽ?ñØú\“óu€Í®@» |ÅB`,Nº ´¿Eußý|h‚yZî=¹‰ïÔ˜)h\•ÉE2I|¢¤íè°çT6-Ò‘N gÀ[Öà˜ _‚ƒT]¯]mXg§ˆêyÑ{sˆ4ÃînM*­uœŠœWW3Œâm"qÜû¬É'g­Ï‘ÌÂK‚þ0Y_·\/g¹ÝLIÄ7"uSÕÞ!9S¡ÂqCh~XU¨‰Lûa„CúŠùê MZÏáZ¡ª¡Wt¼ rþu2ÌŒTŽŽmޏ~2‘KN¦O®¸åyµà­ƒØjTHgÙ÷o®9™Þg ©¡Ö´Åvß^±»`¸ÅÄÄ‹/ê…ˆ.|—fÿw­ e¦%#iö—å£ÚôàHò$–ËëL 6ržýcŽƒ€(ðkˆ.gqI¯Ä>µ^ë)÷^`FDcÙºûSâ:S—о$…c [t ˆQYË;LÙê˜ÙÔÄéí‹0Î<ôÝû¾ãö yØUߺ]OFVÞÆÀož4,ÀHÓ•á$\›t¬!š—vÿ1 t£$Öe\ÎZlç=Ð]vCe Ò²ÃDXí¨ß[ÌžÅÙ¸ÚW%À…¼H<BýÚ¶áÉNã†ÜDjÚ¨ÉÂ6ÝW}HP8³|‰Ôÿ{W×þr¥Ãc(ƒ±Ú„›;¯­çoÅx-Æ8žS9óÊ!θ"÷Z3|Ýäʻͨ™XWæ` ¸‰“½yaâáñ`?° ©ºß›ÚºÅ#jÖ„Úâ^Ï{ŒQÆú¹ïˆ濺„Bžs‚šÛ‚] tr/øülUñ6vX×dÿV*8Ñ£äMÈÏé–’ˆ&ÂTñ¸ô ߆£ •›:$%ÀŠÄ}Sxƒÿ¬k0kþÜfÔ&.6>xtytÀ2«l£0-䣥5Z©ÞJÔtµŠˆ$¸¤‘@1¾¯ ®!ÇŒ€~ÎÃz«©,§ÞÌœ~¤²ÉŒëB·žeå(’%¥eÊyÇ=Ýþ>Ë`NáÒæ= ÃHÜÕ÷Årß$óà¢1š°8˺=/f¹ÚRvŽf2ó°a'wCY°hž¶o“W×“Û M ¦%†‘S—LÉM¢ÎøÒ*1½ÎaL/žl ÷RHŸBzÑ0Ù!«ïü!÷ c¼ñ ¬ÅCŽ—wãDilO-ô1eS³’ÍT1¶§/ xk/2%†ÇK¢Ši0î(‘  ZK–T¯ï?±|»k<Ü\ÅÍ£FÌfœfëïS”‹ÔÁHoæÏšÖOc¥¸©I@™Üfè%:®'bÀÛ¶Ô—Î;~v6U<4"LY•¨Y‰ -¬œi $Û«ùXÆ›®603$Wg%/3ú÷m¬ÅŠH0ªnØbáší¨FBþMû¬Ì!šÙåRw å¥·–ÀÏ’h•¤™u,åï=3ó°Ïa§-ÿæèß÷ÿ ªt8ä»­:¿`ÀG­29 pËöoç&æ;ûÀ‚Óæ|?¸zÂAJ,+I}Æâ°w¦ÛÚNM OR¸Š ]ùC+ H€vVV ÙrÍQ)Ý^Ç?IjÿÓè@À ¡Mq“Ì”;ÉgÓS*AoYȘV¹¨F¥6åÚ<"–‹Ð»!â*ng{Kr©D“M…Y•©éQ30Ïùµšõ5¤!4úª€x—4' ‘œs}’!}w¬íÞ/zÖñ€Ô„Ë㛇̮›—]*krµû¹6ìåw×r³¸ðm\ÐÑ’…ë÷Üñƒµ,Z9~ѹ¶Æ”:1’‚–%³ÚÞKÓ«5†4b CKÚ® -@°í¤Ëpm÷Kú¡MÉ@öÇéØšŒSJê玦oõ£&vÈüK>¹Î ÎIˆÆräqÏ…>•—‰øôFE5eº^uùR+D© s1Þg”ºxôŒ¨´è±$Æu'q ÐÔ‡¾™êN¸÷h‡O§âVŒš!½þ˜–ÿW¥íèÄïuw¿lÁòÝ¡ž~›ýTÁë™*ü}¢W6±ê›Sl‹¬´©1¬´jR68½áy[PT¼G´å^Z®·sÔYÓÐ*U ¹Ãv6D<4È|‘ÀÊmVòð8[FDàÁP@˜¸§·ØMÃK æ¯×|,¤QoÓÛ˜®êÀÜ׃‡«[bE“â[÷`vXK'‚&<˜VG¯§<¡Ú¾„w˜š/œ¬Á®2Cÿó˜ ÝÕ!ø‰¦­øÖ_D@Çnß +_O@¹“|üú uâýϤÊGƒÓsÎ0ÃõŠkú'nâ§s0I[ßJÖ§ÌKƒ}z¬T¦üy¤çR\W»ó5TÜÔk­¢}Ýrb•ÍéÙ…>E_i@žƒÖxðí6ÿWŸBßÌÞ}„‹!Tä Λ¬xPŠåÖJ´Èݸ+háϳIÎq³K ´'㋾pº)¤µ4)ÈÝ¡C­Ô»yhK‰Y7³_™6'yæÕ´ð»K6Ãÿ ?ÈZM¤áL§6Ác“ÂaD’ -{7 µ/¾c¸#|/ËJ÷žM®X*xHâÆØEh#«”M|Åã™;Ìð,zBS¸SNñ¹aúAÅRɾœžVd Å}ÞÂõë)nþÚŸNV>bí¢‚G¼@‡êvjM[l)ånº´€¼=¿ìæ6;ÈBrï êG‰/RZòTÏî"ѹYäµÞ !º^µH”¶\e¹W,Ϭûx°†k&¤±y‘÷Ungk©26 àI IUÓ=X÷¹5Âh“™ò›¤h±l§]X¿¢ô:–kø½ß)Á»EiÁiS>«„ó½Âö w#¡R„N*ÿ{`R4EÛ¦Ç!-]Åü·«[„º ­% îÃa0ÛˆúßÂpf?¾á$À[˜¿ðºYt ôûÞScžfƒ°–v%y–»wž`âÜ«Û<7næ ûÏ/ &öú£cíá׿_Æ4žBàÇ¥z«Ê‘sÑM\= ìniRKçhhÅ‘jš¤ÙcqH_–Å€[Tö©(zþêD2ºZÑмCµr‚ª€^2 ©/Öz/6„Õ^+¨Àb|cƒ÷CÇ×(‹™@®˜w]ºÙuìûSäƒ6Žøht&»mYA V§šaËNÈÚ‡îþšäA þf5†.5è ³yX}» å&OžÚ(îŸDð¾ä²wUTü†êmXMíÛ,Œ>„2¤Ô#®#aý#ùpÞÚ³ž”}[ʱð~#‰x†z^.Ršœ L"Tû´ì` “È/há9µ—w„œÁ·k):ßNÂñBÒIϳÔ.ÓŒñƒ?,S'mÍ[õ‘<&/ò~–o|­ˆòüþMAÊ÷ó{ÅTè!%€ß`°ñe»ºÔŠ9°Ý±Ÿ×Ј޶&6Ì%4Ê@ò›À!ö¼ðD‚–Z3kÚªÄéË¿ÓÏâ–Ñ š'²ƒ†O@“ï͈» e”[À^i¶}7ðP;ákb˜öË:n*‚{Ö¥Úi¡K þ,ðC!‡û~»"Ò$ ÒØàë;Æœ¦ä ‰?-:Z6mªLü¥& ß ¢Ùëb‹ÀoW/@#‘'"ǶIye3"DoÝ‚ÊÄ™_££S&1l¸³Õeá» os;Šÿ ™Áu•´¹Ò@ˆ‹‘Ÿ&¾[“Íù8h°Z#™ÎâÞÅfÅò^ëH‹À`Ž/Ö¼»’­/=j‰gú^t·¯Ó…CºäT48Ï["9VwÕjø GwÊAÞ4é'·%^çx4%Ržì¥=Sùâ<þ˜“µ y5E™¢NyêÙÅ× ýí,öÌ`nŠÀß‘°>ýu#Á$ ÛY³ñ̤&zK<´¸÷䉂Œ@Ð. 4W¦bJ”aaI(³®“ùYÖ”$ÿ|{˜¸Ãûf“Ž)Ûºy4K ¥ˆšÐÒû6lËXíº•Ú†8 é¶ü•c\;¸™*¦áO ®Só zï,åNÝ¡ïcÙ¦úÃöñ–‡ °œÉJØ8LÅÓè¾¢ŠAŽËYÂ|02ž:]ÎS“vg+€ä½ÁWLž£ÎŠ‚)ÀLaƒµýYM×M<Æ |æ’’»òܵ7ݺބ}9K2V=÷‰œ EZÇŠÆ yh†‚»­#•…ĬäÕk3uMøª‘’1]³‘/u ƶ÷Äùí§Rõ mÉ<­DíÏ´_Ÿ>üC;/~f6¤€¢uR‘Wù2½Qˆ ”3-Ëneps‚“Œm½|.÷TêésÏXQ‡×GKôù³4Ò¸cÊÏù¶]©Pí$§ŽÍ ß}¯#Cç9}¨¨€K^q îÇ2‹EÓâv‰žÓqû`áÕk§ÜË ¶ìb|y§A{êÅ4»ÞÏe€§íÝÍí&-û±÷ØšÖןT €T*ÏT‹d¾6å™kõÈö›|¿w&® žKº\*e†•Þ0òÑ7¨Ñ ΡòoÐÈÙg䤛ʚîÁ"bñJS²¬XÀ)»êľ­Ë‚ã߯g1êoK‚Ú×u„:Ð7ÎÛH±¦8ù–ê¾6[ñè ôªÞA¥N†Žù½ošÜç.Ƚ|ëƒCºZŒ–#“õö‚íÎ5WR•~³ô'´ƒà9ðGÝ´o†äãNqkHƒÓ^V0*ú Ö¯¤nUPцÁl }aPÀ õ?ïuZ³o>õG—ØivÀŸ?óÇâ)1È«MÐˉ„Ø“ÔZ=å„bæ ÕE¯ŒMÎN¿˜E)Õµá]Š© ü\ T0®á«`¿SNÿºÌsqüzóLYhÚ0f—Mºj‘as¿ÿz–‹ ( ÓòšAJ8Ƹ•©±’¢ôH ªQÐJùñÁþÞ:úClŒ•5Y[«PþÆÙX_Ý«b•ù TŸJÅ7Ìe4ñ3Í….Õîd/[Æ"hÇT¤ÛȽ!íÉáÖù€ôŸj²Î–.0ø~ Ä7(½Ëüg*ÇZ$¯ÛóŸ -¥¾:éWÍi º&ZJO*{"Y`—…#&{˜·`X„ÿ6ác32ez3W4Wñ¯¤’ùBÔŽ`¡@8¬5KCÜ5§gÔ™“6µ¢ŸÕ{ €w/(Bnaz†ð}#*‚@/îçóÇÍÒ—¬ðùç¹ûÑ- ÙÊ8 Þý)òïža}¹Ï!KKrõx»sµ ºhbPɨ©"ÁÆë&~2Ú1´½ûÚùóVŸÎ„8IŸñ½‡¿‚›ºü'¦îò7VËÔðçC 9Ï8Äz ÿ µˆÂþ jýׯöPÒ*ÍT%úu[ DLþ±AéÚÕ“±™NÅPÁÍ%k±¿ôYrêHÔßSRù*èð,“Òíd[Ì^ð »OqÞï¹ñ]¥ß¢Põž„VÏÚšbQjaÈ4 ’ùGŽ”#ücÅCòBdPº% QßÕºãõ‘¸‘ïJÑs„*xŠ=c1¤Ð×^¿SNEþx£ñë*kAA<+ß÷§ìJû¿‚ž5”[žáo¼G \®oԸ璜vsƒ{À×Ðll ²]&­î y$2 6ºÊàÓ!¨jÙ1‡ýOhÕ鲩òz>Ý,®™Q€Ÿí ñV,‡ ö1\‰MnáŒÓlG Þßòù()Ö ‹e!'î^¬¨I[ã%³ ñsæ]³!rÀšZG<_wÔß`#§°ï‰­œ-tÈSÞTÍìÎLαáÁÄp¶‰³ï¬A1'üûz›½vdYÒ·æ‰l¾§üA[­dþB Øjgk’MÜ"c­Šg¥€ÑæAj­7ÔF™Nû•?34`5|!ªˆølIbK¸#[ULŽtaÆZn6K‚_ô^ÛÖÑ9Š=lLR›ê Õ„‘žÂƘx}Ÿíl¹8Ǿßl€>÷‹ôMS÷ÏjžÔç×NÎ:²ú!NéºcÖ[‘Ì0†K›=xw¶¤¶0„V#¯2ö#µ(åª ™Ÿ.-¾«9Go’ŒHòaðtuæo’}3"R d|fÝ žÿS!šsX£« y=¨zY0Œr¨Ç¨å±9@j“ÕÙ XÏ×m¹Nï»Þ°+É6áFMËqqvl…»F~’¤{”ýäÙ‰>•V¦OÇ{¼¼v7õ²JS̶!S’­”€6[¬–R¹NÿŸî¥ð[Äð4ð÷[«/x¯¤ÃÀ&khÇw$|)ƒ»XÈóâ=Þ8'=tž/ïuRëëÔ“ä]»m€l¹‚R}‘ï°¢Ô:£”¾[†ßà·°ý£t½8ÃNÇ-¾EqÐ;†UÐûÞaÆ#•ž»ÕPà] 5×O%}P—Kœ¤··1"v*1¥µÒ-~ÏÚP!fíj ülWzH­µ¢*R]Ò!+ <#¢¸ÐÄ®ŠÔÔ\†½òy£µ• DT¤U{˜„ÈÉ”?¥ò·P@ ER/^GkHüÒd‰eÄóN…žq9´¹%ÖæL”ĞŸq?xi?|?¢¸DÈRrâÝö˜U}fVF ¢²X¦„Juf¡=%k&ãÝR®OÌI0NcJÃsjp®®ÌV¥7 ÛѪ÷ãÕÆ¥’?`&æ›»Ëî=‘‰'õ( Ž¢m2¯o0•‹¿~ƒ9§Åï¶®MªcžåiËJï Ê–›t@â÷ÊDz9I¨VÕ»åqžA`_½ÿgŽ®Ù‡6îVá¦*BÖìäÝ™*Ì¡ oBžc½ ”fg¾Útí¤éÒÌ‘›fÊD–¦å VØ…#ýc„Á¡6¿}6BÊ„±¿À5?@OgôPS<5u€0ÙuºJ%Ci»º‹}FÛD–ú¶Ø–_X8:‰g–ŸŸ|ô±7‡®ˆÀ@6‰/ˆp£ª`oRö¢QRݼ Á²šù$F•*øfnzí.µ¯›Iï¸ÍhŠ- d¥É–±¾‚—[‚ fCx¢=\À»0ØÂûÖîÂáåy-pÃÐP>Xz€êBpA åò–Ð ó±ÒÛfPχ`´¬®C'°“$c’{ß)íË.¡M:õ¯TG=÷„TcTRH€×ïõŸ¤Í.„ú9ùÊi×|¼}€׈ù‡4îû±÷4¡à1— ˆ@«‹s¿ÑPÙTE%EÞŸ¾³…§àËcÿ³]Û|‰Ä¸êÿá¦0³Nc”Ü.Ç(—‘æ8žAJ%¢ÇÙ‰þ:*7×ýQÔݤ{ØÀìÐíeò¹ÙE>…z4ʪ¾¢ÅôtÓä‡ðö§›Ð‘z1ïC¸õ1œ¿ô6—:½w͇ÇOLL©<îÆÏ8¨¢twH_.Ñ7Ï=Ý è´S!á):÷šîéckQ˜€›RPµŠÏí»^ÆóÁ¤"ƒÅ§Ç}„G÷dÏ6¢1ïb<ÊðèuFÜŸSvÖ—ké”k]vHZ˜j—Ï åGÆä‘T˜ã‚æ)~نǓ‘ÿ(82e/)²ÐP g2Á}w!ô$Í}`}OZ:V1C»ð¬Œ Â# ó­ÚòÞ4,êÖŽ{ŒÃQ\øOR¨ô¦H0Ó¢AÇôWöÊr4é¸bfyõ5aPZe o:&Ä ®ñ CW.>a1ùÛã£ÎÚ^ë•ÖôSªbë-òÀÀ™u<•×eJ_äJq8Þ Áõ(8W›p绊v´ùà‡yÇÌðY?NOÔz§DÄêR’úûú¢€§Å—ÊðWȘkÄ#…ÂèŒX`ducèÒâ€ÏáÚ>tn[÷-•P2´ªèÓ´\}ÂT©iý€é'»Ä¬Ô¥oNM­Zo%Ÿô¢qpRòˆ>&ßõa„e6|¬꣸uŽÎTMÜAk"ØŠ„Àx̧˜,Mi97Sb—ðhf^ÁEnÏ™øWx‘̵ÚÒ»#vkRûµÙ± Ÿ6ÏÑI¥•ÅŽ‹É•­oA"ªåt^&ÚÞ ÅÙJÐîQz+°¡«¾m›R_šP÷þbÖã’·Ê2¤‘®å݈«ìRû·H©¬Â]Ù×GÄ<|f•5¯&‚’`¹@¹”c <Qü6s^±“©Ã€¾ÛPr4¹€«¾±¦í”oHЉ‰çj•µC4òšŒ>yÿ¬8Æq\òq8ˆû;¶Êò§\÷¢i‚Œì©ö7 .…\!6îü̵I’æûþ=Ø#/±n†ÖʈÙrÙ¢¼\s«¸ÿÁ.£Äù7 ‰L·üÑóµL¹Î„”‰óX≮OqäueÔ‰ÓX#´0€ýž^WçâÛÁÛ¶ô­ï—]¾¨KõÜÝãÐáÃ…±D,ÏÛ§;+ñæç[¢d€* !x#‘¯òŽs¨ê)îS«ÞŸD$6e•µe/ò¹‹Z€™ï`Iоç$¶#†ék¢ºSÆ Èi¦· ¢E¬&óÕ‹éU­)öc ø5˜t$Sxˆm’³ôQ•îÈü–5:ÛbJZíë„ÂCâÅ”}mb!S¦—$t[ëJsk’€!½jB[½™ì¹Cðœ°U,g÷»½7â©_òÈO29Uó ¬¬¼ºM5ü| X{±ÑÜ$T}3{SUCñå3y«T@g ©Ë Yh>£›×ÿ>÷!¹T’¹å `­A¹OBŠ@_¨Oe!Óä7µÊîå’ãÿ z]/æÕüO3¶uìj(Ü<”èZÞ1ç7å84¥‹§Õ0Ó¯šåZÃ7kͪ‚*+œ8fÂV¦j|_Î'“¿¢ˆµ6W¬TÚUÄZžd4Èçë6¡³õ¿¬qz(ö\ rïµ’¢,Ò$ù톎֔¡Û(žðuDvÿö­üÜÉy‘Ù= Ýç‰ „9éŽb§0áæZ¦†¼pKæê¬ÒÔêe´Ÿ zH0´÷ÚA‹é0)€ã÷"p2Tß›HQî„›é šþ%FàaöÑ%h¯¬x­öDZ:91ü“ôî^É’PÏTËÊ¿J"‚ì3ä"A9-R xÕIM’Ü¢{¾f•²‚Zã‘ÁÑ 1îˆfûKr€Þßo×Z˜ºÚõl'}HdñbØ~NÕû+© ,çú7$÷äò\yhÍ(~ÚT¯U|¢gcsäX`/ìžVÝbu`Mt)çCG¼_,qqAÌh“î<™C5† ’³õ9aL‹­t‰û|†2 elmQÕ×[Y¥j¸+‚ÙäieÓ–Jè9QØ$9oèŽB¿çÜÈ©¢œLyZÌ#Ø»ãË\‰ß€[m‰8|ÿÔ†‚sÇ…ùsÖxdAͲÊE÷4tô^ÈàæÖŸŒ!fÖ wŸ]áü¯Ñ«E–0xU\é?-Z+J x./'¹UÍÙBW‘ $DŽj6éouªpoù¿Ïâ3BàÍÀKÔÚp¬š¯–Vn{Tïâócìî¿÷¹S“iü¬Æ“[ȳ ¾Ÿ}$Ta+ά<Ÿ8û®RYüá üÍËR¼ÕÖ.~ÃMÿˆ¯èZNb‚\:¯±oPD¯¾ÛïòqÍÈ­Ó†e|ºÌ(ìyŸ ÷zMw²•ÿ~Hƒ™.úŠÂU/kÉ¥ï+ø)=‰Nà qv;YéGâÊ–Qá.)é¢úw ×ÑJ(E'Oâ›™1~†êÇ¢P­±p‚"䔩“ýd’É!ÿž|6¹EüUžf`Ù?z;BSÒª„Ôž™á ¤Ólš^*ŸÏ+ä÷ÃXǤdÖx„Lš_[™8˜F¯ì 1»Ã’5h¾ùëFsP¦VtÓëƽ ´@ác¤4aœˆSÞcžÐꥲ2`Ì,59ánc”ޝWw°ÁR¼5díÙ„Z@Ññ)ª ÏrîCEœ¨µ_šu§±Üƒ#¶$àú!› "} Kúgl…23±(üY:'砉̼oÖc›z‰ÇL'a«„Kš£ Hº\ZLCáô[b”HÒÌ;ñ¬ÉcVÞ}ÏLÏŒXÝåßû–/B¼enó/J Œò¢½uÇ)âªÍÕÕçÛ›‘I^Aoããsˆ¥´#2"_K¡»A ËGƳ5–‘aMy™ £µÝUñ±µB¿²%«h4…œ5Sý/b PAy:©Û^ŽÃœpY/™6Àã=c]U1•~‹äO›Å‚ÿæ¦(ÚgÖfcÅ.°3æÖÁ:>¦;†¡Ô¦hY™–A-6ºaרÅÜ–4p)ÜF,«éŠà¶Ì5ÿ”˜p# á¿ï”VÆ¿^†¬Ã+DdD«ò»ªªcº|‡¿ÄñQvó# E·ed þ Æ‚CÔ/ÀþðLD¹'ëÈ¢oõ2~¸{‘§zz”vë¥E‰üpÊóÖ±¦«6+Ý‘j”œ‚y3þ †=16oÃÀtÈ ù,ÈÇwy›!©UC]€`Önb8V9TÞY‡d¨ ©‹[S ^b©ä$¸ƒ¹…§%ÐílòX’ðÿŒgi¾û¶¾2ku·:4ñš/ܮЊ´N±örC kò@”3ûu!Üó ¸ó® !ÖôžrÁBõļÕ'ÌÆxÖ5žO~)áìõõsJ‹¤ŒâzXeú“•§×mÌGÔÈvG~0`V8(0ìlTéu‘åd[·€˜ÿ冪A:B¢Ä¢þT"úd…DÞ Dçg~ËØœ6TìO¯¹N™ÒSzcî:"&ÏÛGÒ,Z ã-õÕÍXå Ÿ°…¬â1;(v«C~¦b•à›„IטtçÖNªªÏýLêæ;@~ B#- ¡•|bX®ùüáziÐÆ]ºhi;Ø[PŠ´d©¹â–Ær•y¹‚ˆb8ˆ˜»Fˆ ™'ÊkŸ&f®`}*<ƒc^N1}‘ÑÙ™Ž|gp»ÖT†ÕÖˆ“’Um‹]œ s* órÏ—U)+ï¿*¬ónͤªˆñ„ ªØ>2ä*5«–¨ªê/{ÈZúuн[®€X]nõ¼VüT!ó_ûU˜¬ÛØ^ÜÈL%Ç= ˆÊÉR¤ö0Y±tÉΨÑ>1hŠSÔZ2¿8‰ÓHûÑsÂ˸.0±ý0•]û‘_Ÿ½•;-ÐÂUî $ø³„Mcf–8¬ÆbzAË0a™O³¶j^è%x¥ƒ\ú3±ò·¾ê»å+H½çÀÓ„‰@r¼5ßÀ‚~+.’%Žï«!*ÙòrG½e¢Òɇ½`øÔ1¿¦˜èÒêrŽ·ÙN•hˆslíÁA`sòËö—¾êÎç “$–ì‹®j©C6ûnTe¬¼ï¶ycáá#ƒ¥?ì¢:`6Œ¶Qê•>½ r @^¸ÓÈôöRO’­Üa~æoh(5§zfòê0::Ô¢jc—˜Ò†Ë³’ÔÛŒ9è%è^1C¡ÑQÒ:!4cg@p#Q†ã>ôÝùhbUA•”"# jÍKÔ Q}ÙËÇE-u¸âºãfzQÉ=¢‚ÂæqvjAˆ.ñì‘ËfTH?VÿÂز÷§¸p-çáª$ñÄæ³ |ØÐÝ[˜Æ|I·ŸÛ¦ü÷ãoæjø‡í©œº¹N$ÜZµ!8x!0|ýqÄOž®½ÿysTÁñ١ʨ ׄ± #ùøîŽ`÷T¿Åzc”(Þ{¹—~ÒT˼¢G´¨0ì¤o!yuòP¾¤65ïGêƒL:dÿaú6 Gt¾LþYqîª;p ÔëôT߯E}å:›þû+ x[^ûiú®ø¡Š=žH!šÑß¶ˆšl`HmâOÑØÄ+Ìõ¡ÂGëk‹Ð–gs¿:¥%47“Øh‹dûÿ%æ» ñl,nZÖÂqÀ ©aÝ–cå:¢y¨z®¾âW|A\xÊ¿ÌÓJ‰}ÝB, :\,PZ›òeQ×äµ3U¨rÕštY—xSâ´á‘R;¥ÉöRsˆ#ÌWO¤¶ß±ú¤úK57ºcÐTqd!´[Âx8€&½ÄÁºx‡×¡äUÚÑf¥Oéú³éÜìVha¼y¶³^—¾U]œ­6•=ÍO­¿¾WB±•y¼Q¬±4MhÖ‚4l‹x2÷\äävåÆò–ɵì¶$ƒê´{T`A#÷, i»\„`·]x€mz¤›­¡ ïU_øÝ÷Løl¢§Îì;]n¹’ÇBÓ6¥ƒ¤u‡º±7àߨkþG WÂhoSÁê X,š!†Œ––)o½¬å R¤¡á#c‹0jbäg9HSæ×Ò˜äݪrñ}‹Þ¾cÙ5\xV4–·Né©ÊkÛãíÒnáCÅl‘GøîÑòÁɳçLH9D’6Ù>ÞÈØ Óèa‚š0Ô×ÙˆW.Š{‘öwU ¶‡Ó´é3œþPÚáO€½¸]øÇi*7þSN½ø5p¹c@þ³Ž”ŸžL4°ÍIȵÝd%™îD=Ù¢aÇÜÍEÖVÐ |o÷ ›ïdEwãS¹Pf·HÈR‘„¶öùVŠhŠZ!¬‡GÄA?1K|£Ý‰'%Ysβ ÚÞ¤œ¥ èbµ(¼›Q9@ÐÒ«´ë¼ xÍç¹Ö]'5‰¢Ñ ³úÛMðEyàñZÝ­?U¸m›±ûùÓB7×Õ3Šlç( üðƒ,À®2˜¨ÛHPw²ªìÕ)¬²ËËSI'‡¶î…ý´‰¬Z2´&VhyWkˆV@wíÉtE¦ Ré?0êæxÅã0ê°5i7·ô_Ž%Ö«yÖñg:ù ¨Î‰»q\†ý£Á¯Ò¤'Ð+.Ѓ/ßrðw ‘”(½{$ܵìoel˜hÍïRåf¤"U `鎄6ÚŽ£”1oã´žVŸð?û!lAu .Íñͯ`íågü=&ÊøsRÁ*…®‘û=íä¯LüyõëÔ³±‹°rm»çil`ødÛÓ0û…üVa*,›RdцX/q#ô*þõž‚¦h£nz\†>$›éM±CblÉKØ©·ÿŸ¼EX+ ~\,aß­• -¶jº™P Þ³šq)Å=†äºƒò€'Œó&ùw¢÷˜}ÊKMþÜp t ˜^•h416;òƒ®jXœ>©/>”Eä#n ûmªK£ò䦅ƒ©Š¾Þop4`kES›rÞ¥]¦›oïFõe^©>i»Ô‚[‘²×õs3FBìr¥øÑd®k5 €‚¬Wá«\¿.íùeÇ”ƒ§ˆâ˜‚õRw/ße¹h¸6Ð[Æ6¾¿çê>"˜UQ£…¹Ø†Ö#JçCñÊ6hÓÌqn¥‚'¡ÿG°‹[÷Gÿ¹°~™ i9RÆfzºjâŸ%¯è ]G/º¥÷òýûGNá@T6çøÄ¢Æ¨²k”çY`鼑 ÀÙýãe€lú/å¨gã_À ]šm·œTäQŒÁÛÑ+Äæ9>”"ŽŒ‚z¨–8¬ä;év§¸—6ùˆÐĹZ[‹m°×/CÒ;†ò¤Ð%N¤OÉ7þ¡8ÔÎOŽ™ÒO²þŠÏòêçòâåb¹²®±âæšØ‚áND|$ÍšëjNµ!`UÝ·üé3wb){JÌÎâdÔ cÃ[k–’ªj¡a½Xh:˜.vv§OïÕ5ˆÏA•ç¦9áÑ‹ë âJÀ©ˆ4¥¡¸ÄÇÛÀ–9Rü$ ÈQÊÝZ1Ù¦œ‘ã¥u)ráxà×]+1dÆÞC°¤Y†𢭒Õxæ†7±ñåz“@L€}ç oÈ“ºþœo.8UpCùÖððnÜëWÖ,ÁŠÊbR£“ê)»¬¨ÖÂcn ÷ÏûOÌ]ø§C‚žoÇæñxÐíͧ³•dg9º³€æóOª"€tø»ÌÊ8¾Z²á‹ “¢Ð°5¡Õ¸g‰¦Ð>ðÉ8‰uƦòdZ¸ñ|Q^!n&±€W_³²ãñi \í!ó¢iŽ@Þyƒdaø¼]¿¡IåúE`iù>‡}­wj÷fÛÏ,=U¡`?7Åp¨H½š0_‘-meÙk]hÐ',8–ÑÇ?oŠTä9×<¾ÄÒÕº_Ìô06#Äü LÝñ²òü7rSY+CKfÐ=Pßû›sw•+ÅÎÿÄßLÞ‹!Ø­„(TÄ×ßáöð$ÂK2•ø|vyÅb¡bþÁitðMÀÑë¼858ΠäÉ,¹ÈOÁËñ‚4x•ö‹ 8P¯Ý¨fÜP•`ÏŒ“ž2 ¿Â ïH%R{pïS^|¡²4% 1ˆ£­p¬WhsúÚ«ÓÂÅ|ñlúçÄàЮŒjšÛµ!d8ÈË$ž´ûÄqÔ2S²\¹ËMÎòãq¸ýæšñïvñ‘~zÄ<€¢Œ¤¹×|w·;ED¤ùçÎHë4¶?ÙƒSuPqÝ/• !A$g]±å(ï0^­„~ý€[o†ÓÔ³¶e m8sBã#Rz¿ øŽÖ¼Œëå«9Û]Õw=ó˜1.TGo"P­ä&‘¥”\óÇŸì=8@° 2þ˜Åë^8e\Šw]K™ƒ"·(‹Ä¢ÑX{€vÓ1’Æ~¤O‚dì|«I•v²ñÚÉ ÇcN¥`”¹íèÆšÅ‘›rŽè#+ÙÏÅ å #GˆÛ 3®óÜÁ³¹“•€ýí®ÈARäùÌuGX^WõÖÉ(ýýe?Ú€÷…ë ›ÌÅI®[v\§Z¾ùð.ÏœÏ}Ò`ŠnÝ`­+¤ÑÑ]èí%O 0ì…áœÅ8jFeÈê±aÐuþéYô 1ìÀÿq¢`š¥|͸„è|Pgô’ãC–* 7»ç¶¦ˆJ®Í™­®·¥Àßî j™œk’WŽNb¡LpÞûC Åc±ZàÊ….lgx_áÁQ:P¨t.½ÈhšÉí¿L bhÕÔVoÑžÆ~ŒÉçKÔŠMçù{“@Ø™‹Þ¹¢è/®{ÚG剭9¹¥A€”1Ìèå7à-ZDù ‡}öY&S¦pýlè™Yô¤Ç2»Nxc¡BäµõU°8-¥ØJ¥rdyqg­¾=SX%»)’W!› ~vûqö~[‹¢Cä¨}T*¥Šôùf_vz‡®@Cˆ)¿¶é£ á#8‚>‡k®SÜÉ,Þ|µK}ï -˜ )²ÎŸ·ßÉ¶Ç ÀëÝü·ùæÈ¼©þïvsbóR'l ±E]Äøé"RsҢ–î²À^¢”׿s|#X»´~\Kμ]ZÈФça¦™V»Ó…>Q™¬G-s ö˜ÿ忯ÉI§¸1ðôÿ—tf ‹ØæØsjê8ÄS h¾Û¥ í%âÖÉÛRñ÷Cé|ÐçCa;3Cµ¥"Ë?h Â?eaµòáòwEÏÛ· 2D$ÉQ^½Ymü Øßâ\5t¸8öèáïìŠÂð3#l¯œÀn€yŒŸú)Îg‡ÑSœ£ó¤ý²u!ã§F04†¿Ð-ÍEÏ+Áî zàDÿ·pÜc¦§ç΀ŽÉ|Û¨ÁMcAî`Ó<ˆœY.ˆÒ¶wÙ}+®Ëµ¡ÎLWfvZz 1m´ Q^í‹|‹XKíS®{teŽšÝ}©WŽw&â¤ç\»Jí±-h+ ŸN„^®—8 ?«€¬¤2Fƒ—ö•ëº)9Å÷œ;Ö e€ôx Ǭ‹|T Ýøš9˜ûì\:yºÀÚãêÍØœÄY×h§%åÑ$ó¹Ç½uÒr|ÂX3MÃ$0s¨Ø6”«džg­Ã¤ 50a. Ñ„ne2Æýp&!ð< g‡pþ¢ä<»£¿ý÷Atkм}KäÃð ¬rÙ¢ñDÖLø{C·uýŠ “PzRTHX‰­ Ô[,§0)9x‘¯Î–áâ¾2!Â'ÓA´n”¹^ç€Þ=×`æ­ÒŠü)ÌHØÝI˜u ¦^¾i_­„F›´oI–PÔßÊIÈÖ«9íOÓùï°&u^OZ˜·#8M"âq¸dµ'kóËÖ4Mõ!¬µjR¸´§JIZ”Š÷9æq>ù»·Öæ‘2Wq¸T3ûô‹~12éñ¢ŸM¯E®ŠÔ걓"îH¥ôã»kýµ,¬Pè §áÛ®r1dñ»†ã瘸òFËx(Ë#{Ö³œµg:HÊÚhvº OP˜Oz|ÝÌó¥\8°x¡Ã¦Å¯Ÿ(”T“z©¸™u F^—xkåÓ™Q‘½œÓF=Mu?Ò£S#×b€=àó‘n´†MМû™¤ÏÍöÄ7÷Èúl2$sÏÍ£z*I‹ží8Œ …c/SÒ{üŸaIfg\ÙèOÌŒCó6=!¶yTaŸE¯ŠT¢€+Ë­àr{t$@º<;'ù ÈÐÃ2¿ÿc¸«®•ÆH‚¥Áú\NÜÞÅT‰;ɶ´¼ Æå¯íH¸ ë”ÞÏ/Ç4Xo™ñ:š4è]’ÜÔ]µ,¿®0›IîwÌQÌ@éñ">“°¼Éþ¤…:ݬórª“oÄa¸„‘oDe6 žÄ•ß]ßõ¢BQæ Ö©áâp †)§˜aÕÃZ¹¢WÅ>¾˜[{:(H|É>5•èÆãG¥p (ÖðbHøhÝÕå¤:Ë`Æ3C†§Rq´ÀFÜ¥ŒJY Ç_0gH‰ª Ù-èùP® <Š)¤•©&Ðiqú{ï‰ú‡9>×Jg)ð9ã,rMn®Ý¶“Z]¶`\xçóîL5Æa†Î 7€÷YOÀª}¢,³˜òQµ"ßäPT}]>,Om²ëo±Ùø«µÊ·ò( ²VYp[^$`8asÑ…YB­1î•%cËÏñj+9ß 3žpR̉^<ÙÐ-ÑF rqWCmbà¹J»íoä~yÓ!ȤÖMÇ ãâB¦H‹9ÔÉ¿-`´eKשJβ£ÇÞcô§ÒýÚkQ&½[›N¹:~L÷ˆ hØJ¿Ö“i6:× ·hÕ ŒÍÊfý8[ñØG™\ñl‹fgrîÜ EfÔætZ¥&çv8ÖãE›_I[ã±ÜR¤eÝøÐ,æÀ'c3—‡–Í6¹t*ô¬}¹z•¢v ÒjÎhU-g®òÓ~ÎÙ½ÑËl©xÿÒ0#î€JÊcÑÍ6)=’³4€.€Ñãoõ¾HˆW'L6¢5o"ˆmHÍqÁÍ«é~‘‹CDmzoBc?Þ Ê>TgvÐ3ªÄИæìä(²)ÐI,¦—€Ú•EÃg²Ý$é5çÿcUdCŒ•—¤€ïßtìéë…VmX–‘dÈ+XEó÷}zWõxˆ<Ò˜ä™ó£–ëæG(V‰uñPü v:hBÔëš«^úiÓµ¸f+zYö!¾Ä“«‚9âFt0ê!g¦ÒˆèÆ¿ºvœ ÙÔ’—Úz)%.ÌÊÞ¤Ù#îX1ÔOàx’Q=ùS´‡Ÿ¯ï—\¾õo:ßxDhE¢ä‰§/ê&‹ûø÷×.qà†l%O2‰v5Ëý˜ÌåV´ð*w³‚¯×©ê°·åi =¨§y=ÚÕ5yûÓy¯ä›‘ÄR‘=$ ö2YâÚ´“‡*ôðº±N âØ:3!…5Ô|0Ñ9~¿E¨ë›^K:¼2޽LFmIÇ^u¾ïÏØâëêˆÒîPoæÚÏ{{Óþ!6öÿáL¶¿Ç»7únøÈ®½ed>¡5÷IíqÔJ,QS(QÀ!ðG^{3ŒîŽ^ºNÂí 9KÇ_Ñ~¶1é‹ê3]]‹ûtg-®}CŠ%lçW¯éeôùu0GxÃÏ>§t+Ï¡I‰4Ó0û™9¾T ºÙ⣠3¦Jö¶å=5iùá‰ŽŽ²œm%ú¬½N W >8݆ôáI) Sýʵ{,% “j{áÒƒ“Í `sk¶.‹J#g·TTUÙŒÒÊ¢ ï{Ã_™w៓‚þ“=‘èòòóL„‹Ár.¸Fر•¡’âëñB“©ÊñãÎÏ*EhÄ0êz¥Úy±TÍL‘ºB{IÄðènç^¬à$hÄ6: ´~̹…à-õÇ`ûC0Ǧdˆ0W gþÎ ÜŸ®ºû³Î¾æ2F*ý-¬‰§ÒAËcìkƒ³Ù»£eÛRP’¶“Q~x‚&/Þ¿0®Y/þ¡–AŒFäöù %…`p05ÌuémõKÝ´-;š{Hø‘krÚv’©>ø«j í·W|hVnEß9˜âoŸ=>ÊŠÐyeì/œ’}iZùëoy1;±Å‹¢i íÃûlÊÎ/ Rìwü’?Eõ$.ó€uÉúH••Õˆ?t ¿AXR;v1 HGc õ¦#î|ß³Éò´Ÿúcm6¤xÎßímÞTB[æãºeÃáÂáRа¶ié‘`|hÄ„b¿EÔâZ»!îVÌë&ô­À¹±! «O¹Ñá-qôõâCO£¤šÐWUÙ»§Þ.;Èh+¤äÉêlY¶Ô‚W%¯å614;φD!äÇ.›ÑŠý¸XăÒó/Ï3‡?åÛùQ£ïØý-Ô^lI>*b¹øÏ²ýÖü‡]Ú\ý—ËÐÞótëM–ä!½Š7H°µo'~ú'‰tÚî<Æ¡>´ …³pì2k€ L:™šÉd†bbÖS]%oH‚AD©íI {ó µ,–Ö]þ‹•ßp(@Ë~è–¯ôÞ-EPEpIå5KpÞ tñâÐùq2Ò PYTÑø°;ªÁ3D© ú=1ÚÀôå„©˜ú”Y…þæïu£¦ÀCtFÆÑßžÁ‚Ku«ztwé„ë,kσ ëAcsš:²ŸâHáÒºënÆ“Ñg(ÀÐÒÇZ÷ªåa"iL·ˆôD¶ âì 7™®y¤‘\袩 )gd-!Uù‡Ò𤦃GéÐ*/˜SbIá¾¥cù­g';Ó¬žÑ d?P¤¹¾ý­¡+¦<ú²ò]ñqSp2zéù¹äúusïSÒçe2ó6´5b^ëÙzí#ðM À¸ÜL»#+šÖ+AºÁsÀmqŸw¢•,øÁ?ç§JdŠàún%çPl㩞ݗ˜Ü ]†tÛ‚nÛÌ}.¼7¬'ÿ%YÅx`²,ÃöOP´€ÑÙ› TÈ>÷ ü¤O¨b[ÉÚ¥8=+«¨òò†+Å ¥±¢ü:ç¡õ… )±rbÂè2ö³Ã–é[œ oÿw‡Y¥HaˆüD!Æy$™G=1: nA¢ˆº®2êì-¸Žå.<¹Û’3SôˆÛä]²â³£¬…ÙÉ=4{Ûæ'ã^ÜÞ"”päM¥ˆk˜v}2&f½Î‹¹®F”šj‘xý»16w¹É³@ƒÒß3hc'ª6iWÔÂköa>£j"ÙG¯òùÏE)À¿¹Ÿ‹vŽ72Û_†£UµÞãS$U›È&­WL |þð_ëMVýÑ‚J¨ºCêå^ܓްà)\3C!´ÌCH²Y¦,—äŒ×4ô ºçüÔÁÌ+…Èâ&J.£df©¥;´ntø½bÖ¥?×™ ⣱N <Âi“RjÍsÐJQµ3y×ð¿Ê öïÅf¸"ÑÈ9‰X8É=&µ¼º ñ4L/„rJ©ØQ·ˆ§-S!»l¯Y,@eûýìRÕƆ34d³¥U"8X-àÔØ!0k­Ö©n1çŽÚ*AX 㺑Dm¨óxWÑä*(¨Å\'n¿£X |)WØÅÿ0NÊ=ËvÚÛ.ü‚Pjä§N­Ò ¶ï¥:?ubV¼ @ç¦} b©%ñ§,Ò(÷‘î ï tU,+Œ¢Vdl7”ñ;@àAâzœí ¼PR·ZÍ1´@tA=fÓ-?9EÔe¡˜ƒ§Úy+ܾÎ0û‘¯,xår*øÅn/÷þh½n`âÑŽÝ«7ë']™Z¬·møè“ƒ´Ñ²,“ŠcÑr™Mêr\©Ì1ë1ì'4Ú#Á æÚ·ò^°±cËg‚æíYfk…Ø7NÇýZ }aò8'±O†*®"o1÷ú~SŠÔû«úh“3¨•»CFŸøœG¸²…Ã̺ÐÖ7—%ù@vÙ™ÑI9¸bPø$×/¯\ éJó8ôèR=L1º~¤Ÿñ‚ït‰ãÁ•6vD\·ªU{¬”%¬Ã?ªU öWY ýÞPø¥¸2Ðãt˜1îŸÛŘâMOòBÅíà÷€H·üIËÍÀÞ€•ôÁ¥ˆÄÝœ8.äÌ`ÂV‡ûåàõÔ†Ý +ã±Â*0  Wwœó*¼vO:ÛtëH†ˆ¾ÿªC梒9¥(ƒñÙž8jðîã£Áq75Ò–Ç8mÀ€Ž3T‹3 î}Ù€*®Rʈö_°°K§Wû4iØEh0¡‰IȤóûUa $s?"Aíá¤âKnBe«ìÓº`ïÛ®~ãwgˆ!eó7™öº`ì&O¦ÛŒ“].ŒPÈ4átÞ‘u<  á¶µ)íÿØ'Ÿ»£¼º‰â†¼vÚGêÆ4¾©ƒGD+!Ú6•#ö \z³lQ^&Òhd¯4Z·4loú…'¹_Ÿ†´ë‡,Ú§Ÿ1H¡ø˜×ÿ?ÜKRÿ&ž)fF-ÅKHŸ¹oT-QVƒlÈä~Ásf|_H|Ààw‘׈ª³½_Zqõ{Û9Á2'wÓB©†±ª¨TÞvɈ°Ô~Î&‘n¦‡ï¾TpßU N*‘‹Gm9Jï.ŽÉ.÷†«Þ$S©=æåïd-,¿ºÖK„°“U$GÎÀ-,‡Si¤¢ ä«,ùo‚fÖ7.0'JñOLRmŒ„ë•ËúÜÓ5Ê>zµô™-ëÕ$´™ÿstø¥³yÖà«¶I ,«¿‡ÊuêÛ¢âMåÜ#h¸ Ø+#¹î\aüò˜“œ´j &‘jÅ'"çâɬ¥Góìçºp€ì³²oª~ÃMÁ¦éü¾Ï:®w4 #å3o9þhSôæÄG‹‘"p<,¶Î«¯R ôP«á„Ö‘sÉ…79U’íp}ž”ÀòÔ·½ÀzÛ¨SޤÀY³È&£lG8×Xõ´Ãå=bp”Óë^Ÿ”!ˆQkÉuO±Ò2°ÐúBÌû býÉZ0ôKg’ßâ¼Ëq"–*µÞ3¾„ìÍ+^¦ÑyÏZ€ÁìT.øuRuEzi ®[™‚eA¾0¹r"¸äƒl¤ó0?ñ!¤R'óªU=`¥äã•B/ü1ì½ø4Š»–xX’K1‰¨‡Sâ'©‹ùDÃéWVÞ¸„|­ÎšhÑkX‘­•X[ÑS¨ÄùMê–£áÚ=Ä'#äexf¿ÝŸn·ØÑ ™'ÔÇ›qÀ» ãötWB9. x¸Ôzÿïb¿Ò¥†_dÿ`Zùq¬ò#Ê ÇÎp#tÿPR‹Q[8¡7ªxr^x£=Àíqà]œÈ@ñiZ/ [|¥÷š;©Úg2b­ðþx3³ñR;ÚWZ”VyòQÓç›0šñ¦>_젣˜º¥þžVV4P,.¥¢´:„vüĬ4\ljðüSmpnª½©¨ …Ïl{^=]u"Òö –Kí¨Y㚆‘ÀTWS±U€Fÿ&<%ÃÆÓ¿(á=ÜVŽão—þÀÃb¡·ÈPuÈä"2è‰Ìy¨_"^/Ësõ®Œ¦i)%‚·)ïC„ÌÔଆ¦fÔn¿de‚·‹5i|ð¦¼ZÄŒ#Ä^è#KæudÏÐ 6Ë4“ƒ£Ûdl*ô.ÇŒª &KÏKBî.¾D®z„´XÄåi­ª•|ju¥&—RM hnI/yÚq‰ÆG-¤0ÌÄ{îÀ[‡òLûè…X¹V3Ž[+d* NY¨ÐÍ ³ÐážËg}uöýÝÅ«ébñÔ‹^m0‹à$›c À|&ãrJ¨ßÓHEî»\Jªù½ UÙ­M«Ä¦†°À]KE (ˆNÜÃHk4£¶ ³þÛà·kææ2Ï,$¸NKG€ ìùÿVÙZTd6÷ÇïÍK—å(-%“KÀ”¨Å  @ÒŒ ³1–´ÒX1 þj-gc|cD33pæÄu2ä´^ãŸÃ3Í£‰.;¹?‡–ï9Å@JúúŒß¹Ah>B’\ð´*òž®x››#Èkò±ˆ´,÷¥Š†*c¶zXT´Eý)šÁ0:ª5ËKb··îZ‹Ê*t”ñ Q BPV‘¾ïY™ò„/zay?(ì­îÏP•kÉã0&X´(Tý*tÄÄ,öX_DJãûy©Y"PÏÁ($ ít{þµãQÙeÍ{\°ž´¯™ª "ñi¶ä/&M›l~zfÌÒ¢Ð]¸=Á•ÍÃç$6#™U+ý!_¥pdBIo*Å5/­Fmôͦ¬#KûÉÙðÉuϹU~švܱs½/¯¶¼™eUp·'M8ÕA œÛÉÊY?{°ØøÁù d*/ÇüS¦flp~6tt8ý«Ëún CaOÌèh²€”hS¼jÔ•ä˜VwɘüVƒe½®´Œ‚{éé4U˜áŠbúc@ÉŒó1™zOƒF CMsªèÿ¦“ðÖÏßïëé°„0qÿ´j;‹¾æH…¦“šÖ@ºG•ÝÏØqñ[syÆž¤—ÓØç>ü²Ü¬§²û3÷µ/.¿¶Ëºè„{z=´Öœ|TFL7¸$Œɾƒõ×fnêéLE«Rýo²±êCÔgg)Iö+gõüÛ7~´ÌŽ-H^†C>¦oÍ£üÆš8ü­$+1^ŸC‡/êÃRè DËßÑ=¿þ\\n†ØÜb’~Ó]ƒg~aª³šŠ3ÁæèŠ1dlì¾ïÂ1ê· ­ˆ “R©Ú§_¨xKtËn¨ ¾ñæe¬g¬wBDV'Ø›¿KáÏ­¶ì”ó)¦ì¤Ó¹ ‹¾œVìÓÛˆ¿s’´jž¤RQHO’Ø¢//y<›öÁSŸ¬sš²³žÏÞ¾ßÑë‘Ü—v4 _QÖ˜á¤Ü¤zÉÆÆ2÷•ZSÕíÃ)Ð<ÔQ#Û™ß@ÁÈé.E¨ô½¼&e©e¾ö;µõ Ç2TyªwnÔ€V>ðÆ€Zº’{u?’ˆ}P@¤óÄ:8>2ýñý/8­žæÄš¡ÑPZÕy^±+§'®ø½L©ð‡Í=N 4³þKÚªÌBº§ PmC §•jþÀx¼Çjǰ¤ý®¶g¼q(ÈïÔòªfÉ’i·z¸FÊÊ?ÈsfþÑkìôëï‡ —³½x,ýbå*AjÃîâ Мdao¹Ü‹Õ÷fÔ1Ÿ!„éfŒaûo_=©Á;æF¿]ßæ–EÒΔýŽ·^—yá×·/wÆXáw§ݤ9æÊ”‘:¯‡>ˆOKaÞ¾òcã’s©Ê‰9_$Ged¨c+jYÜÉ'žeR:m›oë‰uÈ…ÔðcšâdÁ#qtdd¼8 hhO0ÑL!µDû¥9CY³þÅW–}"¥I^ucÉÁ¸›ð.'©a‘æïÒÞ¾¦¢yÉŨ in«™ž«^Ép· ›ŠG;oYݽOošBL³ñ2ä'®=£˜Å‘#]щÄ7v"§ò“B¾ä¶¦ÂZF~Â×LD?ºû' NrxÁÄ̆¯öìçv#Ù´ÓŒÙ03qj¦/ê®ÿ©·[[ð=Üi¬/.ØÍý4~ȉH嘃c˜ÐsÌaäËÙ8«ó÷ò$o˜ /ÛÁšÛ"ÔR8o~ëê‘ YCYfF‚ #,Þ<‰Ý$EG¿àIöù/NÊ`­Ÿë²¼?®pø½ÄÊ»¤‰L%lÞð)T^÷sùšo¬Ú†ß…Œq÷yWÄÔïácÕÑ,]%C–×/âÙ&Úà…tö =}ýÿšNqqcíø£Ý䑯ÌÎ@EN…LÆáJ9H“Å*o­cE:2üðÄVÉ|m 쬕e³\,m¹Ò± ]DAßT®ôJŒ/dôÜ:nóu#èÌ&ðïîÉÀÝûíF‰'<ýͤKo‚ˆg;ÁpÈ"G>µç ŽÿRŸ),ðcbëû`TÕè¬ ]{2Ð'ö|Ï…րΊÔG0õÙæÐï€ø7][SþSzsã5&ÅÍ >  T©è2g†ŸÃJGÒlÍ\xµá+;¦ÙSB©`˜î•f>!yÝÏJ¹tÕgi.“žÐ5°ÈŸB07kÔÀ¹§¨G”\&ìF°Þîϲ Í’Gëxæ9Qp¨¶¢ltï› ©[)k†^ŸàX´S5îìyþ3»/vcý…ZJ,¶™[²¦±HP@B˜Dzü0Ä»©Î6!^« [å3£>•ɺV¦"½^kWj©°[µyC×òιþßWë5æ´è°5Ê¢}ÌíEÑÄJÇ[ºl°ã†Xõ Ê[±¨c\þÐy›¿g>3Âÿ»õ;§,¢‹Þm Ù"wêµfÈz°m¬úm®4(` tiÀW2dÄalW9n_3‡yÞp<ûÈ n šÑð‹õñ™ûJb|ɺ:"T'LFR.¨‚|‚ä7ÀrŒ E5Èg–¬ÿ .“¹÷`@Q¿ÚAî{¬ª³Ó¥q¶¤ËùeAµj(ð4#dÔ~áDÑ"+8AI.èsÍ”ý‰#‘ã#5üϨÎ. GÀ'­õíI€çFŸ @‡õO}(Sm”8©?ýTHÓâ ¶®ýuU9Ò"šÇ>Õ þ’ÿƒ µ—ŸtÈdãëR0D‰FÀ컕÷•v$ã~“ràB ½½¢ØT~œ–˜¬p˜@$jÌÝg˜:Êk¢º8Så¤Ý0åß b¬¨¼#d%ö˜ñö§E1bù¼Õ¡ªŒˆS„ùA¾‰­.Þx¤{rŒ)ÅÜ#H»AØ;êˆÐ%¢å'Þš5eˆ&Ãßy:†«±d"kõ—ìh!?~ÍÚÎωIZ¢iCŽáçåÕ—’!®l‚ È¿ÉF´Ž žÝ–ꀅR è&æ•©óUr§§_ôUˆ»6¥¼Ö H^”(Ÿ³¶Ë`R¹n(aÝN\ãnÕ³a˜wõÂ0ÿel1åÅ!hÇá±ÙªH»÷È/TÞ‡ªÞîãþ8®>‚ÔntòÌŠt‚œÍÉ,3©åÒ ”}€¦@1o#\l›¶=Êuâ2ØS ãr>õ1û$w•Úʵ„ŠÞe’V.ˆmEÿÀÄZbÝ ~¦¬ ÿFþtUS®{&!ž¸É|tÏÙhÁ'J“[ho¡¢ç$rõúî^N˜ð²€ -´øGü.go'#u˜Åd¸c™¹•‚}ÀÐõån_Ioóµ«÷)>jOamyÕ˜ÂòÅÞç¹ ˜þ«Àoø—ƒ‹5dë"[n’ÖRÙøjþÊäÜw¤Ý ŒŠ@úñ ȶ”js‡‘3j €À8Õ:ªKQµú 7õ²ÒÖÀ жÖ$wHüîµáÝazl±y†inoZ2|™ò'_¡Àz ׎ $¢¥–_‰›\‹ºÛ7Ôl·× -KÙV– ﺯk«³1Dx–!û!iý×µ¾éÅñ¸ˆ j›m¾Ÿï§d ·Þ^9fèmv[*î|pHÁï:€²ÞË£oÝ­Øa L:rakÞ ;Ú¶ºí4Gáá+üƹUSæ,s‰?í^÷2ìÌwbá:ƒý#¿¨–DvÿœG•…°!dèݾí¤ü¦@Ó¡”á_|Gï,¸ü¹îºégÙ<®{šþ–yŒ#u¢ß1Ý·­#^ ]ɽm@ivc­ûëF˜/¡ï0/ѵÄĬm¶’,°HOb”2¹y]*¤×Äw€dq]M:^DMÉ?8NuWÌ7MfP‹ºˆŽæ×ÕBî·ÏȬ(¨Ä·+ rÉJ¿‡Æž‚_ -@:n4.5åQ5ž¯.Ç|Gû‹—¼k¤G$ Ÿó… î òµCwÑ)G“€¦‚ ï?o^-¹Æ¤\ß]‰J¡+á7/ã- ö7=ŽæÜË”@lp¤#¾?r ÿÉ–r÷ m¬ž3ì~F¼(l­GUŠì€$±œ5š?–ò*ÝÒðD Ýz´Œ?ÈŽ7ûð™°-ÈmW’ŸP®Í>Àç·[ˆò#…ã¶8…Æ¿§çsÀŽqz ~ºäu–-÷Þþ{pqÌü[.…Q¨· s‹c¼,,G3 ®€¸—R‚y“¨¤ò7J4ïQ ®µ¢·ìOÛCEƒŒ£ ¯ËeV™í™±ªP¼×£WUG‘‹êÍÇÆF› öHqüJ‰’v ŒB~#ÇÆùçÔ™­ ªmA¯[ñM]‰"“*³ÏCæ\sQ§Ô-ÃÅ—¼mƒ3`1„éìÉ,4¥š°'{Ä·w'Ø“˜¬…€Œ†ñgüÍ›W]dBµ~Fß}O b‚¾ê9™ÐöCˆ®!´*å$3þ&·bè>æßÜp®úN>nýÔ£Ìóa~¥¦p•8L¤´Ü($Š+”£Ó¢v=Ÿ~®±J¨Š‘*š;™V½âx|G¨ d„?…É«+¾ d`³“evXîßM¢¬äY& ¥•h|ã§›ÿð¡6䂆Õx¯šY9«K¾ à߮ǂIuºc7‹í"¦ç4 ­}-¦ëAt„g™8Ô_\tÕ>—+aÎbF4¸€B‚M®½:B't,Íþâ4Ö ÅÂ?Òž\]ï*EÍUx ly걺Dì¡5sÅ]= ^Ôb¦”kX=2";.0ŠÍýÞsé±¼0òÉ˾ޫAÈ\°lyˆ=Þ. ¡ 9a;Ò³&ë3LÔÆËD*CIß2tuëâ8,¿B÷ vË<ß5¯ùÙ[Â-äuÇ«nr3&”bøë¶Ê&¨j¿WîÔjH¾ÈNÃMsÂåô©Õ÷ã7Èï‘4«Öi4Uˆ(@Jçf „ mßœÍLÙˆîg#ûÚÁQ…ì^KI³êB{RŸVcÐü^ ¦²‡tþM@ï)„@ã Ý¦Kæ‹OXà Z{.ø ¯1¤8¿ÇûdÒ°|T)ƒÌ§ˆµ¿Y1®M¸DQœãT§Ù|wk7wN…Ri¨Ðưõç~Á8U)µT‰ø$Q8í±p–¶bx%jÄU:» *I÷†˜îÊsL ²ž0t,ÎŽÕŒç¡óïlÉ)lå`Êj€ï|ÿ/PÒäÚ±3‹ñãúH ôb¸][SýÏŸ£:½È,¥Uв4™Œð>EŠÁÆtäÓTeÏ”é5uç{{‡ÊöÆsÍYûÊh\îµ´DÁfFÞÞîåÚÀ+še.€î¥Ó Ñé€Tö€~R„zè‘ñfR|Õ!­Š\=\w_f„­¦ˆaûx¨•>Ñ!=¸F°°{XBÔ~cPksà®Pbš‹j—-ûé7»ôƒ»BÇŒ.AضPðmDG邇Ï$D+àÁÜ)†ÌÒœÓKqö”á?ÖiÓ7b¨<,Yx£ÏÕÇ0xd—a”beœ›|ãW»Å1ÂŒákhÑ»ܼ¶4®"i6‘+QÒÂO¿mpe/€'X7÷v´Iñ:ãI˹Òö ¬ˆåÄO{0³Kf ¨GT.{Q[à§Èåü„Õ"@‡ŸþW<[{í•"šzj”<Ë‘a„¤1ÁD¸¼ìT¿¸3àV݇Ë)û=äû'x^—$žž pà‡°NL†Þ"U-‘›cÉ[Y[Nzbè¦R’aµºóy £ˆû®”åa1Ø}CŒr†Óþž:Ï¡:þÈRM:ì]ã]Ò‹µÇ¼’™w=åÍÃ7Ž]K˜E¤ŒÉ_j~1G9©dývŒ«U5iÕù¸Ò­´ùF¦ØšÞGlFDRéžœê…:5‹C§w»*ºò÷@8Ðø1aè`àZ ë^Aˆ” ëI”KüïÓh YYAè‹‘ŽGû·àÑk09r¿©xî‰Wô±JáceÏ ¾\Ú;~?%-â‡éò‘¿®ÓÆíÎr«À¨üØp_ ôfäcï½V@ÐûÚR¥±a5ûºQÙÿ-eÁ¾»ñ´˜G¨®™¤dê÷C}<Ë'©5|é›5_%OµÏbyQs»ƒ!‚eÁ7M³jF(V¬tì ¤ûëŠ[dÃ9œ1lWtB$¸š¯nvÄÙL9+¶àÓОLO½ö &}-M!yÙœÔuImJ"ƒQ¿Y¬ ë=Ê6Pô¡<‚œOËY¾FBð H >Ól2¯õvfùÏM|ø>H09¡·rP„âdå{ÓCF8äÙ©ä1z¬ýÞ?x°Ç%Ç›©]—DÖrIPãpHP>¹³~Ò‡³?Ä+Îõæhi;þÒ×]*–<½lP¦.Iî`È·½_ù”\`Œ÷.áÄtPG½^?–)l¨ÒÒü@ú~wŠ„| §4éÀ¶ŸcAr>"£ ÜIIÐåŠËÆìË^Éð7ã _rDWæ™å:;4M§X1¦=ÄÞ­¾˜ä Å~ÚÙ"œ"qÄ-ÚZ¿N∟ ÷‡?1ÝÔ2GÈV.I¦/è:ê‰Ù?Ç2òNÝœ˜‰~C¡ž£YFúQ:Ÿ©bËÓ˜3¼YSÄ‘òT(ZÎ_aÊ#œäιzš<[w£uüè¡ h¼vË }å«jø§,+}N¸MOU‚;x4ÅP`1µgUrPœ…î¸,ZU×÷nTk$~ª,›á 4»Éîêg¨I‰¬Ï?ú]@=|M¼¯mzìU¸f3A¿j8"ö“hZéâiW(»¿âë•ËÕ*²°–ŒSPWT að ®=™r³ÿq¿’µûªå#., M‰yPo¬½ôóJš^›u¸×¶‚ƒ6ËÁ…[–ü~ˆi™™Ø¨ÚÄoj–£}·â1,XÄŠÖê‰?vð!"vžÊˆsÓ›Bãb‘ûÓÎärŽ™ùgÐø¿½DQœ“Ôü£°ßô…ñýÇ„ÙX*"T;/6½ÞÓ*‰¶¸-¸Úe¡ÜbJEõpèÒ+Á•–лq×ñ™²„Çjð<ôâËoX¨JòÎ~ ¿8ëîů`e4æ*“*i$ë CPrêÜ;ègp+$&’õ ›q™!I’SM] ü°›tse^Emb€r¥£“î–¯_^¥‚ å¶Ÿd~ šÂ3f$,¸²({+Aô°]pÑI:¼–ÕL`?Þ=yÞœß49H¯MR‰ANE}Ç4Úª«_Ý ¦ƒùÓ¹tšRÛò.]¼¬Íþ;aæ=Ê ñ‹ªßѵ!±˜ß<¼ Н‰üÛÐG>ˆÐ¤%ÙFŽ3GžèeÉT¶ù6à˜Â)‹  Â&nuö>œc+C‹ý å̇´åÞƒJ@ƒýoÄœÃÌÌÝNj£žØN9=®Í¢Y×öÝXK vÙëm4c°T×*ÚúPtæ'½;ü½¸¬a*ù]“>¯Õ(彨úŸŠÄJÃÈSÒFZê´è%ñ`{§¼.*“6c‚C)¬ˆs‡®cÜv'@¥ç»ë…+7ëh–Z}– åòóáˆÂ+ycÞKpóZèLeWº³?.áI¬{ã†m„ŽênÉ‹/S³röË–äœû{r¥`q!mÒH©´Å9Hñéˆ2óK/ýÿ¥YwEfƒÜ®bÍü‹'Ãö,:xRv× aÁŸÇÂ@ ´¶‡O^‚&!Ï¢˜ÿHb=¡ßŒÁ„ØÛÙÐYÍ.$²ÏÈvàÜñX "¦©8j\M¦RÎS`zþ ú aZ€™ßΑŠäc»Wæ§<…ΰ¯ñ7 )²'^M_._íühëP{Ú!}oPã%n¼…aLÎ’\@ç´Œ+é92Û_š† ¬†äKõL#8E׋)JðJÈ ‘ä÷RbErÌÓà›«€pcvÃs|®ƒ]ôçS"¬Ã¦»œªÖ@´zfŸÌd‡#ýþÑ™ÀE^þ—œ²ŸCæîB€Ì;f°.8w™¹“'ymÓyõŽÛvªD‹­° ¾$j• О`žÅÅ9ô Rm)ô«!M‹ŠfLû¨(4ÖT÷ç¬_#I¾gbgXŽˆ‚I°«¬«I·rBØC@Rù~të§%L)cõ]ÛN“íÀÛ\"qúÿo›¦ yrnÑiÊ “¿gäHNÌ£µ»Jþå–̆)4}SÑ+aRyã”2­?1¶¨ŸÝ§8Ù¾ >+lƲå7ÿKG ­Ŗ߸íJ Rc® ¢Ašp©ÒARd°·é`¿Š]9½N¾\Ãnå=K M—ÉS×.§j?¦²‘5½BmòÞ Íf´ÆîäIë¨Ê­ÔÍ!|Âå Æš@32j42*€4!ˆ ¼ø¼­)(Ü0év/*Y…i&…Msñÿ½Â­U‰%ªïGÍî2MBŸ$žX¢i8TZ^:(ÆÏÜyZ—ßè†Ë¸¥&¾wr}ü_¼ºÎª·Ÿgx×½ƒaJÁÑB^y =wCðï @*Z½Eÿ—Ä)cöœG뇤F zQY_ÙrÿéUÙä¿—ë‘+3¹ü ¹2AȧãôζT ¸}ÒÎËŒp©ÜÃÛgÔRë[ñ5ïÚˆ ó͘mΰ@£c`ëGƒ;ŽkåI(l¸On.Ù65Ê‹š’ñ\ÐGòÿCu=ެØ9kGèRq0½c›–û×w±»PÖ¥Ä\†ä!p"&t :x4G?2ñGœˆ{ÉDÐ"ëØÆ9z®›ðßt± K, x‹u“%d®æEçŠÈs=dI•¢;Iûî‰RÜ ÷²0ïû L0[â¤r[ ›õ°Qf»7—Í1V„‚™Ê2³Èk[&² æEy2´÷NÂè‘+™öP-¦7C=DŸèJÒPÏÏ,º—£A•y4îÉÂ…ÕN1©™Ããùœ;D¨×ÑsHU¯ŽfüûˆÙ¶1)ÐqPž$Õùü‚ÉÎ f‚Ù:Pƺq;7âiÁ&5oHVóÙþ:“1²ç{Èщ(¦H´±ÔÜšXŠ+<ÃÔ˜Á•E*)àoaAUÚa Ç'¢|¹ôÙ¡`RÑÌþrjïa[{2KMä;d4Ògž¦6²œõLàdêŸÍ ¨$ ÇécµL,6°0y`0òRë6ೊ’†z/ûéº.h`Ò´b7½:€iš¯ý:þ² ÃMÓF`|YxÔ©¤oŽ~´jt½áí/mß[¤š£Š$H—\±ø†\¤Meäs(Ž„Ô’®LÎñ§AFŸ9ÑÑ.laV •ìË‘ 2?ã`½ÚLi¢¡ñy& è‹€;þc”bd¶üÈŠjëùøi€;êÛ¶¸ŸÐÄ qp{3ÅÁ? úX*ämܶÆt Ïgòÿ6Ýê×Lêiœ²ÀÎŒÐßÌòZ‚"ÉØ¸b³‹ýLiš œZXRüöÕNƒ 2»ÈGÂT@}h*-ô”­fbppÎkŒë¡ÆƒäC-÷®q™‰Õ”¸³Az1UN¯o>Üÿ|• (—ö<ði4~õ ƒ,&ÅKñ=ý§Í‡°U@$뀓)Œó—·õ!3ìdræ   a!žu/á߆)­õÆw°—'•Ph\Þœx‹ç8›ìõ¬>›Ü݆b†¨Ü|±Õ’À€Îg,X"w*‹ŽU‡éZÛ¹ÇM™ÜBó”ó€×öÆî¥˜ÎñÍ©(,«(«G3 ùàç <_¨‰KK¤~‚W»‰ }Ã:E¶zñ8°y_†ÚÍ“ËjÀ·.ÇgÛö@>Ð 5Ú4»ä7­ä>Vc§´÷~ïÂbxEcÚ}âã‚*Êç¦u\‘ke¥zËråQdY•úºü˜€Þ%]C*i^Í·û†„¸1µ6Ù«§/Là-–÷áì'ˆ¼ØÃ0]Ú~[šËTÚÄÇúò$¬Þã«MàœñÔ?UUlA°ú4ü‹ŒzxèƒÂ<»ó™U,çHVzGXÉbèÄÔ VË»UÎ)ùžûw$x˜2¦ï¡Âá}JUmÒs=“žÚ”!09E= a cð¦ý|R üYа¢°$逈4_Ôyô߀pß=q^•samá8Ùb8s¸¶±È©¤Ëhâš4»·I]Žà˜_Tú Ë»—ª²|[Œ ¬04^›Ý}ñgפC¿Í=á³¹M¦¥aøýÉ›íE¤ ˜)ÂCs;ÌNëú"ÁØÐtÊùþ¯ÃX‚Twˆ¯½CÀJ²û¦!Éyûí±Ã9Ýâ=Ñåºr ÌæTö›Èè`ÇÄÚA¯ŸËA¸­0·ØÉ =¦Ü—VþVŸ˜m9Ü®’f¼Ïc_«ojÌQkWÂMlõ<~í¸Ss¯®­EË,º§6žè¥7}‘J®jW;¨ã8GU0W#̳úàX™òÀÅ&ºC͈ÒêøfÑÅVuM:0†ç pë¹rsþß»ó»HO"õe‡¸›Ž(cQ¾¦c“°ZJŠ ÛPÝŠ¤Ñëb{íÌ6TÇʈYLݲø'•%ŽÂØÊÚºIXz”oŽ ›<}K ekK,sm3×½ú”~c7C¡16æ U­oô.5ð1séC o[û² Ȇ f@ðÍ{³*9¥kú3Žÿ»¦h¡àû´$Õǰ7læ2Ù|Ô¥T¬‚'i0lÅ™Íaö³ ¢e@KNÇø½ ¼ÔŠÖñ¶~]Üëe ×s?V-¯¶ÎjzCY8{úcZ1©Óy[K’2ù-Óæ¡c»…!H5ÐéòpëH'#_U ê‹ÜÅEð„´/@xô€dxp‹ÝG±Dƒ ±Ö©eÑT~ó _h‡ƒ;‘ÄCj¦ÏE+^aÁeæôÅÝ.¾/ÚIê“Ù‹!Ç`ô.D0EÃDAËEG½5söDZœÔŠ:ÖZEÂvíBþ È51‚ÿ°âË?ÇZÿ,½ÌtÏ’ìæ#¢Þ¯›'Ø­cÅjP˜ÓÒVz¦ŸgâÊ13¶Íìv¼) `¿÷jž0\_õn–ßù{)ðy'í"öÛó!Ä¡tÐ/J¤¸Œq)6úBlò?mã0,[‘É‘ÃîSx*}‹È-XIxЕz±nýÉ~+^gå±P^ŸÅŒuÓp8^M‘,D»h«‰™ë»=MuuJ,æÄPJè‡:ìÜ…¹àbÿ›t¿ãnÏžP¢™P G¯Vo¨Ò«ZÝk¹µMãaãä×Xúöe˜¸ähY72•F®fi;é'¯"¨îÖ9¯t \à¬Ùý˜ÊÊEœ°££«È‚½ÉÃìㄤo_|•pòûð%„çÐÞ"B¤‚¬žœÕ45ïfRT<.Øp C9¾6Ï¿‹&;>½Ð?tù2ûÎpîË ?Œ—ÊÍ”¬ ©±ú}šIaV§ày •p•³½†R¶‡«„ÛQcÖ®nÈԈϖԨhû…²c-¸¼ 3T~A°m>y§‡Möˆhx؈Céù88¥®ßáĘüÉë]¾°Ž›VC³2•ضnTþ\ Bn¢ö \-°bcü‘“´Qu1eGû « ™µ—Lñô­4‚èã~UŒ¸7|t”֒훾0ÊœJ}í³À¡!;‚Dxƒ<,¶¡ŠÇ¸5“%$»Œý¿GÙ'(Út¶ôôB,õ?vzæ‚3¶ýÆèsÌf3à:N¥nz–F ÄßÉ j‘2¼¹ØÃcKØr6Šm"Ré& ‘†‹!x'ct0[2ù Z’ÖÒÝ8aêžÿ“ø×ÓÜþeœ×l¹l¢˜¼Ùaé)pG¦Ÿ.ƒ:÷tóÆ«ªw¯ N ¨Io.ók›¹}/FeäW!i•{IÙ3Æ0ÏäNÙ’Ž"凨 ŸNfÅÙXÉ^ˆy -¸®­Òw}Œj±-"ƒó(Ë ë_`¹PøÄ…2ªOÓÇH§NÆ9¿'0Kúÿ7x’ÞsÌÍ;^^íöÖØÃq¸DŽp/~”í¸‚mf碄§™¦y‚ü߀yVŽl tÔ†YðB î#¡ïfMŒÚ}l§÷¬âgf§§5}õ븒<’€°ÂÿÄ"Á”“¬÷DDÌÙZGÓl=²x9f›"ì^ Ö/¬ýñ$‚d»±CÉy0éªnР|šE…«R¤3ˆ¥ð,¤qJ¯ÁäàeáøÀŸà³1™YgTØhälzí¢Û{ ¼«lÄ… ¹ßQ¡›)"i\Ií½·_åJNøü—ö+¢aÉ;{;ùÏwb#I­*ˆx.VdO_Ñ&ˆRÁʆ‹ä°p7¬ò’b;=â='ªãǺfbºÏ*ëH5QqVjuB1ígÀÇ §¾+r©þ½9»8X‚úŸ> •Ù0td;&ʽYÒ^ há—95Éðå=[ åZ^ç9Õã±»èí縞«5M„ÿ¡`œí1öKç.ˆ"ÀD¸Vë/XåψIëky^”ûíU9ÉýÇ#ï«Dàü©\òüöؕ…Я‡1Ò·jacBÉöK›XR‰ä—Ì®ÝÖ- ÚࡽpñÇ“ØÈM‘p)ÆvûùaQ:Aoù¶ÀÐìO» 1©ÊäÍ*?y,Íy:ú_ú?U©gÕPî/T¨Ò>§'íþs¶!Šðp¢ŒªŽNÓ%Ì<ÊL"fŠ÷ïU¤¾0Â6uBòDèy ´V`?X·¥ßÜ#±#ùIð€þvȯ?š±Ò| ±Û Wõ¨Ëï6§\ØÁ,q èTÃ@UØ^㽘BÃêÿBmï«&R”`M”*eëï'AAË`dèdÕ mýµ=~ç1θr»”Uæ×ZR ]Ê'àm:GÊÁÜt>­&mÓÂ;J ¡q·˜¸é¾ªŠ¢lÄ»²ZO‡ÐØúý|D"62f0$ņE_2ê˜ßÒKx›ŒI´Aþ@÷Ö tìÆõwó±ØOöd¼×Rh\ u‚XLì4Ý(7¹$›1j0.?|3•Õß-¬ièäămuá‘Mçë‹ ú„t.~!ˆÁ¯’­V|Ãt’S{é_é連_f¹tè}ˆYNø©áù™&ºT•á‡EEüô(c.!)_/'ùu’ÌÂQveÆUyÍ"¯_×RPæ–öí1|ËÜ9Ä¢¡ÇònœQŸIÂPüÊVêâ©0.St6½Å±]âç˜þ¼–7@²Dô–X%qü<½ùk:p2 *±œ¬ƒÚÁ$mÏr!{yÈf 'ñõÊ^¦BÁñжg:nwlcîk%[évˆ T¼%!¯‚_bšÖÁÐMä–ø›HpâÌ:Uλ;{ ÍÁ <œrÊÏ<›ÖŽ#IѾDø€ûpß܆-ˆ=8}Cº¯ÄòoZ–h/P**—uн-ÆCÙA˜@à7Ô Vjz:1ÿ7ÙÊ$Ÿ·0‹££^YãR¥Æ™ìm˜ÞŒwòÆ”ž©vÍÁêxjløçùR8…㺩"ï)Y InÍA&»‚;G,7‚Áª€ñ%§¬]í_i7¼¤ ƒ›¶V×ì~Só{xZЮa$á‹Íü™SWŸ­–eøPá+°¹.eŽîuDÜÔhFa¶7¨>`òë–ðVº±LÈ­ôï…ÛqNÒÝ`ðû›µÎy•¢“ª—Ò"ÍZÀ˜ï(lìW(/G½qzÓo$/ËEJÞD¡T@éºr(R»b;o¸*½ŒJËÅ8Qš3ψ„W&½^¤»9 jÖ¢½F©Éx]^ÅË…'a‹%‘rÀÕhwÈ»?w»-¦Ãäl¢¢A³óÄY’TÏöu.Œ°‰(7(iM´ÆÄ#±Jk’†/Þ ÷HðÛŒd øF-Ìù›¥£ü¾I'ÏŽÿA"¾=Þ–—ûh^J)ƒŒ»F›n¥yçôV 7+…Ö[?αTˆt•¾±·H³6èªO Æ’™Vî"‡¶‹0’†.ÄK–Ÿ‰)vð¦èKrÃ~÷;ß»­ùnR„¤k ?aê]­Å0ˆ§C©¾ýˆßGQ:‡ wŠôæjþÞ¤ýG^);{¦9Tò o\‹Í}¿“xZG% 7ÏÀ}W´µ±;Vs¹‘ä$N¥Qš™¼Xžø£¼SÖ׸ª(1NÐëÚ/·â^«I”ÆþÐZcq±))/ÈÿÓwcÇ ¤9‰«º¯êbvhr£ýíê¤ýCÈ(îUG#g¿lY½~9\Þ'Cg/ÿ¸r*sŒ<"¬ã,t*¼Ó–ÜP­jÊ(Tßê¶)ÿh¨”Y ßV¸ ek—0-³ýy!´µòŒE÷£<òÜ/ž7þž-vzø¼Q½¹|‘˜_w=×í繈\¥l Ç­*î_€ÆLÀk‘x˦«ÜJ«5Þv-t?€åOŸ'ð»À ÕÑMä0åh“**½(š%Ÿ×= ˜àÛÊÜbEõ2ñƒÂ”£ˆo÷;‰å !ö:¸§n3­ŽŽüÍçöPL @„„tßó—eÊÊÔL¶ø©5äªSP;Ìòv,X O[HÉKÅÒÃOS²á&dßcŸoGNÑa­“æ$–þ+ö—äægéå6Áœ3ç=d­K÷ÀdÌÛ¿6X%—¯Bœgè«Ò’¯²¹“ ÓŒ˜ºÀÙÉ«ÖW•?Pcãu¥è…“tï]#.>£QØ`©GÜ!„bóÿœ~0¦IS1sTû(ÿvÈNý÷Q~Îײýé«–V %+ŒOñΜ—Ë\ ~W¿ï´ôí?e§Iš¦·Xö>Xáô„¸ k C°¥(ÛOk´{ræ9ÇS[ÞJa¬í`±–×ÂÎ–Ž£ð_žZ°‹¦WÅß¿éÏ&f·¼w®uœ©\„¹ÞEðTÓÀ­Ç@ ‡§Wv[£Yêöƒ6Ÿ¿C¬Úã…nNA\þÈNrŸ‰ŸŸ¶Ã×€h~h€’p!n¶{ß‘AŠe½\¸°`‘‰ÅRè*¡ïgeíªÏÆêbwñ¹d¹”wÁÚuëßXEÔ‡|oF›­ñÀâ?yÇ=Þ9+NàRë|­ï=±èîfǾRe#DCÄ2‘pkž0'£MŒ¢˜RдIR0\óñCêZ±£^¬QI,OÃR‰@¡lª¯v3Ä¡¤0råÚÄîs6`ÔPwrFÎv:>d8(¾¤ý©ÔjtÇ}—}Pr½ò½²ÓÃ÷]ˆÈ¤ñ-‹¿+¹æ§2’QPŸ÷ÈüWW åuoxèºÍ¦ÛZ»¨bˆàòä±yjà—þõñ纖ßû}ϱ¼P ðôa–á #¥Ã8Âjç+èp¸1‘ÑoÔVÁˆL-Pê ©ì·¯Y …ÇŸBeL†ÔTb?O-AòkU "$ë¬$«›µ™`ø-×›E‘0лI¼Ó<ª#Ém%¢%ÜÙðöQ¶}}+«l/â‘À¿Ðª”Ioææ:2b•'hÃ?ø@°Õî쟮ðN[â?"í?rŸÑ­Ñ;\³]Ú 1ñ÷¶³³è,©y3ÐÊ1É×J–þV9„žŸI}t¹¡§YëÓ%°q6ê\µ{E>¦°¿Ÿ¸=ñ*©§˜¸}Ll­ÿyÐEÌÛU£Ô0q,ê Ò-<¦’ O –ßS{űßë™!w”»èM.WÇ¢½ 1xN9ìB ±óÜ»ÕEN|_®wð$õ+¬«e*p42GüO°½u\nðîyô9zÝó20×øVÜ8î»·]EÙ=@ðj |©Øšñ汋¢ç5@£úLÖ¥vª·7༠ª± ›ë™n­¼ ÑÇ€ØýÁ­”Ô¿™•úÖ»øTÊUSÓ]»¼Ÿ“ôP¼ŒßÕêÖ óÓÆùë'®M_)‚qAÚAúÈZ€t*<€ÏwîY­“ï-"w£Dú¥1ª:¬ãÅÁ±mJFu*öåÏ>ÿ@é90Ý„vèB€9Uy4RTòE)o¸Ô‘žWèÅæÉöW!HZ«O>nµ»¯k^xi$ šÃIÖ£Q "fÏÅÿ#“X¾C ÏÝ^Á*Ak†ÝfV÷h¨†ÍŽ#G/‘ÄëJGœ!n*ôG±}µ³6ˆ¡oØ÷C½€Ø©pµ³ˆÐå)yOÑ|ì4r„Ôm!Xƒm2&ʪ*vp(—ã»7—’†Äu ýY7ª¥ñ_êj|çq~jzŒžb¶¯Ñ¤=ÈÐ>1ûƒ[¾æZÓ6HÐÃëš§k‘u ÓK矱ÝçêHTÞç.ï½UÝ^kêÖ'¿Ö{iñN—‰M#¢bûDjDVC¶|bñ+M)Y)Ý•H1Î2ÐüîÙ“Y“„ êBãž1…ÙvÌÂFù0l–Ä£³õ³} &‹`/ÔêTbaíÖO¼<ÛÞ7§ó¢‰{*éò'Íwr‡òÏÿ;n‚à 2N¦ÊwêöŒ68¡ô¬¦³\¼¦Á¯o$µ­‹º×oRèMX›]dQ¥ÞnÚys›Qš ƒö@/ÑÖÖ€L¯úïwg"à•~¨ïí#ú–Doš×r ÈNÔÈJ )ÙÜŒ¤2¥ áÊt‰Av@ßi²!Ç”—ÖO"fÝ#2Y3“; w”Ít´"{Àxm2°E·'àÓ}Y‚@+‹ÒY¹ ¥Á§j„víüÂÇ@/ÙÿìE”JÛ)dÛ¸‡]®×*¯zz,Úõ§ "Ú6CqõŽöá©´/~Œ³Yà³µ5oÚ÷¤/ch·ÞIŸÁÏ}‰’;ƒø¶§ØÌƒï+¥]buó*i"‡°5 Ë:¯¨üäx¶ˆ¶OðŽ£zsc ƒêo4ÄÙ%:j›Spf Øcâ£ã{ ÓS7¸Æ¢6¶@´ÌG»ÌOÅ.òo!U•°2'|áä—2µ„ëß_q À õtNߺ@4’Ë€®BÀN_GHÐÖ^½ù4…£G¢C¹/d§{<ÓŒ½Ü¦¾)ÝŽ>¢ò#>•©œ´ 1 Ô¸¶ Õb¦uÚIáuäŸamX¶ÕÛ{ð]È[Š»@\ ô&Ueo2îŒÖ¾«sUÂye”Fz¡?=â¬Pœ.._™Üö“niÅÜ»~¾eëÅê’×ÄÏn 6¸»=åû‚Šä° %™?uÖ“ ëY$Ú ­›$)¢_©é»œ¯8^vWÿœ'ˆŸsQ±°l´0}Æ ÒÿFçMü°XKK˜BgQ8è¼…óáH¶$,Ô–ƒ² ·ãÑ„Æâ<~õ׿V÷·JG}#•B¼ÉX–³¼ÃQšUI~¦6PÂZ›‚äÕÒöµÀwÿ”èc=¥] ÌGÏLï /0Þ¸§\·ðü«¿w]‰ôÌ-¶Ÿ¯'DÌ'm/ý¤`*¶0Àd÷h_>!•¿!2Ö®,K•ÓtmŽæá+h3*þ…‰¿ÜÂÞFçij—ºéÁÔ9¯DV^à<®~3{|wR{¤ÊßV¢ÅœUUA_¿þgã‹hÐäT&|]»hà×%P4ôάزen u¿'1Éþ®@zꌎ™šßùœ-Á. D~Á.ù&÷=Üm>\D2`ƒ&š½ 9E¾&lwR~ˆø”¼ UÐöážCé3¡“ÈY•šD…2ÞüPkÿ [WeoÃUÕXá½n<+Þ…©›X×f8!ƒD9l WnšR¨_€ 2Ô„Ar¢JÔ?òqò©±fÆ.ŠE_R”WWf²³†…±èþ;“£©ô &äÍ\$›å&6ØøØq ÈÙ8ç÷LßÒ/«O¿¢ïÇœæ}wùk‰NÛM—Ù2ö×4ûqP§‚mô‘eõ§+LׯBéž<¾tFö;“ÍmËün5}‚9ßïßÜSÈlÿFT-/'¢¢VÀ†fî§G•åjViÐ' 6ÜÃÏ7Ì.$ºâÔd¥€xνOÑhÁ¥µÝ«Ðç8Ç%”ðLôPOºá°}ûgˆ8~0!å‘3Ê ŽN…ö]pÝÆ]²dÞ’îu*<¶O·\€ô©”e˜­ÇµæDåÓ|al?·üõPöms-L]8>–^ Nl™Žò¬SñãÆažPü ÖFÅ,í鉢ŒÆ¨xÊ÷©s€Bx¡¬+gôšž£ÆJ|Æ@‘Ë–F¹¬š°•ÝL‰Æ]ß5·ÚQS3œ;<{q^g”}²˜“Ú”C*AµÄ;¦ôÈ5ÅïÚºE–÷@š0& 5ë9ÐDé©Vxî7®Ð!-O‹˜\#§ƒ¥üà¦pZ·D…+/žZH7+UÆ;|ãä˜D2j-‚ÄQwð—Yà¡‘L¥¨¯@õÈÅtƒnÈؘi(íŠÏvË÷³à$ ÷%VùIJ|vƒ‹6|¼&ã9Ÿe;Iq²·çƒj# ¯k¾†ª}ȇ MÀ”D>É‘‚‘È&ôŽÙ,› †R ÿ×Çñ RùgÒØ{–°mÛþ‰ºœö,ºqtØ@Ä‘ÔUëqœ1Þ6ìjI‹%*üÒØºYîšÑeÜ)a°ê\Âp:xµÒY,Kë„ÂÉ&,bNí¼b¦V‡Ÿ ÷ÃŽh3P)a^S*.£Ì× ztOt.dè¹~õ§ ,ÍD=ÚrOèÂ)Ò^XDg8—]!¯º¾˜Þ?z<ÒRŸŽº‡Ê%5’ ó…É9^#Ñ×à³ÒK39 3óðªó¡|§Ç0eµ"³ñÞr]ç’¤]&æ —{V1ˆßý¶ù¿Û'&Pk9\¶óS`,Ó%kÚlþñZƒz Œ,²š¥ Z ¥ø»YùTN&FØÝqœªºU…ïU§fg$Jr‡Ñz “7ІrÿÝ|þk¹l‚·bW¤ GJBÆH¾º¶¡€rê¦Æ:lïÝŽ¯OyYªt©Ù$ë¼ y$ƒ¨–·Iõ°ÄPoÚ ¹’Åøö“y>ìI`F†FÉiß2ü¢ä£S—^‹½hâ&¬Ÿ—¢ÖBA¢#j󥯖é:á(Z9E·™ Yª œûgÍ̘~w²\LD Ÿ˜_¡`@á†öBË<æ!¥ÛTìˆ})´¹ó$ `»8ˆ¢xûùrž®×<'¹’ÏHd„Áu¦…{š£¯ðY%ï~OXË ,ƒœ§Çùuci:ÑЩ—#‘˜ûÕ¢gv'—}œÌ‚BZ§%NƒŒÎ¬4éžÛÛóê²Xþ\¹©¹N‚o§ÔÞuÔã`n3¢‚wÍ¡8©1#t°;G‹)D']Ð]=˜"ºÛG|qåá­Ž¼‡©Ê”šsDŠÇÞQc 5?¬^h1õ¾Z.1y¥½O _A.¢­ Väk †Ú‹úm¸?C¡S| Ùç\¨%Jˆ0ÓEW“<† 5^ mþ°eJa F4¡‡ŸF]9f‰?lê³Ë:æ —*—á„*Ar?!6ß}ƒÑã2Ê4;¿( ‚}oYKFV'þÎf`/Â1©ëÔô¦b5bþÄh–éaÿÐn7¦ïúý{ø¹‰ÄC…é¼-]lv ݰ±ÈÈ™ý¤S¡»Ç«ßÕäŠ{°DŸOD';KíJV„êÇ4ÜFœ#·Që¼ÖY¸‰ôËY¿½Óܦ½ŸöSÞ•€Ê9·êƒõÛLP‚/pZ¡eæ}•d…q­¯ÍÏyæÎ(YLGâb-ÌPG&Þ&pj\žØî¶¯â´Ý?S’²R\B€tfì‰úíÆ…4vD`HŸè-½fÝ»Ìe„8]ä}"xóƒú<î;ý©ÏZÆŸE¦¸…Öȧ¬Ò§T‘@.IcyG­/·ÅC â×7o#dWÚc³’/È#„CçU˜æK BáòÈ ª2Ô¥t™$Òuö10\) YWhÖGÝM¼shHa„ •›áehfƒ+éôyF¼¯l‹ÔââR>êm`ì“Ví1iw_ ,+Íß\Tu cصÍùY\,pm•Âë0:ßh<ÏnSnù¸˜ÅŽtûŸ—B¿N+ЉÌáÀHF¸« ]¼%µËØf“b´’Ç,åƒ@G•54Å!C—pQ¹ËŽs8)¬_F]éQ=H‘2Šþó%ÞÍRìñ~¸S©)óR|1òºm.1G—¦gňß'鄞U‚i¾ÄíWx–<2rþU¾evòŽ—‡Òþ”SƉKÜcŒ;ûn£OäѺwÈð^¾:'co„…™ê‡ùú¿vÓ˜Z^‰ LHö‰aFøý‡©Ïæ¬È·½fܨ(Ù'­ãd*8p‡™yÑÇ6 e+µã„ä@ã[Bµ¸>Øó f#”+ðÿ‡w­oa \Ü  mβÿ~ Pîãg(kŸ]óQÓàz!O ˜•»ïVp•^~ñ3^P¦æuÊ-C‚YD3QU‘yç?@©ÑJV§B1ãÎÆ'™h½ÖŸÀéÇ\z ¾ÉS¼¯ Ó–ÄFNKV˜ÆBlöéîÂ+6“ÆÃ~G@¡6s/Ó¬F§5ÏÐüȲ‚qK´†Å^Áž/ÚÄL±AÒ¯‹½ 9£ŠõE Ú®u•#ó-Gâö@èx±’²@QnèS3~k nƒÉshw>IÒá±é¦š€éhë{¢qÅ;-S¨x/Öêß-“¬qÈ‘ü¢_2ÓcjwoFÜ]›bx°±iŠÆ‚÷{"é£0ë…Ñ"{Vé9!Êm†B²xZŽ,”£yþg8 ¸]%µ aF¸×,=n z urèE)<“¿¶´nÍ>Ž˜œs%lò‰XJPZäCª¶Û5 tÄh…kxµ¶ã H$¾Ù„âýׯM™M¬v›*ƒŠØ#A·ÃEI! ‹}Ÿ½ÀÞU%,RQAŒ“]”•¾[÷£©Zá,¶£RLØ…’ÚĦá6mÅ}_tD>YŠm±óéÀ™7ø…x\Äð§/G5_ Í‘íd—TÈœTˆÕpÎÕ-Yöý,}WÕ*Ç(€¿MÛX>¢U—â(_bB:kò[('à’®Á|Hô³ZKq»ˆÞ8mp>@Ô~D„&iî(VÎ&ÅÄøJó×#i]x`ŒÒÕMB0ø©†6C.݇'†]µ€ð‡Ë®ñ ;÷N¯îY[AÕyˆ`éá @4/Ž>«½+’ 5‘G!é™!"WKÂok\N™Ê[‘ßšFÁ´G¤wïT“2,KÄXU Lg5§úôn8GzõÒÏ6åO]ñGRÞ÷#ÖG;ˆd€§ Óu£ÁæQF¿7T}8ÚùuP=+rˆÌÁt€IT˜Ôbàyá6 ©/í$£Öo¹á‹T²¼Tu#_ÆA:#/šÅ\&a0É,ÌÁÜå°A;#ÚPúà凯<¡óª;;&\pãEèR]AØÅ+wi{ˆ×æ:0(y>ú`òËøfµ*œÎkG&!¹°’01!ÿ T¹‘ê¬òÚÂ:“w¡I˜UïTÛ&ŠÜBðò ô#‘”@H¸¹_U0·a½Îv”BÄIâWÎШ±ávH iÒÖƒÓ¾§šÅíA÷?™ŽÖ8è˯Hœ*7ɪlnùª†á£Ç¨ÚöT7c(±ñm½êxœ¿Ó—sÊ6:®nDHO9p˜}²±†. xÂ9d2A¸b Ú~†ñØÇ¸ —ôåSBkatµ<Ó©­Ìã†ã%º—‹QËm7V1´+Qmüûƒ •W«JºY ãf­šR[hæ™´ËRnMï)?«48¼£[&´nq¥¦§G[¢ñ*Ã,ÑÀÄK¿¦ÈeèÁß Í(îz£ü§i×Fzò“Æ_‹Ö}jJf«½–Q ‡3à¿(·S0%š çÁldÁ«cõ5« wt‡æ Ä¡2T5ÐåàKîÜàÔ8Ë«ø£Iì«/<õ ƒ'9â©LÙAÿË8þa–¼a¯y! ÅÝïPÐ÷~<±®ä„zÀ,ø¸TaÊà¥]¬DÝO> 4úA‹ 03ÌžªÀÀ¿IåòTÝ–e8”Pé2..°ü¦R›ÊŸ+!*Üð Ëœü*ÑûµØ 1¨!2|«AÑ~&*ìàvl.9Aí¯ÈÓ¨? Oºƒ ÿjøw;Ir”‚åôŸq; D«(I4ô&d»§ã÷BÂ~…Ö"àù„k…ɸ]%$µvΖã'E“'k~65r.ëFáý°½Ö°Néd›k}hÆs•¬­§\ïÏÆø²“Y5²ÑäO‰¶ÓÖœGq+‘9ˆ@­˜Ü¤&+î1Õt‚Âêr;6ŠDLwA”k8·±pP Â“÷Þ½I‚ÌÓgµW“ºðP1cZD•Eåm“ɺ1É#LÂÜdUp&—ngäp/¼c^髪OëÝ7|Jƒ µQã÷Ÿâ ªfë^øQÀͪG^¹œL?¸<_Œ íåô9NœqѾ©ßŸ™Ö7BsÔ‘CK/¬$è+RäQuôóª³ ±?o%Ä%‹‰Å¯Í£íÎh2É>þiÁµ†Ó,ë¨,U§ÒVff~ò~›æ…—hí¡º§¿Ð æFc¯*ÈŽ"]GÚ?H; ÝU¹îEbùƒ°Rý}¡[HÁ Ÿeæ²S=óÊ¢ˆšžòÊþôËÅ8íáÊ’ë—˧ðÉ´šKÈs.0%˜Â–Ñêdº±kŽ`ÒèboÐɈ‡Øh4œ™'1KíM‘0¥ãA›Â´7õ®‰Dþ¯ôÞ Ks™+;BuÃÈ­&(>æ.NÛÞ\t2‚áLúÐn˜<¯a6ÚÑP= 2:J±šËÆñ^º³„~M H1‰ü4iVPsZ÷JŽK•j]R“}s²UÏrSo\Pår¹Íÿl¿â®G€-öbݨi.byøüæ³ *(êpÇôU˾ß2£_s!FïM¡©Ä6yœÏPÀwOŽTÉkwD{¾«ßYgک׌-éA3§‹–<Ùw¶äq¡ï8í$:y€ û¡éš÷w(sckÜq®Û–H¢˜a‘+smìFزaGéŒë=ˆ ?Þ‡uqp¬÷qP9‹…²àŠKÌ” P ‡C¢È"ã5Œ²ÑŽÉ`¬´zçWŸÛr`aê €÷z3¾#v…0/Ai¼6ÎÃþ>3Q<˜–$MnÐðFú°ÿ%ŽM5&Î÷´}gŽpÅåUÊúÅ aÖì­`<÷JûÅX+…¿9ï¨vz ;ês娭`÷H<4;ð³ÇÂ%ª¦× †óDøÈ-yTæPÍÀ cÂc¥P‹\‚Wåû&ßµÉ楣ÙÄLëÞ6»ì/THÕ»šÆE„Hñã *ñ¬ø¥n ÿú~hÈ÷±rá²#I½ˆVÉ»ÐúOÌ™¥þXkÙº3;mòЮü×¾oøº¥GaÝ™FˆÆ™øÝÙUÀnÊ£8ÌÉÕ县Ü÷Ò/yÔÛOâŽáÅ߈B× ›Ð»>ÍVpÉgÂ5å%™ÚŒ«¥RÃÑz\jBt]LÅ¥÷¥Ä˜„¸rñ+BåŽ(—;ŒÆ_‘®þÕ©]þÀÉWá}¿ÈŽðÉoÓ-w¥E;Ó@¹¨F=³}Ì6˜¯ÿ³üÌïŠYð01^QãAnÛöïMÏ¡’¢{jH#¶ã-f‘gc^V(dó®AA–eÍ3&ú² ÕÊ©‹ÌPºô È,dìÞ?SÞ×f:@¹'th0˜wÜ2©þ#7Ø–›ê¦,š¡EçM'Ò©•òÍ14ôrV !k{c¹/f]ÿ±';ONŸâ²Q…«ŠDPÇ z W “òJV”4ú˜Z¨n¦“JÐvªQ'VÊp"¢œ¼—ö”ˆËV`G‚ £ƒ¯âRbL\r“èp$A@š^«R²s±Ã\f±Ö¸ƒ@¥¤]üݨæÿK¼ËpzXFØÙ&{ëá—ÖËè"c5°Å–|×7ìSøS^ZF$ÄÞ?Mý-IcÔŒ¡*ç©ð­˜íä®c_Ï2¯1ÂCº˜*˜ÞÇ*¦þ èLƹ¼¬g?r\qª;“nJÆÕnt¶£q´±¨¥?“W‡èÚ2¾æ-¯È¿Zˆa‰—¾ ›T>6 6'YÊj‹Ð‚2€.åÁÉ ê°p­•#ˆú3yÈ`0"ÄMØI©;êl¦˜ Ò¦95x®1“õP2!éì*4gÕz{z`ÏºÓÆÐÝf-B[+”K‘+ØA±‰6{a¶ö„GûãJý7“е ¡\·úï;܃D&ŸkKê1ÏÝÿð•°‘v‡ïgvÏÈÃö‘­3_ü²ƒk§®B iÛÌ·n*™uµq¥v–1QTŠG=ùÍDçE¸줅F¢¾m{C„ÛíLÚA^©`¢gR{´Å¼âõVÕ¸ŽÀmDŸÉ´â­Q¬%ñD@™ºÍJ²CÏSì_ÎV²µý̲ô#Ìaì„™{Ÿ!,õIÙW'>ø”v4¦ö§g`¡­BÊ$æ7€Ä]8­²¼¢`×þÓªf±wCqžB˜öåo]Œj-|®Ä-®ßÜ &­PJšŠþ z3F|©"ÛѬ«d[Ž"ŽWAòrãeãA¥ü3üÐÑFYG»;„´7 ¿Ñ30 €3BÝäàG#¥¾è´x”8(’ÒÁ $ »\S/*ö…c<¾ào6ÐîxJçÇmn,—¥CLÜ%YThùŸ û•Š…F¶h`Í~b“t‚Þ·~Ì|™Î9Î}Ĥ$D×¶ùy˦ïH %öø{¨PÁ%£@o9±Àpp/t×r(èþ¯ª8ŒþN7¯qçW½©¯Â,|.,áJoøJ¤jº±ºWFŸ9¨jÂo0ª·ÅdàŠ#º$SOÙbߦJäø•x[n3YËòmÍVqéZ¹'ý®Çy¼ž’EÙR!€HŠÑâbSc¹L&À+Ã9 #Þ²ª0X+(èöTÈfu„;™bÖj€„V]ƒ«ÚÂüÄ!Õ‡r‘ºÔ\L¦zŸ §m~læhL²ÓÛCf´ýX•¨Ï±ÒèùŸÃ dàFg:r7Îîì 餻´Šµil_Ò2—Qm¯=»"¬ ã³ÍS“)R<Àò¦ŸxýÞZ'Õ›iW½õ½s«¨žõ`“.i-¥z¬/En#¦g<£¹‡ƒ _·Ù¨mä–M¶ø(Egî EuŸ¬ƒáàà…µý%’±$ð•©u!ߨ”¡‚9Šký†´^pNr›ç²I‚ÐÒ‚‘匇®ÔoÕ1;P-cXGi*qàT[k„ªëÇ'Q‚Á‰ç42#AÎxE:Eç_Þ3Ò©H°Áæ™ì¢4>cAD¾Í:Èâ³à­61íÏ÷}Ù)üÇ®Aææ¬{ß¹±P\¢8D7í—¹ëÁÅ%~Î主ۡ¨]™6|ܹG·)#z#íë¨ÀQk}Lµ˜,{É:¤b$áNÄ;kÝ;¹<Õz Ü=v£=œ°„6mVÑþYΑuoÌÖ#t7½ËöÃÿfé³qˆÈ“¦—ÒK_(¦uÕu(7"ùÆV¸SpËMJtÓWÅþ/|£°|ŽŠ’±,G£ ŠoR)ô½ƒ‰%¨Ó0Øò‰â^Áq5›^Ü¥XÄÆbg#kÅzü9ÉN·úQã´ÌÚÔñgG ÄÊØ$xØñ´>išr¾ªR§2®; âbãÑ0°ÇliK§3Bwj3ïñ”ëìšîì‘Qv–¹—£:•¼Y?X¹—{#‚:°3—Ðç¶¼2Cé0´—P† Þ4“¥Öal²æYÉÔh;‡âX0¾IKW”ë:ºi§©°ãg5qÑÛ¸ *p-z8 }’Ü =-mÐ>Á=àÂfUkM•n±#¦ UeÊM–È¡ä¶RöËOtó>ŽwüH¯ŸvwÌõÁpgåÖ°j¿Ö}½wîòr^´=æf–¯1ÔE¼ÐäwôçÐ݃ïÀ˜ÆÒ·$9XÄ‚4Ù±l ùê ‚Îôª§ïÇk—䉯Ô8Ê Ï7I7=¬tÆSÊq²åoëæÍvlö(…uΦ&¸ú×çÂÆŸ¼Ï؇®á£cû`ŽRw‰ÇNV" .y*?ÕèØÛÀÕÿÐÐvZi¶ïöqî®"¢'–F¡l i¥a|5bxU‰ýÖæ‚kÙ@Úf§èÙæRÃVÔgi™{ëԱˌ¦Ý«[® 7‘rTÛ¤tþvCD¸^I8æå©ó80¸â &øÐ«јŽlØÅ%üÞ©xÛ5ø±öÅM¿‹ÌóÍ[éì$là¤ÑŸvÍŠ­vå:'è†AÚ¿šÚ;hz!ßÊ_×â £ÇI¥è±OSä'u ® ñZ=ââÁ‹}ä+w0´æÈ¦´¸ …H,¤ Ölsܘh.K=ÞZnÄŒhE‹ÀmV¯| ÖuPM<#c-Ö'MÞsÒšçÚÄW€O]žÙ›O$íŽcžIÚPoo¡½tk}—ΘÂ`«Ž\è‚ò4TÈLbÄqMúÃOù«à]î£äù¢ÙhÃ\Œ9Œ=áXI‘flÖ‰’€/I•°bã"c|Ël•½ÌÒ\ôµ0ïô¯%±LâTZ) ý¢ÓËê–?IÏÅQ¤=¤t¸G™ÐåÆïþlÄ ²¿Ã:s£#·¤ß9&Y¹Ò²RÏF­1?H_0âÏ„¥htÃL@B?éå5—¿’wæ)’!<°,·b ¶c$âSÁÈÀØá™AB5’ºGzæúŒ{!«J:3`ìý8g缟Å0ƒ©·µéNn!KLó_X`E^ký@ÈœK&êgɯÊÌ1[㎠ìG¹qüþ‰„ƒÔˆ–üÊeÕ‚ì;ÓïH'=Ñ6<€’·÷;î˜0Y7ñ]ý©©ÖÖ™¹ÀÔÏ"ón6µRÊ¡k%IªòPÄÒ¹²ÝÑã ¨õáSɃ'£c-¡j´­÷gKL‡ê¬á“òŒó‡uØmD­´5ËÖ(îØËuã¼yŒ<"R?ò8Vq^…h<ù¿õ —T 'K«d!¤¾€¦ %ШöðâB_570Î tHŒ2õ±§«s_SA¤ÁüÏ,ö@@U šPüíd)Ž«†çŸ3Äà3,z©Ü“‡!KZñ3æ¼ÃâNÏh¼ÊÏ7ŠhwŽæw‹ÆØž•qCQ0JÍ ¢‚! °Ô~Ò#Ñ¢¡|ðû;ˆÝs%ÐEbårç.ŒÖ¤‡½| †™ïgG3ÝþQ‡ïÜesßw±ª07µsö´0ɤñÓ…Íodùøzx“Gç)®SŠ]ÍØÇÓ•ʶît¦Ž}E8Öï–‚ý‹%\'ÑßãJ`ôþë²1ììGͪ‰Oš†ÙNGÊìÞ®6r…ff±;ÒI–¡§)½•In~P¡¾„Yí¢×¦V½MA°–茫7’h ÔpLG—·.œ /²sÀ`œ0I+#€ó©`m:c÷ÙD4„ê2e¯0kÑînr±öQå¡1ÌÔ´­z?SPóCzì!Þ! ò™à›”žÛÌ/Èz†`/µŒ„ŸZ=Ç&XdÍãÖ\êÍ8.dãV݈S‰²SÓcQu~©+œ("ÛàÒ¯’alûÏý—ŒK².ᘌï"§ˆ”Dûú\hÀ%Ã2‘~ù{6ÕpÜM þûõ`Hˆ%ädÝZ)´£Æ¤Tâ®!>ì|$XÜ`¢*•%»÷'Ù'ÄÁ1Ez1ÙTgC;Jw ÃÈM&ø‹†èb:áñ g ÷‘Ã)6OdŠôùxåð¶7Ýó<9?„ßF>¬(vv7—4%×mkqdÎ4|aáf‘›'XzìžiãRHBä¾F‘G}âxŒÚ¯0-4¨+oÌŠ÷–2U€9ŠRøÇe‡òÁçc–.ç>IÊép /ô¼ð‚…1•É_JÌ@ýsLòN¿çW/[Üt}m©n™* ¬Ô«(g÷o×ã9‘ú®ý0„޳5éÅ}Wÿ]ܽðƲ‹~]Ù¤“kÁa÷î>_wÕVÀµ:0†úÊpØ–ÒUå+@À¶íV€Øi1ÐÙ“ Äq@"Ëh‘Ëô:o[éVDz'§•oûú§¹ÜX¦Ç½)^’Ü©Âàëî?…‚f.9ÕFqÌÐl/œ6·âÎ}p÷ÿ=I ìÉS§ðáî…‹ÎKÞž½õÅw%æSåNóµÈeÑ~z¼%DKV×»GÕŸ# ã½=æ±ø4Ûc¹t×ÿQJ:ÔBjR[¶ïx¾²[e7ÞÔ¾›xcÏÊtÐå y†cš¶Zž‹º~-)^ÞÇ«îöv]y§FÖã{™LšY Ð(F¸x™‘Ä`ŠÉ%‰"k´ÓÓð¿äóù3q•ù\PB)úÃÿy÷‰¾ âhVYàgÁ~;Kÿ.Žöø\žGÝ3],Ú€P£Ów«¦ÐÁøÿS—M¸lôÕR ­eröÛdpÖ[¾ ˆuCñ@@ûao ,Òö—)Z À>?óÔ.ýgbšgÖdH ¶5¯n–ìíù~Ppü>1kbã_9´ITaò.RÔËÄ{i,/Í6»€TÄ©ë>KPx¨ã±ÕŸÄõ0åwÈ?ïM³°Œ-P9Ï  íhB† RQfIëÒˆŸ•R@s«Õ\h é‘kÿužPzoAÁnü0‰ÇßÇЮ5+\'ø'Â'ž³hÓ÷aÅÏ)ÌÝs¢,Áj%‚5;âÝÜ7)ª‘{™èXaþXVÿç~­!¬ Ž¡Ó5ƒìÑJhQ û¸Î˜Ð(-Ö>˜›ßøÍ(el;Ô’ ÜÓ»Ö}ŽŠ ³±ÎZóçŒQ&3!V&eÝÐ[hkxË]oK[¡Ä ¹È*¤!§Çß6PJ:‘ð›ÒfퟔeVXʼFXú·?.Ý`;˜n"×R»„\¢-]h±ž“æuõ€#ØÆ½Ü¡S}À8ø±­N‡&òØN¼ çù¯Â`zÕyšƒSÝfï×à^¡Væ<¯.érÓ¹"=Áò&©Âˆ£[ø¹iª¤50ÿ§¹å“$Uba(x M@CÿۨƢ” ÏñÂd€Ò‰0± ‚Ïí GcŒyb¢|WÏdÒœ¾ý¯ã4táŽ+¨¼êC Åd+òÀ©¿¹ø¶óU¥©xØÙ°­³ˆ$îí‹ë"÷R|dŽ‹“êy䮢ÛõM›ËÒnâ­O9)qkx^Ìa$3`†µ ÔŽÝÛ| M¥§rÀÝXŒˆü`Ëuþ1^É2èÁý"ŒdáYð¦×õ›‡É›l)™¬CF¾Ý¡—D…a ç:­54Ùß[}€½ûS„JÛÅ`†Ùl®é®ÃÑ›i¨Ž …Ó‘|äd¤ ’H¹(aŸÆµ7¸ùb>4tØóª[1— xLN ‹Ñöþïà:]±peí£‰C<ûêø.®·«Å’³–Š¢tW¸LöæÄ#E¤J4,hw'|æìÅ„0áò²Ž :^ÏÅú|]âYë°Œ?¤‚#2öí¥=³ƒ Ô˜ < RïÚ7М_w_ÒŒ‚´ó¨é EŸ#ÉÂïÛœ¸KŸëâŽ>ïsàCO§ÄÄN4ÆÔC?³OªÔÝ­s•€×ÊÔuéÄ(÷ÿ€Ù6ŽãJŸZHáËüµ'áæn¾ößÌ2ïªZ“ÇÚW‚œ!šJY Í”ZvM®È?Dæ¾2©ôÎŒò)4é¡,Ì0ÜãööNÌØaå*n¤²½J·ÝvÉöLBýöW3ž>pRˆÊŽ~šE¡&3îìý>W¬C…\GzlšAÐoӸшf ;o¸ˆà¥Ø9§ [fmªAäxéäeJê¾ñwË…Xµ„(®ŒÖ(K,DiH³ã72i¦Ì9›¯¬ô¿j‘*è…Ñ•r…iÜ. 6Ú3pÜã@wü–±?&å¢q6ñ»]U¦d÷:xÎÏk6EòÅù°…ðȃmÛh¨þdÂØ¨Ÿâ¬g-âD¨X’0ÍßÒ:”  ?|ôºýýü¯#³qÑ:TpœëÛ¿ƒ=á™ù)¨‚-p>¼ü:9ÜeÒ§KÎv:R¬²'r|]%ËãDÌHIyÒáX8¬9¤Ï{Õ®\ëúÎ\§VóÚÈþ¬ ·ç¢R‘R`" ¥QÝÀAÐx÷dþ=ŽG¦Ý5ÇIYçtdYZ“Èk÷þ¢®{Ýéõ„c[jÐ]*(¼ÀAɮޡŽFm†£¥ÚÄóö‘KŸ½ì2zÆ, üc4à И}íÕQσPÄö~i‰I¥1“âwšº.zÜÉ ¼¥QÓV™òÒYQ^ÒË_‘™n^²ë•úÿ+}9ÿ뺚D°™˜-µIóØ|- Ëû±;Õ¯OæiÏúD|옑nÉ7É ¹ G4G˜~=–ÐK°WðR=f.dS÷ƒ'Ú‚P`t :x¹¬pËà”pGTµ3,OS ?ž@:€˜S:Îkå¹lV>œå–†€n’G5†øEsNÜyœd2b üüKóØÿ‰ìBâ îo"ΪÂq#ß1+LÍ]Å@C¨E"Úó6ù×sSQ«á\„ÊuôR¨?~ q}M ×É–÷ô“0 p¯°NÚÁã&æ2ÑpÍÜu=(´6®|šÏ÷ÉÄñÔ#TÉqGÉPtê‹ sÉ‚>0ÂÔóáN<­ÝsÏ«Èexyw’Ùzœ÷[ü1öÄκCêÛÁ²®,Œ>¦¿fÅ%HJ-!—ÔõÞ?D…*Ø+uƈ¥\Dµ6¶7‡ì=á¼á)¥‹ÏÌK©”ú(ž<£ «»ô|3Ïbyº8 mðÃù¾2ͽ]¡ 3œAT`$Ðñ¿ï@ˆù‰LJK@Hq.aü²?4+ì“À#B«7ÓÍâžá ¦êU,T¤´_³…Èžª ¦2š)«ïÖHMùý&æ({)¯•]…ÆÒ‡6Ç{i R¡í;1çRVµI ea©¯Œ ?k,gêâ¸y7ò/ç:¼râ½ ³’tá0¸íVïéntŠwŒÍ¤‰ÐÓä’R5…„®­î˪"³ßÕÄb2E 0ŒE¡Q*Ç­º»Ì.ŒÜ;,ÍGé ™Éá®ÀçÍí ígZKkÞZdÝ ¿Aâ÷ÿWSBŽ3œIRMàÖKó·Ò˜4ÿÝ .C¶PŸ[ç²±Í#áÚ±Ž*è{?tfÉ, ldåI¶Tf66á 2Ìt'ëd_ˆo›Ahþh£×$sÞ')‰ö;bÞwõW\¼6âtƒŽ›.j/ûÛ pùà¤Ì UÏÐÒï/³‡€`?îÀY{Üá4g?I¤Ï-Ûec½éîúÜîŸù7iøº—ˆ^Ûu›q7Ö.Yö)gšñLNwÖ ae0Õ{Ë_”ÉЖt‰V‚üœr'ã@ ¥…¤çÆÐ`EazÏV´ä8`¢ùº†’ÜH˽øàFûÙ´W² .L;žª,¬fó,¾QlÄ:* æ }UUL,S†^_§9Kk‘¤ÉE|fMyˆM„FŸ™ 'æþz€ðIj<M®¡nÊ͈¥9ŒðE-¤JBì­7Ÿïx@æ =vãqb%¨=€óû˜Ð[žÜsÎö>ªu_§w{³TcVŒElé·òKSí¢ž &Ùü§Åƒ¸J[gãÏ‘FÀsqB,6ÁëQÓ¡íoDGzư˜Õú«ÁzÖÄM} y§ˆÇ¿9b–Ñx³ iÚ§•.ç^|¶Gʯ䠋úN§þ¥ÉÎÏ[oÅy0›úiùÕÒõ„“·Iwçõ–žÂKÚ#P’“_ÐÅ€mæN2Fnýo4pTx¨Q=ˆ  MHHþDßâf«¦›ÌÃaÑÖ„owa›%dvð±Oo÷õ&[ƒÛ[;ä€sc¡As6l‡I)1ºkÌ¿ð‘<Úl~­Ýe0s½æOXwɃYäW£äªÔnÁ.J«³íéf––³Ï“=F` ÖpŸ/+Ï»¡#Öhn½>Œû/GíÎW¤+º ¬Ô°:ÁÂ)¹-Žpö4)Ví…P ]—ßUä¾·«=í¢Ò¸ŽIKqæîí1ï<”„¼W\ S1lX˜©>ÙÍÞ°.õ‰ˆ¹µ‘È/!»Ad¤&6²;‹b>µõ¸N¤r½pÿ‰²íÁXN‘&3ÿæjˆîÉqÞÐ_ùÝ"UxO „ÿ©™ËRèÜ­õK,J4#è¤ßÖz˜ŠƒÍÝûÙ|2êG›ªjÛMŸZt’=£Êr½íK2”*††À`Š)ë«IÏ(Jñ_= ^*ë¶®¨½I¿‡SånÓ*–ßÏÛÖ_ÔO†áSó<ÄM$ü-«»X¾6‡­‰qvò”¤on€Á°ÀÀøFþò¥0ñ‘*|¡`W…¥­ Ùg±Iê#oÓ&FÿŸg†êÙÆ²˜²a[@âµÓëNu¤£Ê®{¸Êѹ”?0QOxÌÅÛþâ¹gxm¬ŒÖÈâÔ²}¥"þ·³%+l [ì³»Ý4ì·rÄRÉëäЋ˜™ƒÇp]½–¹Gq•±)íi(ñÄì‘(“ÊbÁîèn5ò.̤N#<‚×xŽºÐDJ^NJ‰ÊÞ Zp6 .j¯;¯xšx;á®z»1UË­`%ÿÿ‚¹.´ý#ó\èó ÛÍ.Ýhnv3ŽX³Û‡A#q”k-]EÉ‘¹¤äô¬›^ À8ŸI—t‰î— ÊÑi7)@ð]¨À°ëWUÃÖ#Ëzí*j‘½¡PbJÖ∱ƒb ï'•zý(/à=ü÷éµ››ñIÜÛζ6§‘PM¿ÁqLA¦€úBt¿xxîW—©”Oš 륮†¾l¨ƒ›ûUæ¦×Ý¡sh¸.~‡Ž¬±!ñîºÞ†]×¢¾Í´ð+yÂâvÊ8’®VŠôc\ux~*$ÏéÜoQ.6ˆÖxlIÓ·ŠX×13%›˜»È»6¦Ì®Û³DËÏÖ¼.ß·œª†{­ã±>øZ4SÏLˆ—ìÆkã°Ìg0ÆÎY (˪a3ÿb©§”ƒKK Æ+PîÆÒ|uêò©«9ÉËZOa»çY +"2Èç袟Á½—I{¡ßhÏR³Üè‰<˜6Ï×Ã}x1†³KF?0gUþwUñoèTäÿ/xä>ô¾E„à¬öÊóWKzJáﺉ¨`ö:â‚ڜØ å³¨¹?ÿÅ~I=z ±¯A69Ž©VC's&~/çÈó­±/»w X4¬yS£4íö#èW×?Yk¹{Ë7så©ÝI;Ƀ^pzâS'÷Y¦Ó' ¥_/€D#E9 ±¥£Át<•-vZ€œþ­ï†¶µd÷§Â¤®¼Û‡;9 ܨòÑõ¾Ëkìl»AäamU>i’ï}%ô‰«9‡ƒÀnên&=¬é‹Ë‡é\«1  iæP•xš2"óËJMmƒu±u+¾Z Âïl `÷¦f˜ºê;ì¦ã´ë€NÔ¤à IÀµ¢ý£PqÞ™ÚrzU³üÜyc;¤öýâvþs$6n»€° //°O—y#U»À3jeS° ¯Yb>¼ …ÀlL.ì–fI·†äø9‹€ä?åǸß5ŽIÉ÷÷†fÚ1jf£6ç¬S5r—òøÚ[! u]wY¢°§Â[²xlº×)_è-ÛÊ8œ¿#ø›UqžG'j«%*È…+[ÅžoÑ ”Ê"ðÖ±sþfTÔŽï WÔ ;¶ê\âCïGlưµPo=Ö;w3“×HMŒ92œÚc&XŸGѪPÎ'™Ïõÿ…*t]N)ᥨ«ÒŸ2çzGå¼eMm€º¶û®AÀIñí¾kÍ^xbéìéx”÷jU^˜QÙáÌà^ì„tþ4Ÿ<Ü']ÉTî8 lAÒü}ç 9)š/QpV:øß‡-vE0y„{ƒÁ%Eªä 7äüžÍ\Àæ¿>yø“×·ÔnN"@¥|ŸgC…• T*@†ÜÙÍ c·¸ŒnCÓðç4nÁüatð%1ÖQb{ïÖ컩4™û>½ài2j Ï/ üé­•xTA»#¿$éwã=­(Åð£n]À¿dJ@M¿k§¼§Ý-¨ è‹9¥Þˆ¨gü†®¶0ªœ,‹'~aé)„óI„}Д[âŸ.hI;50©­!øÿÐ1«‹ä«wK¼ø)’Çâ‰õα ì•í.pöX•™¯õîžxQlý³òXÅlÐüç\´uÌÕ0‰•"5²–ÉÙÍlÚÚ¯U M·Dš];Ç7K©„ÏÃu;‡<^*-ó)uß&%y*}ȉGWGý«êxW5ÝOÝ·µ9Â5[CUó’.*êñ=«sÔ½r𤉹“#*³{*\NCdòÉd—Âo³q<*»¤‹Ùì;9 µ€F_‡ˆ+¹Ag¤5Q»Ú4Ç£Ô?ðÊ €°õL½ oÉÑñdà ‡Eîw`ÔxáÏœ¬yÓPŠ›Ä(ñõm,c§ûÊ]è 3ùRd¸¾­üd‹˜É?ÞŸ-ܿٹȱ}ò¤EAÕŒCª©ó‚¬ÖÇzsFóêdôF‘³¨¾9… 77Ø£Ž®¡F‹õÓ’‰Ù ¥rðà: µ™SË3Êm€JîÔùm¨cîίd,|#‚PkUZÐâ~±¾bëùìp$H^RŠ?w¢ Œ©N°ýåKÀŽ‚0 u@ÕÅœŠa›¢‘¿``¤¦>¤œSEßEÍMüç–ÿHDê-a×4P‡D`c1û¨Ìd &qßT´ž2ù.E»—Âêï«løþù~Û&eת' &{Ì=Ãpб}nß½ZL…³è:êŒV‘ç›¶ñ8êóé=º;¼ñ¼TV±A¯¾‘¦»±]7ëg jž¶ ˆÝ±ÊŽh ‚‹Qäß{Ö¥4Ý×¹ŽÑíLܽÀ΃ÁŠt0&R¡97Õm²á©îÝ~b‚7:ã´ß´ ~;mxC{‹g+°9°júøgÖ,³FܵmŽãPS_ÿ vR7æú‰ÿå2éK#«š,¹Y<ËNË_ìˆiƒuÍAqÌüšÝwÓ翈à’459À¿5GÄO\O$ÁéwËe0Sÿ+t¼·ü4 û2-;£ŠÈs¤rOÊøQ¨tâGàËz(Xmì_¨ô|Up~‡ôf¯ÑΜ9±f£ûg¤’‘¹Êyé({$Òn—sÐAu«+ùÓøiL=#XjZžÜ„ËÆÞ›'§j1ûÑc»=¦Íxl¨°Ûÿ ·M£ ñÑÀCö’mÚŸ­¶”²'çðó%d‰[Ê<*‘»7ÍZ˜mó¬y¨ü(rr>$w%)|d–¬È¡lCVcý”CK¾nÉѱÁœ¦{î…ɸ»uKÚq£°)»©ö—w¨ ìJ_޵*å犫^iÂé[É|æ ¦–u‡)*øå$­üçªäó±'Îéä&Mté¤2'ûxI¬'õ‡ÔÃÈ $¥¸X%¹N²C:ŸAÐ*›å=oÇ´¯–ù}í‘”èò@™»F¿jRWœ,b°þ K8¢¼Zñ' @½ÊñhKY-ÕäÝO‰7R9B*áBø•š¿Ê«ûHë/M‰Z• Ûw­ ÌQi; †É¡ÌéÈ:@ˆR µtG&¦DØóÈA2¥tqïL½É…ÀIùʤ½¦¿aîoéßÓ£ q+}m¶B0L3}¶¶£]²”TÍ0ÄÙG$M(ªž§è›Åqâð¥Yê±BJBýÅóó)‹h蘳w¼–«(ÉdÔ´‚7iy¾-ýN+Ÿ0¾gxhŸâ=LyIS6WÄR6äêc¶”ºa?ˆ-–çbeú>z›Âjnü`eC˜f†í×¢‹µûKº°-cK’ÊõWwêÛÄcShlýO•g+ÏÓ ¼Ãy¦„Hñaߺp]‰ÚF8@O‰à»ñÚöëcÉPD_;+¥BLç Uú"¶í øœlÞaéì^k¿Ûß¡i9ÔT³÷D9У,0"'ðåÂ8‡²«ï[z‚¤ç[,4Bj÷+ìãF¨A¾ðÙ>D}ã9-„éÙ™€î+ G$ˆä´oâ:ÁÔªbYÜãxr¤Ï^^­{ÖÐfR#ÿ)gù)/SÃù¹~º‰w¿…Çv—¢TÏP‹€.òäÑó¢pp¤Ôæó΋Ï|GUKÁ£ÙKH;$dÁPßœýû€êm4J@ލ$%É©‡A›OŽådAЏu¡~ø¤U×fÙÁuØTéîƒ!ï\ì¥n㹑ãè&ë Ö²ª‹Nk o‘3e=–?ÓY|}È;¡†ŠX¸ü8ÚŒ)öÐ sÛ'ÐÝÙýC*}´ÍÁ®ï»uòÄ„ã-‘,ß¶eȦ>‡°ëŠA#SÝùÔ¿e1Õ»œÏ©"\ˆ aÊýZýìSé‡ZS%XK¹l{îóDü¢M>¡³þ×&VÓœ—F¥ë<îõÕ¿´54Déâú=X›¨û©ˆÜEVNîÖu5Íðpغªà„†Ïu·©Ð@rýÆ vê~’C‘è"ÜFdæ!Oò–ËuG¬®ÿçþy‚3ÓŠ• *b=­Q0ôE²Û" £: q+%ÿ«¬^ln¾ÌUÃgà¹<'fŽý£!zG½~í°vR•@Rݼ÷Þ¢k”1#÷±Öâ,3ÚqÞöo6½͞>T Q`l[‚Î`Hm‘°Eçb;ž!ŽßRŠà‡Ë´1•|¾UT†ôÈ'­Ñ7–òvÞL¥Ú¯Ô9µÁÙ4|êzeèø”Ü‰Ä…¯pgU˜Ë¢å‹r ¯8ðP·ê©lî“P8¢TÞøi­óGè‡îb÷¦¾õËŒfimÿL¤þÄå‚­AЧ+[ þ–¢OÓËìºÕÚÜÝ…XbËÉ@­M÷ïÇǛ䢜11-?r{§¤è¹Ýð'-œ &ÉP³ŽÇÅâiKüd MlÍH b“½ÍCáQÌ%²» Ÿel Õq&áwneØr< -èŠh)/×PH^X¶~Neº” )/‘øÃÝå>å*ü"ePEÒ'¼Ùý:ëƒÞŠlÒ ÖX¨;MOoQÜÙP4çEÔÐC°õ€O6ª74²æ(“@~’ãA[ɲl/·ÝTs%ÌGxlWd§òU6:!¼H¹TMÒðsýÏq?=•˜zG—}38øëáÏ®ck›Ð­¾¶à|ßÎK¡eùžUçëÜPÏ\ˆ—2V¤€L?yÔ%ž=ÿy7>~|v-éÞd*‰[ÐHigÉöI]2u ô¾‹{ã”Ç&’ÀŸ™ùôBŸ»ŸJK#: 1p»ØJر“ŤÌ{ÁI¥¢ üéõ|¦‡Ð?â¿Â°aÍþÌ wÿç!iÃIžaôY¦)Žô‡4ûÜh$Á©† ·´õ‹Õóh‡~%5ÓÅ+¢Ëq?'æÄ†cà ¿Ì®@Šp^>üŸ9t>õåš ­ÏGæíå@j„ñ|‰³0šöÞe¡úª¹Ëœ1žîfâ^ê5AEÔ‘yl{]¿ÃQŒïy¨ªmºò¬iŠcNµ‰x\æÿ¶›IÛsof(eÌ›ÄØ¨0»b7+è4s»>–ï¹HsIXgW¤{žŸcäGÀèMª8®…_#âöClP†¤M ‡–”=ÁëbS4$xPPX²—Rt™*9Ä…Þíì H¿õ`v"úá‡Ò3!ù¤›ŸxRƒÎ5 +Æ1¢‚ÇX@üŸA²"e û(öò¢‚Ì1ÂòqãSª8Dõ—m@ùºtmÕ‹Ù-²Kü1 –˜Vã ìYD¡’˧ڕè&µ_`6¢¼ðåhSå(UŸ­…Ôü¤ ídêà¶û……?soР².»K¢-åššp¹M`[pð@É9²þ[!go~R¦ |ÚL?‘ÔKNvØ(à/Üñ‰Ç›ätŠÆ{n^º½(Ýïøߊ¦û75]ÏüsÃ1¼öòl£¸t–>>œlðÝ4º¢íç T)â…Gl?—È¡S:²‰ਃzw•-eŠrÎTŠ:k3R ™æ¥/$‚Wsø“S®ôUf™ÄáÅgUm¢x1ïœékïüíÙM´B&Þ‘r€ßG]©›,­p 3ñ^Œ[ˆ¢râËV:(ðj3x¢ì[ Ü ­@> 6Hl:@M`iMv¸¶ÁáÓ@~n§l^ƒ:¼ ‰¥•™`ጱ*2€Ô1VœÇŒá;¯z¦¢ö´t—ЦGíKoýGž ÐÀ»9Ò‰:äP45TíÌp÷tþsJ8î¯)æR›m<Ô[™4ÏÞYCS AÌ(Bè•1ZïŠÐ%3ÖIÖÖgܹ°ÄØ?Z*6Ïͦ'd­áš¨Ïëø ÊLIð®çô7[/ç%ƒ=j])™J ²NÐ=sUw¨ÜX*”^|ÓOÐç¤~R1ä¹òIÀznï…LJÒd/)ÇºÍ AïU~ÚÍp~q^=ÁxÑcË'pmN_-êûÛÉ,5ç©6 íePå6ÝÇ X‡g¢Å`„Ž+“q,†À›_±ÈÓæ”&¸bÚ»kZ¶3^cI½·ý7ÕÝJå‹çBHWU²Ú2®!M9V]Šà©bZÿ°aI-*ûѺ€>©­1R³ßљʗ^ØåÁò'aÏ-ñ:‡îjqa ¬qaZ£›2þH»jT•ýë5"®°¹ÎM«ÛaFd_^_夘Ô"ZVCÒó€QgiÑP^1ÓÅOÙ½Ê9E,q­aq¨e>£&r0~Ì'?BÚÍF¸It5á]ºSbkYó˜ÖšoÎ^y¯©KÔ89L|úe÷l`gà+âSdt6—.„?Hd),˜Ø/“Æ/ôϤ3¬W°Xاþœ˜R$e:F 4X´&CeDløÑÞ‹[£í7"}ÈÔ\égoÅªŠž’…¡rŸH¯úöV`—^‘©ô2ÿi“Ó¾ ®=zˆvež½A§Á«µqöðϽ#5½z™‡¼ü4C}f¿4. ^§RÖˆ"ø•Ù»E„ß‘X,åJdyQkáÏ65ÕfÓvaøÞ¤çÖmA2käÿÁ¢k6£.ýµÐD#ýƒ/0YʼÆ@x3É<Ü–!ÿNöí·$ïȯŸö6HµÂ×…„t±o‹Ï’dcÚDÉ~ŠÉÕÁ¾Xj„o\?×0ß øRdüí,Ã!ÐÕ†´ª½8G$I™ðÁ¦e-'9>ΛîyÞŽe–à€"»¹S\Ðäî3 ¼‚[¢…KÂ@¹ô´rÄÁe OçØD†L‚ߊ+cŒ×ê»RxÂÑô-Ô¢÷C;Òõgóz ÖÙïþj‡ß"œéܾrÕõŸ[‰8­MÖ·ßÔU¥ƒz™:,eÑìÆ·èÜIJ |éNÌ݇ãã¡ Œ Ï &üßmpj2bK »§.Y‰¶ÏnÀkf£ÓôGS}”›hÒñiœ ÷í”òF—[„'IK‘kuûöé¿·z)Ä `oÛJG—ñ€´V[ëÒuÂü“ÀµÄÊbœ7‚Ë œ¦¹J§ tTâ,>|Âbnéž±ÓÀIð(N¬PÝl;Ù€²z5à„ÊÍøs\ …®¢’WÀÈiÎb„Å[,"šÙ­Çª “$©F¼}ƒW¹j=ìªîÏVZjó;*/±fNT÷Ýïžy!W×YdjÑ¢öi§¹:ÅÊ—q·½èù?RiWÎU?&/qzq¹/»¥Ë—hãTñÌf2Ÿ—ò[ –W*è9?ŠÃ,ëQuƒFí‚rR6E¯UFWˆò£Ââ…“dõ´Š¿CÆ,q%ÅIÅòµ€h§K>•ݬg“ÚƒìSÒÑük¤è%’Š(Ø™n¥W‰éÉôߪ°üHxkg.féÕ‚«6%#GºsÜÄ# 2ÔÁȹ¯ýÈ ¥ D½.§Å™[ìI(Æíg)Í‘î & –ýA\‰/çÙJèŠJßÊN©#s­Ã¶VÇ[s %.jôCl¾Ñ ®2Eá…ŒuG˜ë§Ë16«§0fÈí¾¸‡\¡¢½Å– ņÊðà࿺«àð¬Ú‹(.´4ˆ¯-_—Ù£° ÉaÙ4Tû§è/Wd°Ü¨ý¥1ÿPFà" -¤ïãKŸë¢D&ÁfÛfXkËO½³¬»VÙ†/´Îkçž·¹á†Wm2ÚŠeHãM;zµ%]$PƒNEÛIËŸ$ ›™Ô±T¢aSÖ­ØÜrÒsNÜlÆÍú"múŸˆÑÛÈ«Ù(ö„©0Í¢6Ö†[²2D»»_ð‚Ü¢®JÌŠKKæ‘lóà.w›Ëäõ‚zgR3pbƒ»þ{gÉQ¨FɪÏ8uÉì%ön— ­(<²ãûÄŽD©ö7z'Kz‹¨£©·u³Bò¶¥+uçÁfÎÛpüÿ’%(rCçÊW3á^ÙiwäÍÄ"VÑT’ý‚?¤^5Èó bå‹§À !…dKÏsóó©ìv¹¡r¹õ·\³3DßH~ƒ‡£Z÷îóPšÜ; )³gR—¾5R"%=jc„˜ÔCÔ©wòÿÌ<çmk6"¿áûWcˆá¼[!]âq.a%‡ÅýgBœçg… È‚°3bx×£6‘ŠäT'!³OwXa io]4Æd?…V>n]e…'l)Žä—Ãr¸®HÛïœñLQ6¬ø½¹"—W°#Œ.[Dât»ˆÞvƒ’<7mNÙjöìöjÕ›èÞMRÛC>hô#šÓ|Vpkì·÷’zSVµpÊÏyfáŸ#6Þ0!râ²ü ö …JÐY•¶Äô`Õ~áâÝ“$Pè,›J ì^¯w‚îq£i#‘A–`ÒE’ÇšüqÝê 2Éý€WŸ\ü¢)ÐfO¾ÙnÜ–„Ö=vÝŸd“âŸ~çÝPX—øi‹y ’j.@ŠÎ"…¢X%ø­-Ïh)È‚Ž)Áìj~^ÜlS$>a@É#Bì«ÓúÙ³$BnÚ¶ÇñÞ·y©FÂÔì¢V¥ûŸq0Ž¡ÓôÃÊë$õçVå ¸†qË—œqjóˆb¾™÷Ô‡ÛfH—óeÖ *Ö*AªIe¡LôL­Y¬ÃþºZ‡_ß‚ê|-~»0‰—±d‡3Ô½ÞžöSxÃO³•T„”óUÊϑڒ¦$6’`¨Ãl²IÖ#ã1§t!ñ¡Õ—ðxˆ¿i¿˜þ@ˆxm,¦‰@I7kÊBäÒ ²td|àç0 åÜEƒ¥Í“~[7ô×+àà°ù)ÇÒâ/Ks<س÷ü)kžxWï’0ö1²ð/‹äÜ:9;4vQ÷²ò| FèB§©âöp6ؒȼä—ûùgñ `zrý¥S£p–ÕÂs~‚<Í?äePREÄÉÁp^ܦ½»:>0vl‰®€o‘96<±öÄmnäeC_´½|*xü­tü…S\AŠÏG•î³o–¾=ÑÅŽ”!Riÿ[šàv=Ÿ;ÑeÒª+ÐaÁƒˆ• ëãy-”•9Suk%ŽÓ:ÝÔbº³©/+±FÕ-T CÅR-^´FÅihª.f¢:€Á©°S`Žx gœS „šîEñ¸Ð}ìðн‹úÆÜ(ˆ˜ÀP§Êü˜Ê4Q· MJÔ…êºÐ*ÿ§Ìç’ü^ôúµgFâOCce#QVóÞÆî rReÀ4¾VõåUªX A? hc¡œµþ†KÅñàrºc=˜oý‡–260}œ^ý÷oÓñÌív€<‰¼Ââ!}ÈÜ>í60”ƒonÒT¤Ò*´¤Ø‘=/ÊÓKÖ¬®xòp{ú±wP‰ËxN¯ä× {zv[®%7)¼U¯¥oew±Ír‰ÏXÖÍJ³­¬YÑØ¡`k´Ýç<]ùɘ*9½ )C²2§ ¥Òôõu>+=ƒe–â†©ìæ®Kq5*ªdª¢X1œ@ß »Õ o|ëö±lFÙ˜¹d%×QÙLDÜ¿ÌI²ÂÖr‰wö þÝ5MW`içmÛÞez‰ÂNýdeïSò3j½ûª¨hÛJÜP°{NÏ+îSÑò ŠA6GQk.Šñ£?á+mÍl4Û–"JĤ@/~œ+Œ?J\ÞÕÙµÛj‚ûz†Îkù…¹ÊVvYr- | Ã ݯÝÍöhJb´ 6*}c«Ê0ÿ¼=‹á7òÒC³uìšfÝØö™¡¶h>Íæº—»H.ë$éË’¶¤YÚ^§³‡fÞ…À`ûí¾¢pV*~<î粇‹M(ƒi:÷€¶A,è…FÏÂl®ÐV^¢¶2«qš1@æcÈõÊÚô+Z™h~Cé9ºˆÑh‹ž5{®Ãéyx™måEÚŸuÏ ‡â„%@]:[ÿî½OC(ZPXzI[~7Á:ù“l«¸]ÄqEì\,ò÷y+ÕðæzòJçÚ 2ɤDÇÕA¹–DórÊir€ŸŒNM™\ÌØÙ4óØ aÊL&ˆåô˜+¾G|÷Kkè€xÔìÈ%)¼SW¾VÙwòšŠðb¼‹€WläÙUÜCó˜°˜üÒ?,ôN²9üª·Mk wOˆ>Ÿ1,éS<‡¹þÅa~?¬×k*Ù­‰v£BöhíxõCkóPtü([må©nΤڿÅ@à aWhû'~’#:ÖÀ Jh‚©`‚1ªÃ0 E2–ã7ò0ƺ3^öpô]L¿~ 2ª†? c/hj¿5h{¹«ê-ïhqz†˜ŽÙTw ^Ö/xhk>—aXÔô:›;fæ7ðÙL«`~ÔL.h¡ˆå5Œ{u?ÊØF Q7PC£l=ÃX‹vzz5夋ãcÈ¢’™» ÀÆ|y¯hQÓ’4«ý\G³‘N.2#ê'[IL†l5‰gôÝW\ˆ‚´Kî™pý»ÍÎfX?±O ;­n[¢5KŸVoãìW÷Lä'ËH„&zÈwëÌ«-´_d›&9Q¡‰V+.ƒ¤á4wu¢t•$õŸkè·+Œp@º^ðw&3¶zGZ0£·¢®Ïþm¨¤Å|àí½/2 k¬4ÛpQŠ&[ O0œ-•ˆ¼¢x~2fÁXû€’öÌlmÆÝº°³È‚&Z½wqx‡ß…Í=:=˜äW¡ê—§z°ÆÍoÄÒHŠÝIM¼nmº¡ØRA.ôTûŸ½þ]FS{¿W´/UûŒ©K].zaÕR¾£<8·`b¦"ýã%4Ú€¾Ž$…š{«Œ†D8{+#yŒဋQ¥wG–©ÀâÛÜ»nc,lí!âo ÒÏ—,g¯=ž¬Àû ꮟœîí.š?㦠¬uP(e6Ý{…2³Ï Ö–Íàbå¿—RL2ï"tª,ʽqŸRˆÞÃ"Jh+ÅèÔʹž·Ñ²êØEûé÷§Ÿ”H¯‘ð8Gøl‡HÙ¡Âû& ¥ÖûÁЬ1ºRÇsX9ÒkÓ˶;Û²D€¼AKì~… `ê>Ë”Àux<Û®61§–-Ëññ Wßêîmv?È.âýB†f‡ýZ­ê>Óé)¯´_ÒKS:㫜¸—]bIW˜eÕˆoEn,Z}ꪪñQ´6#Õ{ \Îò$‚ß›©¸·M§1ºG›@6Tá¢È†6ž˜r%Å'J…ᘠÍ#z/®„B] óþô‘«X"¤tþ~~âBcÇ ]ÁeàgïܪŒ…7Ä)öC7¼RÑÎÉW )ê‚ZÌ:ç;╟uÞ»,X:Ñ–Û‹²VÃ3-«Á¬¡W9l®¤Ü@_| ¦*²¾B5üÍ-ó­<€4à‚Ø¿£×w§çJˆžAÛ*ÙÊáx¨ZHFhô&ª  =ØÊÀˬðÍŽ>î" Ë÷TlÕ:ÄYØßhÙ·ó&)+o;£N’ÀEÕa¼jM]G·öÞ“CŸ~›<­­˜S:"¯¡JšS¤@¡Ö ²¿›d±|»¸mßÔÅ»x[$ÿUÍÖðZN ªãˇߤ*|\«6Aކ(˜Á+N^ ›€GˆB¯”ßË®j¿’ßl è½aE¿"nß3bÖçÞmD_€TôïóLÚ±è< Ù²lT8rêkÏa‰÷“í¾‡4ĉü-¦V/ .àÜ3[ÂòÈO¼3|´g‰Fû¶x>üµÙiÙC-“ „Äu¾ ¾ Ą̂ÞwŒ¯0fî~ö?x‹(Làú¯¯Éªî#¯ qˆÄSGŽ>F‹ºiœL%vrZCªVþ¨zH©íÈQHkåU1Ò[âKï! 8ùƒm{ÖÂÛÁf¼BšòÑqºh‰ßc¼÷L‘!#ù÷Ø=Ɠхµ´’jÆ ¯})å ¹H·äàŸ¥o>ðÑ/–ä½Dí3Hç»zÙ˜óãfmß<ܪô,Ñõu2|¢‘ÍË>?’œ“+J_ä”\ÝXK»Ù8ÝWá¦YZEjf¦ÎqÉD‘ÆÄD©qÉÒ*á³õIdMè¢n" ﺴ–rž è·­qôÖ¸ÈæëT–A>7×äÖ2·°Â»m6~m?%¹ªØOc©¨Ä:ÐÞR¹-/(ài¨múâ»büðücv¼ÔkQ+\ Ù«bƒŽ¡þÆ&ZÛÓÒ(Ú#ašã/ ¼L€µ*lž–D.ïª÷x¹kâR´b8 )X3:k¡áÔ·–D$>ÂcjÒ¿GÚ>I¹âH²Ɖ*§â”•î—TülÌ©?3®²’‰UP1tlýÈÉÆ«‹ÊG¿@®+³~$`]Ú{ñG )®ª/G¸ßÝFÙ÷ßÑŠmá݆z«ËáçÓV£›ã­ÕO‘H¢–’–wœ²Ô„´bŽ‘6´z3X®%e-Öä¼ÈfóEf>í¤ÜTP¯e?×ìËì¬Æ€Öñ‰Öp—¢ôåZ§Ê ¼¥.RZ AvˆÊºV„w[ …ⶉzŒqƒÈ×6éÒåÝÌ3w!Eñq ©]Ìó¸½ËXF)öÿ@÷…5=$`G RSÊAÃÌ× ÐSf4N 8mð­ºb2òäŽÕÙr˜¤ù7i•xð#òÑÑ*Ù,4½=dÀa€®ìÀus³"–oaM6àbsŽCU¡]®X’í£0¬íbÌK°bd‰{ƒhöüúoþ cüm­‹âïˆL;>0ò·Øäg2ÕÌ#13Æ/¯;V í7"ò'©Mæ•w NÒœPˆŸMþ(«ot9™ÿû{Ôo¤_xï·BÝ<¼²uÐEÜhßð9BP#^@\ÝOÛÛ/é¹ßg8l(¦IÇ›ˆàz?Ë XLWÅuo_ôuȺÏZÞ– ½ËxÔr\‘ŠåÁVôœh¼èb¼.Ò£äG!&ÉE}¿€dg½ío.O‰Ð¨¿õ†M;b†ýþŒ?Œµöÿ*ßñ‹@¬?6l½=Ó„ôgМû‰Â”‰êãęݕ$M‘äITr'D5= 8ÒÜOroƒDãç.ºf›sï?¦µ ­}Ϲê¾üj¨Çû®z[«†,{ó¨|D†B=½Çx[‘Ij¤t|#·-‚9Aï9‹Œ%ýmñ:PkiR á8áåÛã Õ]tš›;|ñ 5Øþž¥ÐLo-•×›q#£H}ÈÝGȨ9Ĥ‚©Ó£ðNУ[A5 eQ~ëø:a©9HÉDGj·èû°ßѤwaü¹i6ú-®õ„o­aù<Í^L ÙC ù~ÂÍÓ}ÿÅ”Þ2¼ŠÚ ¶ 8æñ(ËåE6ó-‚½äD}‡{ÊyçzŽÆ´©vnf ‹c´¡9b†‚‹‡:)ÿúÑsv´¾n´à‘­5ÂAÇhžCZTÒnee¬ PÖîÚ×p‡!·\sÛïøÁ¯ 5 j_s>©G4µÁ<åOT C’Øé{;\it™ÝWtÌÛôUÝd‚ Á¸=–ö¹cè–ŽõôŽj ƒÕH÷pò¡Ëÿµ1Ý'mXJUûÌÖ?ñQ†×³Hôma±õàþœtb¶4Ut‰‚…¦ÒÌIJæÇXøé/‡¨¯j'5ƒ†à?½'÷‡)[$.q’“‰^:ßOAå‰õ"XyžŸ§¸À•¬¯Úû®.64êq$2c"«lïØk,ÍÙVw§€FǣഄÎÍ_ ùo£+Yì‘jG¶ÐÔцž›ä̓àt†GŽÆ\àX.PêK&jFœD>×õ‹ 5‹¡õ!‹¥Õ¨è×¥ÓC_)Ò€$² Mó‚XŠhê›3¯5®ù°:ÙŒŸ=v u ô½ËÀ"À²·94.ÿ•.À¾?í+lÎŽù]ä2a¿ºü_ vO8§æØ*Ä´v­‘ÿ¹œ™•4pÕ !”¡amõ]Üü>háž¼zð* 5bVÅF7ô¢½Í’0¨Q~ ç*®wÀ3¿Ÿò¶t™\‹†F· ½:Õè^ïœÔ—“>\«–Ó×Àt•Ë‚ÄëìÕ—ÒÜËxÑwÕaÂ? ‰bhV¤ L•”õJYþø€ üùZ`Ô×U{.ï‡"Ó¦›u·5®t\‹eÎ(®ÜôC¸­‰ C¹ûª™L¨¿A5ü7:G7÷©ga{f²- óœg®‚‚’|ZJQïÞ–‡©Ì¼iY`>DYWpZ:—pJ4ÖûøñpûýUŽï Í™È/K + „!Ø,ÕA¯MË>wgp‚³ìF'R»d*ËŠº¡1ÑŽéÁ * 8{’þ­²Ø)ÀzVéŸÃ÷S¶ÇžÊËá”\ÇŽ#az?ÇOõDþ,$4NrqQR.\´6"÷ Íå]–‡FÕåŸmU %ËpœüëÊó2Ÿ3¼ÔÎïéQKÊbøùì®]{FEÎö:ý¨ï!:Ûå³ßàVò˜2wíU«âŠ:FAèK@„’ÉÔ™ —Îeó hè94 ábÉäø9À´ðìíc3ɨgKÆ =ÏÕ¬ ‹rå3€Ñâ «hSî<‡ùL—¶™í¬ïÔ ð»¸…^š°ËOP ̸˜ôÌkWH|!àOZ~º]ÅdäËXÌòø¾âÎa4ÙC÷VƒíjŸöŸu²ýq&¯Ì0Ð0C©‚ÏÝ²ŠŠß\›ÜaÆ%€­Ìɬ©âñäº;5î[TGŒšö# #:{’BhNŸ[ ‹å¼Ø\­RXK4ÝRz{¯ËaS‹,ZÑs˜-'Ü}ªs[¡÷Ï•ô}É,NÁŒ!B¶ª*ºRgu•J³„ê—IŒ“¹Ýv÷ÞÖN¤K,û7˜6 : Î©<°{x¦zûj£öBB^mÓ;H"LVÿ•Ž˜*¥ªõ±mnÁoéâ7µ¼'mÌKR’]GúÐ9pý‹Ge6 ¸6®øQUpf3D—”M9ªš+‚T×xq°_DÒðz!Bäå¤7-­èö­ªRQר“®N»F“³ŽdÈ m°vΑ·ŒÜI~guPSbÕHé].ŽQã­å|«ç¬¿¿t7è)½ `aW•¸2),ëÊŒÈÂ…v †a§#zŒLª«%4uv»ä.ýŠ’÷‰ö*ÄïxŒß8u˜^Kš‰’hSõê­¨´¦"€úúþÍs=Í VÓÍçIÂé×ÿùÈBf€Ÿ‘dº‹ïk(Ý=#Ú¼bʶV -uú®¢Á\ö3…„‚8°wO’€¢²@(ŠÜQ#$Ç¥@i‘@Ú5<©ªëÍÈ'M?D€×°8,52¹Ë^_Aâ‹ÃÖÀVµLg nn1 ½ª„*Í_°2°ìblx;[“¥H§@êWW™ú7íûmp<ö¿Õâ’c~Ú5A°æW~µmèýäi™(Ƶˆ'“™;¸“•x‡ËgÌNñÀÈÊ•a‰ÌgÜ»ÙÏ¡8›ÓŸœ„¯“c™ªíÔtÌ¥]„.›=Fa&â´â'`x_“3Áž9<ÅZÁ.w w¼£"­š¦%5ƒ;1å®-ÈP µS%¨rgöžRŽj‚xöõqÊ'?Zw~*jÞƒHº þTOp!ÜÅ9>º±¼~Y§¼r(ýÔÃÙç:IûÉ(G]«3”ªÌs5#ÒíÁìÂÖÍÙËÀ)}ê”o¹îææmÞ…Õ'g+AS/穾̚„ê%ë+o½Œä*2»dú(ý씆¤²ç´‰> þiæn+)¾Í7Zyn£Ü¦,š)VCW5凨™§•—l¾z+0D¦€Hv•ä¥qZ§æÒÀ,]¶ë:TNf·DÞLrñðL+bÕií¿ê2LÉH‹ƒ¥—õ¾:ÈhÄÜrÀoݾ[7’Nð„”ÉÆ|P$€1Ë™ ÅŸû±9T±›4¿\D¨¥òsU$€’ uV0C­Àú¸™‹Pа-æµHÃŒ–Î[Ä®}J‰xGù¯‚ý̪ ñ6&ƒ-¿‚ÈÕ`_ã‚°žCé"ÑŸ‰érƒÕßæÎêJEeÀ±;¥üùàÙ1&‹ÛÔéșـbÇkQQ„f^uêê‘$78éí;³gï» Y‹{iìÆ!¬NõmÚ-è{à8S¤âLÙçýêǧ‹üSÏ* ú’|-³Wjÿ W4;åÙo²Ž]Ø:?Šê8VÕ%Øv‚T¤ï5S_B]¦ªi­Þ—<Í¥žµ‰ï£Ó($¼‚°ºU1þpŠÉt~ âí®Ëàñu(æ·é)§ ³+°ô]¯l µÈ“µà£¥»øÚñˆ‚™2e6Îàá"¡"g•RŸT¥4ÝVðDrôîAúB;cá6«Èžsç®î èõpWð“}¹M5gwÖ µQ‹5í¹ç%£ ,ŒN¾‹ž&ƒ¤ÜYñ9¬ü6ÓŸt4VQå Þgz8*Â:ý@а­¸ ór*¹%‘.—&¼ÒËX†ñ1í ȪIζLÏØjG·‘.Œ€¶)Fù€ÉãjpThL„´#ôëñ…EæW ?bÏYã-ÉXq±RÛ{±Ê‰q1BÙÊ—LKPliCêÂbÔÐP-;»b.Q  .5:æ>6m€ý¢Õ¯Þ™±ée±lQQCP:žlΠh>øaï¤Ì¡ÕS}ÖÜ  LpÛá™6ÚìAr߉EȣƯ4:ø0á в…WߊñT»/Ïs<£JpÏ -ýÇ<¸r«ËëÐˆÉøûGÄuBÌÎ?8ð$¢Òæ² Û×ÿí]ÿDxݬ¨¡öVªþ%@+àѱû4» Ý’|EÞ{šm!º)·d$åÈÞ¹iEfÇà<.^HtP}Ú£M·ÜÝwÊ–i´G]à«Ó\MJuš)ŸÏ„Ü*ÓkXWÐp›)cL™îî¨W‡M÷€“KÜfê7ZÙ-R§‰s€͘ƒ2v«ìÏQó¥Rï‚ñާ‹Ï;ìûÒ4uOѹ›dV‚¯ÿµÓ›DÖPwìù´¾J•&—ô$2—…Oá¯Wi÷‹®ÝÛ°å®~3ÙÁKL ¼á Jñ´¦š´¬ÅB7îd('däüiÂ’%‡¾ËB‡œjÒ7ßÔSXÉ|ÓK@¬ï|Ýñ52ý]ƒJ|Þ§[Ð..þÅ ïþ9F;M°³ó%CÃq.üÅã²ê!¨óvç\gy’?ð’¤Ñ÷‚îi)«4Ÿ^:¦˜ê.N'›IWÆ&ãùe5sÊ%sƘºZ³çû;4Â×Ïr7ÀHf×´ŽØ²OwŠ :«µØèK÷T\î8í'®U7¿‚õÌâµtuíÔäc¹­§â">ÆS$xc¢"e˜ßÌk¸}}U™p%f©¡mÁÃ2J6u2i£Äâ92¿”VXû.—ýˆ/ã8í$L$r ¦;X’Þƒ_o=NCGÓö^‘ò³5{4ŽÕMì‚çlðÛDàf!N¥ šàµÒm+“Ür²Úb?@²ÅQ*Ö‚“¡ ×{Õœ½í –6Z\Ëú`Ɖû>¹t0'YÁô¯PÖ·¢××n¯æ„A®Q“eè=™nwçxÙïþFq^Z{å}Þ‡3ʈ)Ì…ÍN­ËÁ¨Þ»¸dŽ?ûî_µò°P¶*öwl4tèwÕýÚôçiíÕ6jæ4/W0Èü -ß¼×Í¥Uw9„î9bjȽ¬êÿ÷¬ Ï‚ll³’ÚÓ:‘ͳÛ“ï1HáÔFâ{ÂoÌ7’ïýé7Ÿ ¡]x”ˆŒAäZ°Lºª ¸¿ïK(P DkmØ1ãʧ;ŒUoÝ›¥ðå¥Ã´÷µng7é5´È”Ö#Ó ÂA¢Ùòœ`Û¶]šTÁ&òÀáwµ8+¿EÈ•úNC\-Ø·;à¢YJ7Ø´àLT|ö+󶌑Øÿs¾ÁÚO 9³ÆÂyÌ*Wnä+ç¬áõ$(ÍíCéç>ýr Û áÝ:šÑßMˆ,;´yuÞÎ Œ"§zd²1ú*¿lN†¼¡òʳñÔù¹ÂÛLÀ#–m×Ë\)èΚö'⤂ŽÔRål³áq ÃT´ÝwSžãÈÓª˜žÕÞì]I÷|rFHhc¶ê„9*u!e‚®á:;\˜òSfõ0gw«¢»%ÐëÛžý­—ªRÿl…PqlÏ%ø .Ý<£L}eêì¬e1Ê£XòNe«›¸wÜúJ ;ÏÍ*E2­ ñÞ0´¢é®‚ºQýÊ×C‹øxò*s*¾;ÆÞIˆm¢ªµ]  u¯åIÐ[ùœáþÒbŒKæ6cÆöÊyoµ§ Ø­'ø “Þ -åO7Hè;¹N`0ÇÓ²âù/lÒºšLe´8‹;‰ i>»GhŸkÆ–óW² ¦‰‹ûDõüIâêê¼>«%p°$õ‰¡¡ à']iÂÕ•12ðŒ?#É,™ŠsAëVÁÖÖÝ iGóðáô@z´Àâu÷K+Ÿ:Å öï/xÚWN ©›WDâä±'XVvÓé Ñ}X h½[nIa‡VÞzˆ†Ëö~Ò{|ný‡0;ù"QMv…àšÁ@õŸ«®¥5[±å¿U®PB{qJ‡ÛŒ}WÄÚãÁ±©Î4€xÙý¼Íâbyq|9·!.Ù›t˜¥ÎÅâ=#‚]O°ö¬ 2dêK`’¥ 0^¯÷nk…X tD@• ¶šÜ'ê.«Ì-¯89‚Ϙ+÷É·†#ó[ÑR—âLùã赊ø•¶>ÄËæ^«¸‚ˆDuèýþ&ƒŸA¥3yßÀJÐåÞM oȆXV*5‡v­‹¨T zr5¹Õz¨Á-ʈ.pNæŒ ˆZÜ’ZÿiìÈZL‘°ðl¸=z£ø¤OÛu5]Qã?^ÑýßÂ4‚£>‚æo•;ËÀPxÙî ŠžÏ¿ Ms«†»?Æ#L³H uÉéÐWGI~ïµA9Šì9dÌŒÝ%v[Úå\ÖÆ8îºPÐ{_3ó•˜5-u®þñÜÓì‚oª“oñoŠ˜‚f¥³|¦È _™ ÅíǨÓêdÐïQƒçæ%¯Tš;ÖÏD SYF°¹lÓ附›j(gvÈ¥äc!;£öŒyb„Ý[xÑp!ûÀ;K½.\ql¥ø;wË×¶<1›Ú•¶ûO’@ýÜŽÈd²‚ÿ‹Us{ÜkA%QijTÁ*¸i:켎´¥¬)²‹Ù¢Dmáxît|ANn Õ.fAþ£rä«èoƒë¬déð„¾3›x!ÝtrЩéI_Á¶ØF$)dûõ2þÜ˽Ižu[ˆZ°{z'¶RÈXÂ,ÿX›¼Î–mäP•_Ë(ЉI%Ñ5‹…Âe"hcwqºÛä‰N.úûX˜A•ו*y­™=xô‰ƒd’H¢"™×Ý“¨FNÝT”(áœ/8ÎϤÃ\Y‹? ÙôÍÍü/Š[ÖX04Š¡ûëÞ…Äu”>Lôï…<¼%LÔí×1(®ß=6±A:K|ý×Yýžµï û»©gpue1ËóƒÈ$êsApþ©5ž¦aäj£pßÊó¾ˆ.©EbÓ™L=É’¥«,&{kÃDZAN܇/…N\Ãé4<üÌÝ;¯<YÒ”«Š_eþ´VÙ$77ïÏKÏ_*³»&y€ ·ðŠõßNV¥¡;p$Þ šÖUTî±ïsh¯z€[tH¢ž“MÖô¬å·}u~*¿íp^Žà€vØž8Q.ÞZ*Ê›m JJ}°29Ï-X…ú;P(î¦÷º+Ùyþ A©óÚÙÀ«Å[güj?!d¶ä!’¯ˆŠ ­O¿!¥àƒýˆ$ßñÊššØZ±<¡'°‚žu‘áØ¥ 9¿Ð/‘pUfQ0GþcÛ1tÔä4ašº¥• í]€ÆcîáÀØd}ØpÁåIºRb>úŸ÷Ù¿Žƒo›“Ue]3ÆgU‡äÊÊ–˜üöá<ŠÉu|ð0UƒÅá6p•6ƒ:ýCtºPJó†ýi©BOç ttj’ú ¸Ä›æ~¯¸¥T[+DÝñPЂˆ½óW©ÉUEw¥ø@¶¸†ØÌª ã#cΧãJRµŠÇ‰úÓG …:92¿ØóÚVÙÐD››fj®âÈXEç2×°íFÑÇÑZèc¼oƒÄ3ÔJ#•¯ë¨¯:úåœù=­%¥Xv`ÄlºY’ Ôm%šo7ŠÆ-Z[w+¶ç—„#rÃ%Xa;£±qÉšÁ݈T½¿×÷B{à@ ©ßüÀPÍÍj†ÌoImbnˉWñvÎ^FåÚn¤ Ý}SÏtH\ôn "ÝóñzG¦§J>DãîÈí|ñ£"}‡Q¯€ã:Ì™.Í"7ˆ‘!=ÕK©¦×à˜Øj¦6^4¯jسYálGÏ_)ñ¤1=DƹÊ>¯¥8¨bÝ_\ºcx£'›pïƒQ§2mx¹MG`ŒQ‹Â¾у6Ýxp„ݳ£ìur޳Û0ÉNðˆ.¯«·t¨^(Õ⧪³¿° ±`³—ß­;{äìs où°ÞTY^û÷°c •OÛÌÞþòc<ÉÔ1 zvk !jäVTv .«XEDô]>…USßÒ€Fo¹E$ÝÖ)pGq“Uý²Y?.ôºe0/¨ðÉ|@j“މÑz²ÇHByÚ-ä´GÖÈfÔº-)ˆæ>-‚Rª¢SÖ;;É8x6KÓFo>X4.QœàR4–‹³¬b.5:ªˆ {tÁûƒ¼Í|š?T¥³ÇšãrÔj8szÏc@jéqÿ›‹Feæ3œÈyåØXupÈÅj¡Ÿ¤"Që乑ÉDi)ìÞІӂUök¸ãØõŒÿ UÇ–04ÃZ¾ÑH]sjÀà‚\l÷Ÿôó«-Η|•zÐa}3¡:¹”­éñAߪ{ÅðAФZþ5.¯#³þ&‹G«ùäÄï®Åª$1µ,sàñó\÷héIÀú¥÷¶šö]á$Ä1¤Xb¶S3/´×Ë×nÃG Kð`¨†ÈâÓLV<–›üp‚Å*À=V'ÀŠvš Éþò’U›~–Gìè¼ÔTêfjsûÚjÍãr£Ñiß°iíÀöËнá´("žxBBû0|ÈS:(åK`…CëÈ}l/8ŸbW…ÏÎzÝw1Ð3ŸÖ¾³w/²‰Ôí!‡iü°±h>Í?ÂàÖ«¾–Ñ•œ)çßÑ-ÊìUsFžA4d\GŽþ»ü¸VÌè›X¹„!úu[~‡§Ay}ć»ôCãÎMz¢Ó®$zÇ#ŠÐè­•%íA hË©¬¬†¼‘´«ÅÖø‚ñŒ”d¶C:*rIþYÿ«7!¹!ªå¢kÈA®€¹{ˆ»Éí½›¥Û¸ éÄÍW.@'þÈ-ùéjs›­ÌMºý.ÚÚõr17ÊÔ¯ÿ.Ó@ˆóð@Ì(”Ô>‹hFWôÁ­Y`1J}áîjéæJT¶¦Ö¦bhK¢pú„uœ¨R?iúx›àŒ.ªGÛ“¾éþô•†’nÜ ´9v–Œó ¾k üOOÀDϪ”G0¡ÛJ?¤hæëNÍžÖ0¡dô÷Š,Xa|‡¡:GkØyk´ðT挶Àõ=\`ÁS–{„»R½FçÆÇ¡’›”§‰Ý/6-¡CFÇI) h2»§¢p¹xvÞ¶¶’ðв’þhŠ\3–ÿ„Pý$íߦ¢›éË…Œx1/Wªm ©µ`~Á10ä5 ûd¡¸AÇ0øyÛµMCTa‰²t‹5c hNí®"BZmi<Ð ¢¶ðA¢¨Ổr-䋎B$^_^—„N²ã³0Úû{æ±ùYúúłإd‡óµ¾T–D+ý¤ð=- …ž§¼.ghÅÀs3¾µ€ˆÔ®(ÿ3¼•úӮػ¹%ß4E3‘ù¦F„Eì-@ç2çÐßa=©IÅo-Sư€$€„•ÎzÇw<$">Ó B­Zð’-0ĤG´O‹&è±QH O‚|’D‹‘‘ciÓürL&„êæ3q=Z.|ÞPÒÞ./}©B…$¤Ü/²O‚CŸ‡xºÛ×.y37,– T»ïõ±pÄûý¾ºé»q­NhÉìïÍÔ¼m»È.óûÉ9aFS(ï|y4Mï< qöЕÉb)85Øb0;£ïQjÇæÎ´0U‘–ý‡\¿‚`ƒMò›µ¼AC¢ÍtëüQw³f?vˆ-¶ G"ƒjK㘭<æmÍkR‹‚/ˆ`¤ug¾í‹6(óâ­4–`9ç`c«Š+¶‹•gʽt¬ž¿ù‘Ðíuú„[)Ï;U/Òá¿KùˆWAÆjDZhl´"[g@ÌP&ÉôK 1&>4TÐë_HQþ¯<ÝBùþ²îµÐì”ÖØF»ÞšÛ€^uQ·šhš X.ŠûÏ®Ódó\†Ûaqœ¶Š]¼òìv"…Vy=ùë#N¥¤‰Ö¾ô—ÍBqÎhlWò¢@°Ëa2ž‹YDu•À袶ÙB¡p衚¥¸ûâê´q5½"²òÕ2»ZîiPÔ»únJ9k™†×»Êœ÷ã+®Ö_0Ð#J⓹Aµ×BFÈ#F.M@ÕjGiVjHx~íqf×p^ß ËšT]°ê–¦éw¢ñ¥Q…N{Q¬¨禉µ`™Ë {D²ô¢--59>‘³lÓ‹ùŸd,¾ùÍ’NÀȃ¢Ö‰ö]%fˆ|$õàº$§/ëõD=¤,¶×ÏA¶d“%Õǽu5lf@Dâèa dè)¨T:éEð¾áuE,¿ç@„ÃGC€Ë¤—ÓÆmOm:Üz1wsažJ ê^$Îtœ¡š ¬êݬU1´±ôm±(UUY• Ïôi"½Q*\Êè…ôúK‡Íåà:À¼¶øJRØÙœGÛõpæÂæþN·á½g «›56§~1.)TùçîN³š²à Õ/jÊÍÁ1@?€r§ïÇ‘–ÜùCŒ;a]ÚÝ. ^\E#ÎM^÷W“²`w§ÇUj•GUC‰¿2³b{8P#å(ÕC¤L£Er¢´lL»€€~Í>ù Ð.eŽÏWZ» £Wù5¯_˜d²ä8‰Pâœ1H8ôGûÔxi9çîìRçUÈ|5h4äÖÂfâbd˜™W(IHT´éüiâI…4&S¶¸â¦æRÙät7‹gðñÐô,ÄÇ.Ó|q{ßëô(wjr|^±^ÓË3¥™ÀLƒb^‡m&sR+Ù¡:`nóM@Ùò“©Xš*¾Ž`´ É@“?Íÿ4ŠÎ%‰öHŽPªë¼X&FRÕ~äÃV^Ås›iÌ2¿¯_.xCkÒ«_/¥UÒÖýÄs·b0áïᶸÂeÉÕqvzK õߢ0p¯º vl¼ÔZ@_¯0%&ÎákG2ئýÞ<‡eöõ¦ôf˜{¢üH…‰O)²hį• "ø2ï(Ñ[ß}.–ÿýòœÿDUõj43KC‡*5´ŒbÐë”òV  >ÚÙ1â88¡ \û¢l ¹…ŠåŸHçHb¶ÆZ…«/JëêRDÀNÔBÒNU ca»ŒÿAJ1À`¤cDÐCÖõe7KjùhŒšŠ^®c¹À¶–D9͵újí£a’ÊÝ}ömF4èZ̼6Ýÿ­á‰Hwfy8!?™¼ña/ÆcT›Ø@vÐ…$ô-YOÎΜªçÝö˜ûÑÃZÐu&#ãL^½5ִĠϾÃÐ(!`ïf¿Û€ü #È…£ÎƒŠÞ25\K±?Ðìe›\Ÿf½Ñp ¿‘sîá­c²åZÂEœõhÌÂ}„Õ¡_âF¬ˆ9iw§ØµGôþ¤ '}%Á˃ôçŽfEý`7÷%õEY[ƒ{s°­!èäÊûehãŽZ`³ÁÙ¨ã 5Æ‘ÿD—ÃX%®›öÊï„~ ¶œž<€c {‰Ü‚ìÐë ˜dë_(ÝÍ¥Éo¨wPÿG˜ aÂŽƒlQØÇz *‰úá©O ×(uÄ›;“#BVÜm«$`È[†fG‰“¯ü´¹Ä°ß«sG¥,aÛ3û) Ç‚&LtÑ›ˆ¸Iþ ™t‘ê^¬pÏîlC Ìñ"ϼ?œ¸õàà&ëAu¢¾Ý á:ô½ê_žilGELiýv‘U…ú˜ý'}ѪŽýjmv}¨æ\¾pOÆ;Úž~²­?æ^h¦ÑÒJfS¯-•›Þ²îZݲ-Ó©2Áþï?*Á…Srˆ:9ãí›8{+ƒ÷|«všDz‰*úäÅ9{ÐÁ„g•ăcèºÿŒP³Ñä†÷^ãú%+t û¢G9Ò"ü“ûÓ“‘ˆ]¼@U2œ©ràô,ã.Âï/.¡ÛQW¬(‚Y‘²uâÒê›þ=¥CaÊdØ´¸V}*|&1Ee¥'¨Ô^¨ù{ȬLÒ'\h3'Œ©VÃ1tO÷þçÜš¸ÔkáO¨ýY(Á­ Ší0äU5®ðMXk[b1i)Y}øm€û~q™¿!ŽDšýÏuDš¾FÍ’õïvçv˜c7Ëz+§ø¢RÌØª†»Kw@O?º>Ž'%'AYapSÄ~s+ÌíÝ=5BtÆ…‰§†‹Ài0Fâþ¥OŽù(¦ý¼§ÜN|Dd_sÓgd>j|nèÀPòI(ºöñh¼çeñ臄ìW­Êu_i8­åˆA.«+×éæŽ™ÞIÕ¯Öñx^È­.㡉 ’U‰›¼pæGèz¼Qd]°d¾Ù þ{ $•zѯËö)Iÿ=óeFŸâ”ÛOo£'ÐÚ8ÿz™~]|Ÿe73þe¯×˜ eþ?¢ ,}"gÙì²Vû,CÓî³®ß޳ÖDÒÃ`w±³QôØô+W1 ²aÙ×]N³õ‰‚ñ] I˜ª™m %ßœÕYó“ÿ‚Ä+¯õØ~äž©‰ú­°v&S–ÐLk#%=|J?¥ó’€®9Ê~ÊîÄr¢¶ñ²&JïúC–œfƒ%-·<å¨?ÒîT¦²ƒ#³ˆ¨jÇ›¹ä}$ýïÜåy:ZcJzy\ŸbÿP+ð@ñ£‚לèI1LôY¥œ‰:<€&Ü}ÄèÉ•N+¯¨}©¢{åÑÒÖ$ÆÒfhʦµþ4uؤJ¡"ù .<ÛU‰‹nRkM3´@æŠÝ{ Ćm /lÖúüý†à꘤}\G>¨ «‹ž ŒŠÞ$_)1Àþ­ GЭÁˆy3;ì0ªZÈÇ a‡^ÿKZÓÂâ›Ç£g#Ù„¨ Èj’²ÍBÃ-à×04Ôãëªîƒ¿\ãEõ™0cQH»>ë‰ém¹ _&À³KÍÝpéqÔ Æœó’š Ð¬v"¢F:¬ãý«\3GF‘å‡H½÷$hYU€Ó2¿¹ÁáÛÖ‹N˜bïí6P+¬eA;õëU8æF0+³Å‹@Æ Ûï6Iu%moªB!·dÞaA^Që}(Ø0-}"A<×\¿ýŒœÜ€è`7šÐ#~vRµ¼zoƒxX°Ü§VÒ$åGÅ íä%dëôž±TXNAvÒ(ß±žÖ_î( äšQ§ôc™ùïR(‹¯¹¸Ì\“×Í:3FÏp´w17è›Èò¿pàÍÿÇuƒ*¥+äæ¾‡½ìüͶ/ͤ`ž€ Õ$˱À_E¥àók¦ ®ŽìôE†"PAs5` ʦ¸Ú[`bô8kÒ0i,2-#¨äOA~Ö§,sË¥°±26þ ,áÅÅÙOÎÒ΋nøù ´ÀDÐë“p®' FèA*­ Çb©ŽP_ÆÝɧ‚¬’øÙ„–àN£ž«Ügz!qIÏ6Ù­º¤0ÏáÞùŽœét’Æo)Åìo”«±6Âͨîü£à Jãâl8¾«ágüµ:ïm[)w9_>Ù› K¥> 8¬íé§S‰Svk6 ŒÇù)äý·A2À“çÀ× ¤ç †Ä&3;Wò"Ò ö2O˜Š";‹vÍ¿éøŠß\Ü;Ðz]/€ôÒ´a»ô/>ãÿ þŸ×ŽÓ§]hÊf2¯4FŽm@Ê\üÜŽ¼:ž=,XËl¢;Nù7KlÀ¢$]VèlÛ&™†¯‡rÏš;¶»GÛ ÄS4š<ÖgÍyÆøµÕâvT}±Ni 9»à<½¦[rn¨…àÔ/ﯞøÀkzþV!Ò(¸{Òˆº@u+xIJSF<àÔƒYRT‰ûeØyÂr¯ÆŸRŸLs¿ÛºVOó®­—‘¡_K`QQ«0ºZ‚1@­#m¹«€(³ƒO[-Ö=ËŸþoè®#É jyä+Ö•®šN_7vÛâ¤IÔ¶DËøs¤E˜ݪòÜ[â…9ð:ÈG•‘ qâN²Þ‹ëÅ«‘J_ÉYI‹·¶…k´?m†(J§NFÏ_\)ÝêE¾fî²& J="gúÝIœIRu©icҨз8Ïu®pqÌñôÒ‡µhïõBèËï«ø`^/»­KìpÙPš* ­Ccqˆ‚ó'U¶>po­ì…Ù›_œe&*ûÛœÍ[“P”hñ¢žMkz9H(zùe@A£}Îó¤ˆzG9vv­·küo°‹¶]1ܹHèÁ‘¶ÎßåqG–퉢ÊR&!Õ6U_C¾¦i˜›ô±Ë¸q<vÕWXS³©žå Tl•VÜ;ù, eØÙ¶ˆ¦n©©4VwÓþĹ€.ÙAýÈû“µŒ¢¦\Òãui ìÿíæW*êSH£EÞS·-çî‡O—\›wRcÁñ†îµ‹Ô]¡¯–ÐO­}»jºË0ÄæÎ‘ìJ3 ¬¥ËÓ:ðQÔ:í¼©{„ÈTõÐM„w(/̳¸HH[ºt/"É9vi̹ø5õI'—™3…\¦F±h|.—ß«@3¨0gzbI=¶˜Î‘EƒáÞT‡–ÈçŠÅÙ+K¸»ÎL¡F[U^ÖR< mJúzÝ1„´¥ÎD‚ìYâï<úJoÄÉs!³dÁ¿>¬•ã÷Haø3†‡l®•_Rd ÂAþ®ä†ã’€£áÜœ÷•q &‚+Ç/8©‘ö-¿s%æ¿%ËïŸ&56FMë;×ÿÆÇp<8Yˆc²¬B4Ò>±Ú6ÿàͯ:tGú*±c\\íöJïW=Dqñšœ_êé}eYt¢·‡i7ÁëËÌ‚ü ޱæïzÎMàUžþ‰6Vê=QÜñ 0†êFy]Œ³Š+2ðèѽcÖ]Îkk1ŠiC;ìÝÀw þ’@¦=‚^VްI˜¯Ì%!3„k%!v\\ðkŽ(1f$þ‚Öî·”¿cÙLrÄÑÎ…¼ÌðkPµdÄ(³ž_»¾¶Hšóè†ÿ†Ñuæûk,"D… ¦— õN#"Þ8G%)t€™×¯T÷ñOÿ€ÅÛÇâ8Y[±ɻ޼®\3F$Û1ÕÃp¥çûØÇÓŽI¢åZ?²Ç“11äíÆ2C}­ÈµRøkò–X*õ Ú­ÙA7xè$F®:‘ƒ«Ü.^ÙõÄjv§Sü4L~©•õT[ÝÔUpJ´(Cg04¶|×™m¼Ö¬è§%iùšN &G†Y´Eò¶ô Vtç~AÝ> üñŸFˆ;<±ãZ1µ¨t|Ì8œim—¨¤ECpC¦vÙJb;m¢h¥hñÊs·?á)i]‡Ödµ€@DR=ïæ óÝõD];Q»gô9Í\‚ȼå£G§y$æO&$‘þ5šéÁê—NÔž"ôÃÀЊ%!i¡5ìX»ã­«1.‘nç¸9ºÅíîÏ¢ž8°AÃì'¾™~²IóÇk‹EBØZNP2Z‘%ô?†§þg%¥àðPÅ×2$è%öÍ©U¸Qvaø.,9S¾DŽ·îV'ï1Q¹ž°D¹øpºŒdïˆiÛýà¦@„ëñ—#C#k¬®!óYž^¯,f/XŒMfìm!_Ýåf%K/„°Ÿ%ß G6¯îk* zM­€H%–#é!Ãu žš(èXS'àŒ¶óänr!屨——®©›0ˆÕp9H&\ÒGK›w”ß”ö4ÙòÓ4«Ë/êO¾7¤÷¸½®O¯U;T§PÍ€@r«›t?bx/Æ©0ÅG¬àË—CÊSæÍUYá"¸ïüµtXé6 ƒ°w2Kä8Úóø¾T’®Ò)úw¦äñ¡Ä6ßÂg«Ù&*Ÿ;¹­>èõ¿Ít­¬ƒÛ UVÇúÙô|òì#^¢bÌÊEî1@Ãz“fûÔæ¾}3éIªÝôCŒ8Ô|ù«ñÿЖ§‡}‚‘R†ãµ(8§)…wYüÔ]˽òœÙ:È<9/È@/Û ¬Ü[ñ{l4ŒRaKdáZ~\‹°FÖ$èî°V ¶ë‹t ïï·y‹‹´N#ÖÇ‹µF¹].RØÈ×Î𠪥ިêïä­YÈ(Qç`úбaÝÑÙ1)Fœ»`x!QÂôfFl²üFDpñ_y:m 0ºž´:ûÊξ'¯ê›ªÉ¡’K/šþYІ w5[ÄŽyH,qÿèÙ¨Mƒ ž0…÷uºÈÁüÓ“#Ÿšô¬¿`7ŒcÄ!Þµnþ¨&&ÅnÒé“ök@hùïÛŽ«Ü®M~¹Yã9pÚÁ›f6 b™Ë±(çœXæö=õýþ"[tEQ?}VlG03ÏËÞˆÏ>Mʸw㋌|–‰/¸PzÓ­¯cl׉~HëÿÜ)=¾sw×*Âb訚(£©‚n`|W¯­Þ­>Û¢@+ÛìñÖ÷™¸`MPE&^¿ÎøÆmwqG|³¡7!m J" tÉ\C‰åÀÏMÝwFuSäåØÎ¥æü°g¶˜÷I6Uƒ[Ä«CiM3ù)P:â¡ôŽŽhkݱL'Õº€|[Xl‡É$n°Iøs £±Qø‡šâxy'š„.TNý7[>cCÞÀN•òkvZ»#†ðX^Øœþ¡˜pŒæS†Iç^¸§øV¤‡Å¸4gúTq(dÊéÁl;z^l˜nï›”),EiÆH]Û|>R~N lÄåBrÀî—?ÛÖ,Ãå+„šÞ/ ×å"b?×·üsvÄÖ4oœµĽ‡*â6pŸ˜©u\X’LÀc¬§} o(5ÿÊö!tÌX¸;ÓÀ⾚褼aÆ t·ó.¯zåp“›²µ_Ãsôè=ÐxÓðûáë:Y©Ž»L4sÛ|G šÜÒJj޵9 ÷ó—·v[îºùÉ™Ã'ÙÃrfñŽg&=š?%Oø% Îïö 7ÔòŒ"hz:MÙ;(•ya–2ŸÛ„5Svçèc°qÃÖÄ cói)¸‘½õÍ3?ùaðžî=¸@ÙÈ€/­Áiþ³‹â³ÜT½a$Ý(›àdbV×xìjcÍRæÅѨi[Dp®FNĺ«œŽæQÅñŸ$¬/ésj×禉•}óQ¥>Ý,K+ŒÕ‘þfêú‘ád€bü~º )Ê™•Œ‚?þþ­ðÅг†,o¦Ö°í/‰×'5ô¦ ±wªäFxrîûPi•ÓO×Ï%ñcçÖÔ”ÎÈÌêS<=¼:ð¦Ç¦ Yàg2»ƒã $P×öCÀèTÕžîâ8 G—šfŽÂPÿ»Ì¹h¼× ÎtTþÆ%'Í«§›àÆ(ý@r °ù[œWuØæ=,4´SO‘$àük@ÿ‘Ùÿzc/>Ýg+wCϵ%ªýùµÆš®Ï¶taCÞ¦IØq ˜°=ĺWVµ\ì|%C)ä–ãªDx@³•!t˜!›¹8Žóe·=øÐu¿øpz—›º&ë.‡¼µ žQ(Bn0ûŸ)?‚I%‡Bp»GáDe/$ô ï!Õ3UÈ"ë§D[^jê©å1mFØP£ò‰^g¥=uíøézðá«úÖ±&·ñnžþÍ10ŒYÀ-b’tiÆI žâ¾_tÜT+æƒrJí¬ ó )SÏbêg"¯ÔàŸeq_¾Kü²(’£_òQ¬Ât½ÍÕŒ4qü5ç¾} |QªÇtCq¢[6Ib70•1P0¼T#[ècçBxùaìH~””ù‚€ø9®~ÿ¸w¦tûn¯3ÇZ ŸËGB "&Ëj놬x‰’ÖÂ./õvæAëÄæ²H=œ$b£. Fò¹´ßG\KÑ­%'óõˆ÷àŒD26ÓÆ: Õ¢@• R»¨fµìf šÝ…¹Ù3ú(ïÔz=Ѭör6Xüðˆjë=l‰†š~$ Es´F}ýº™wñ›“3˜)-&'pŘª$™t+ẃ#V·úzšâ¦™+•.Lƒ>|G[®påêÝ~ùߨo—Ѧ}GV‹ãØ î¼QyÉÇ^‹RùìÙÀE#?«k…{ÄbÒ2 [Q WzGF$2¼þ~õoI¥È' ú‹!mgŒ¿à‡†¹=ÀA¯-hCÞãæpjI¬©¥óIì|¬­*\(Žtô_O$} µ i±‰Ê°ˆI”4†Nß~ç,W3:༖è͵á^c-\Î!—r.· ¯­Iþ¨ òž8bU$8þÔ ¿1Úð—" SúX…Cì†@ù˜Ÿ¿;ÞæÛþ¤È¤M«î?2O9g·m§ üX?vÔ€y‹É¡Ðt´icŸ?}›`e)}ÛϺm…ò‰¥µÿì÷ôab‰àÝpìãÎ Ÿ²îSÊ&Âg¨ÀPì‚BÝÝ ¦4Y€qçl°Âô«øˆé°}šðæ;‘´ôÌAW%N_šÏ‚Q!¬p .Úæ5 ›¨„rc¥—™ÝÐþ6:ÍZòž£ìC7·l&ßæq±ý¼Ⴜ)·XàLåF-HÁ<ØsdbEX2ýjï;ÀÊJÑ»7c‘qg™¾_â ÇlŠw¤ÍV‘:7 «ÀQ(®üìmr^óà´^š"¨E³-ìû‹ô É$4Š·Cæ[ÿr½ËñÉ—kƒ>Æyºx-N!_¸çék–Ý¯à“€Á¯á*L¼à®û ™ E&¹Òð s îZ}õÄ蟀Æ_MêoËÌè5Ôë?Åo ÷¨v¯ŒÄ”íÎâ-„ÒOEmWc³>­¸~=âšËD67_òˆŽv^Æ•y½Zºqü – vÆÅÓ}Ò1l_¦² ¢ÎƵ Å2.© ™h(®VÓ•Ø/áF1 ï#¹¼gºŸÖÿïêbÌ’.ç–ÙÛ/ÖOȯ8÷ÿîsžŽ¿á@4ín%ÌÎ6õx$Í£RIæûã¥ÖºˆÏ¯ ô©Rrž›ö/12ã@a«Ý•Ä ºI¡™`CìñqIH ȦÆ×w§³à(sþØÉ‰aROà»Gê|XA\ÍuïíÁ„fêÂ%”&bã3an þûÁË”…Põé}¯ìeø~7ºÎ»A™ÇKÿh¯ÝR¤RTNA0ö^pw2BáÓÄYQ÷ö.êgDÌÅ­™þŒKf×øi¡¤ôåˆýîù}‹»'àת zlì ±wdo¥:÷/1½²·ìOö!È^Ö¬ÅÙ•­BIëFÉZL„);@ÅlŽ4Ìý åÐ+ ºÞdp奯²—¶¤4û»÷°B϶äM­^î…yõ´ü—¬§Œ'I UàñжüØÊÙï#ö2׳‘fÉÙé=׊ó¥-ìéZΪ}OQ¨ êõ¬¢oMùkîW‡Ê„ Ž÷F€‘DùøÍÞé¿(þ÷‹ª¤×øvk¤„Œ.Õµ^_#c¦x+÷½îA£,;`EP¡PüDKwá´~ÎÁZý“úQ°Æé,!{”~mˆ/]×ä’\³‹šdS¨›³Ü/+)!×´n‘¨ÝP É]6&Bë!Ö;4CìVa‘ë‘C©7C –Ú7Gxôsæèácý¶7žgãMbЉ’Ö:*u†C·x@“Jè‚øXæNå¦÷¥ãŽ;rnÓþÈ}¤žÞ(I€P >'F9(ÇÙÕýzñŒ³½ÛPFa VØ!ÆÛEb%R%:6È([Ë8©Ÿ°ë<œd(ï—?ÅÚDX/‘8Ž{Æ 6Ý óƒd2óÔ•o°ÌWqÅóCYhÔyngÿLä5gü©Zב" Ë|N‹Ï =‚—É8ö¤¨ÎZüï;.¢¥j!ËÐQFšùÌjñù$÷§õá»u©]údÀ8¾È2°-¨ 0ß ÍŽ—æç^8êŠìòê©%Гkp-oÇ¥È —y…¢ól+¢˜wÎ5[Žå´Tçèûž€G®°èÜô0]/I•K3O0¯'שv+s­?ž¼|‰2“Vèe1oc-€RÛêÜT¢ÀtÝF’Ë2š["¦ÔÅ|ƒ8ÕE,wé_ ‘•å.)$Ð0´t˜ Ð¥Tþ¶ ¼d]r{~ Q“no ÒÀ/' §FÖù¼RE. Âå\±4ÖX«?Ù`Põ'Ì­Ñn·8ÓÅõs5Îj÷;MÇþ" „¼£{QŒ›5»1‘a4Ò:‰fžÊŒ–3½I+hޱe±Þ1»œV­Ë¢MÒð CMZ°’ùÓr¿ÿ ¾¥¿Tõ²ÉÞ\*kS2ðƒ8Û…ÂÃ+Ëï¦JißùÌŒ­¡!™ë"é/ñ@•H9Ö{\R,¢u­[ƒ>Õ™%¶Vìm ő͉ƒ>4`LuW´ ñr†FYt—WóûÔà?ˆ’gså[œ/È$¨¥2Ýæ ñ·Šöâ±mJñºéo@Z›“ˆX7Ñg¤š£š¥m‡=Úᘫå‹,£…iZž¹ŽC}ûQr‘ó©(ýëœúj>Í_€QÙìøÓu0A½ƒ¨2œI":x¦Eº¹MužF‚:1Ä»‚å€n–ßoï[µÂ6GÈß÷º>®ì¦šæ:¬ôIX´ÑïÌwtÛyz/àù&srð‡Ïàqb|øµ7õµ`4OñX‚ób³ D:$óì!*þÊÄãÈ×Pq‹:úOd„z°1³Þ¼ ÄÚ{N¬<ÙÝT­y¦ê·sòœ&Öc9ì6o‚v²~ÝxUƒû¤%ˆ@¤ĽµiârTuau}>¼x–KI<TKÝ´´ÞØ€0­ºÿwáV”Óý« 5Õ7È~]D×:þ–*,2½­ÀјGDÝŸª }°e›Èîmd€v ÐÎC $gJ¨|Kì8Ù gN¨f…ú‰¶.«¸Ã€‰©ìºÕÏK—ˆZÏã¤[³ÁѹȋøˆD_|s`üÌa4 Ë[`8»©®H±‹ïf:e4¥}³Á„ª2,‚pJméÕ2·l£ç@´Q¤)‹Ð r“ÄVXh“Q梜ªÇ•Olâ*("VÞÕØ&Íê1uQÿ¯á»r™û‹aœtRæáÿõ‡FŽWôDûlž>ƒB¯'&˜ · Ô@,Ð ^aì 'Ÿ|¼yÚÈu/-€‡ž#Vj¯ï¤ÿ2æÕôµü8ÐF¬ÆU;vj wñ&ê Zܶn²´¼U¸3pEe ç …/Ϲ|j¦ÊN­¼ê»q'Ád€4·™Ézô¬h¿þ²LÔÓIȰ@‘O0•Z÷èu+÷{ÖM«LX&ZÂÎ,KäÁû[©ˆ…bôñMˆ| ß¾˜S96AK°„kqƒÇ…¬çGOx ê|ÆŒõÖ^fÝùÜ ËPX…$µ»„«2h Y))|=bÆ•YâXàn¿µ`§œ”G¶—ÐÇýKª¶Ë@W®(Š”w@¢êA¢a¶ñÄiÓtݨAiÆ”ÿ=Þèº 9ƒN«ñò†F>ßgÄ„Ø:J5=ZX(J«Ö®cÆMƒ0{æú8ïÝ7xK€)ƒ{r•ÙA\j\› wؾ){2›÷S#ï,ëì °Ï<é¯bãYaÎ0ý±Ý6ý)¯Hµ‘ÙSÒô$ò©èmüºÖÔ è2Ò.Ö«äRBÿ-§È©\ÏÈ)¢²S;¯}í«¦âÖ/b‰ÅÂÚÅ“¥Yë= ÁüŒPÒ'1.R×Q2x=)†ÐPŽ*žâ|{9òy»C˜d̼L¼Pû× ×2Ö·{ ó«…³¦PláÄ;µô()%…ò€,ÌH¾1C5°÷®2€ŠïŽü‹® †»„~4›@›é¡<^’ã»nÌ-AÁ·ºþl„¨³Âqç3I†dskÓK%kØþ®ŒAøl×âÛ1lí@X7XOɳ‡ƒcûÞ!õ§ ²ì\ñÙN®ö®íEÔ!ëx˜(›kÚƒsÌæ-P % Rè&ò9fĨ.«ç£«‡‘¼Î.o·+„ÖÚrÑ!È–—|øJëá™rÇqÖ¢nÚ´Óª¥ÀMLnÀs¡–\/‡tô¶HÙžEñ3ÿu¾º“¾½G¢3r™(ŠZ ,-¤½†bìVZÞcXÂJ²Ij³p÷ž«Þ¨™éÙpϪEK.Nñg¯çMRt¼ˆR©ÚZÓ"‰JR$—k4éebvàÙÚ¸Kì Ç+Rhèür5Ž«|yß¹O²)Gc¦?\uZX&OuÆÜ¦d°ÌÂé5ãý«Ðµà"µ¢~,çH–. ¥R6L,¦àH‹‹†¶QsjºE߯˜/~WçEYm³jû–Å,¿Òƒä–±’æ}5`¾«O®À×)ÞvYÈ)NûÙ¢;b»¥-ŠÆ»D÷)0À+øó®³Sýg}¸î-JUÇ&Õh?=Uá^ÏÿLä{Û> ч+­Ñ˜&mÑòö©¥÷YdŽ2õÍYû¨¸ÿç¹3!¸1Yú ‹e~ȨVûm­ÙΚ³< ôúˆœöÙf^BøÉ]ê¤aÇîzUŽùAC7ÿ$7Ëé[:˜wíÙ\U^gš¡%ÈUf•a·ÊQiËÙAHÕÐûÌ ŽA }U?M D¾a¡° aª^­² |Èåǃ¯¢û©LszØ­…10Xõ^îÒCgpQ’³ýDZ#ñÅ-I²Aˆkø¬5Lì; ˜ Ä¶‹Ðõ®Ÿ BÅÐZï^Ë ‰8i¬¨¹XÈ»gåý°á+æ¬D;E-rØ«ol—¦ ˜ìÏ‘Ö$º< éÜŸo™ƒ óOYÃáœûªÁEŽ€0øÆœoåÒLcÒà }gÎr¤ó4P«œFpßÁVD¦x†-Úrs¬.7é‹cmgY̓ØPù[R¯©…L§Xù¶p®¯°¸0~ ¯|}*‚„ZÊçQ‚…/L­©BX¥ oãø£Üö5‰ÕÝ8sâaGtõ)Rt§[Ó ºY&ÿ2³€L×Áé6¯yK=Ö¢™Ýþ­Tê_ôô¿—°,2w­?U”«L=›– 6ŽÍ’ê©_¢ ã¼<Ò×W§H®QYa&hÔ7…fóFgýúöwþ‚Ð-è9TLćÁQR†ÇXë7ñHûü9–NÌŠØÊÒ›Ïå“»¾·þI÷þ$ÊV%ßÊÈÄziþÕÊÜЇ¢òÿ¦p”{ïí» Àà™ê¹eµÿinv 9इ¡ú­æR6åD¼7?{và )/¬R†"ZÀælü-2ȼñB¡ˆ•ˆ2sío&÷ãêC¥ýwµnë½¾Öéï¾ê%½¤» Ñ÷…r…)³}0Ä÷Ö}k5ýrG¦ïvÊ-'JºäìïÓØôöÒwnO5¯Ðà”±_ê+=áÚè0/pðG‰ Îë”^÷äï²ÁGºeåb2½Éö b []Í¥p‰;——–nB}o£yyƶt)ËÇÛvO<š;ùR÷~ÑajNÛÎß‹{¥È–‡Øm´ÇÍ-A¹¼½…'é£ë0=ÞµiÅ'¾ÄN,5Ñkád$$’7Hhý#ƒ—»„‰^ਪMóÑÈ~dxkPß\%I„Š®J*Õn£Áä/Èœ…QÅ<$à>¦ªn·×T‘š]Aõ½á@xz>PÓ–tüR}àrëják%¿î¸r;±çýñ |{Û­«¶Ì4ƒMž.ÊZº]éúü­)˜¢‘™U½†RŸœ6d¸®>kíNu'@Q…²úá°íuöµþ4&¡[ãŽv~[ÙËU7‘T#Ä9÷;¢×ÝÌ5ðÈ ¤%—Zþµ²Ó%µA¶¿Ä>>¤ãµG˜†Y#y¡•ûÎøÚà÷Tϡʣ˜œ:c¦ ‡öΨgîZÁÝeš_T9ÅšÎ4„fµíªO1_÷)H2°_ãÞœ˜ {­âˆÕ0¼UØÚg3õCDlNêÎ)Òàj»TjÞ~,÷Po3ÄoÒžˆ>ðT¶Û:Ww]ò-VåÐ ØPж1ßBîc*s“0]ÚN(ZyþÞÔëO÷k¦áMPÞ©nf½ Q¸JQä!*ƒÂ)(FPžqz.vwÙ é–´Äßè/F›VÕª$þÃéi Ê›/v+uÔZXyÉ@ø)+@{œpö2÷À#'ŸŽˆqá´-a¬¨ {ðÐëbÂQ` »*0DxtÃcÜî~°ÙPÕ/•€w¶i|ÑÛ}h¼¿øH›‡fDÈÚƒï# Íêaǰ–9j:òï&^ž÷ÌhìíÝØbí£!›rÇùs¹Â%„WÞéaEk DôvçJOÖ˜’„zlæ?õ ë{Æ@²Ù;áì¦u¯x ðØË/€ Ÿ:ybA9µ'ì´èòaÆo×T§”‘R±]êÀ¡>²!¬™€æñ\+@Ñ ú1Ý:?Hi*ê›5-G3‰©µÇ¾ÌîZ~xGÏG¨A‹ªjblµÀÔJ1%ûkäÒB°a´PÉ<+× !‡›2k¤©Æ}?&Šõ¾&>ê6ZæLá‰^óaR‰;þ=ì‰C¦<×Ðù¬8fä6ª,a5M `Âÿu·¯DÍÊî g/zÜ/C42Ž8‰c¡­+v‰±ø}ú::ðñ…›,€¤š¿£R<ÈŒu«o¦¨”5]cË.®ØÆo+ƒàéHãnÑCuZ°öú_Øã—¹2÷‡íœ+¢œrÞÓ$ÙÙT™¶×6Õä¼ì¬špPçöD…žýGSÄqÏöª{­|-6#ëƒÍSÏ&x,M W¢„ø[P÷ì„Xè±É¶”²Ç¼—(1sϽ«¯Žš¦7ÅŠ:VF©µ©î‚'§kÃÄÓù{í‚׃¬Cyk¿Aq´ÒZØzɽ sú²7¬¢š‚[ÂnKlA`óèÚò¿¶4~RY96tÞ—áÝ‹}‡??6Á¿U–,ØÎÝí%r”æ w`!ï´óD†$³z³Ñô0­®CÊ´nt8üp(Äãt õkdOàÄÝòÝ“ʲ„ûTŸ¡ç%hÒOðŠ²œQ܆ºâ‡Ï£`¿®ùώDZcÞ@ýßš£NØ$º»k¼>$ý̯§çˆ]fx‹J¥aá,RIÎë‚ãgk©o°&ád¿3Feɪƒ™Ê^Dü_W;FvÜ{wÖWTÄUÎ/ú”{fx˜aîu¾j5 )¹Íß>Òï!Ó;ت—_~mKÎ(Å"ŸÏš¢r‹L;ŸP¥¿î˜ÑýYêÌyB!ÏtCOކgô Œ!yýñëHÀE•r©ZĆ¡*ì+<øv™'‹þù_Ëá³¾Þ²ésnæ@‡qi°ïÓÍÖ$5]š\¢„[±ßI¢0@윀¬حݶ šä)‚)iTãv}#|ꯄx<ÙX¾­d=Pòò‹M2æÒÆ8®k[LdÞr·²ÐKX›óÏ jz”„§mJqR‡ï~¾ý”r³hÑÌ`~vôM£¦Ý3va™˜b·Ä­ö 1ç'«ÂÇ[YV,9ù,™ìðœ÷H¬3“­ô©HÉ%Lð~€|:oüŒÏ€ÉîM4råEÈý×sÒGx˜¶M$™ƒZ’‰&Ø/²]xd½>%¼=ªSÍI‰wÔþɉƒIÒÛ]ðnž¶y8Ðöt½ `±æ*4T²¼å;ï)Ži||Pí¼¾÷AO“´×ªÓ;VÏòî ìòÓ•Ö-Mb0›P.ˆñ³iA›'xU¨po›s|QCd+2¬jWøLJq³‚?¦ZÜþ¶Aê§¾ŸÉÙi·@Ü|ñ$ãº*4¾!V¯åõg3˜ÙPÑÍø±›]ËÛ|uq§ÜÞQ  ¿¯×ºß£n®H'-""*YFè",QÄy›„¬x‰§ÄÌ´Åœ·0¨wŸ À¼o*»Ô§Ã,Ø—GÕ%Ø©ƒ˜²ò'e½Ý}ÝÀÊAGyÖÛH¹[dR© Š*Z]ÝŸœôЇO{Ü÷.yålÁ™€#þÊ…s'‘¾n&¥gÙDR;‹á5Åì= bÊÔ8ÕOíòUÏÔÕ\S)2 ¼ä3ç^Œ„ NsúŒòweè–é¶þ¼8èWn¥×ïö!Ì]k´þ}Ò¨»Oý–o\ÔÁ÷´t®–)½É&LæÚHáïqK Ñ;Òò.ý”ÓÐÿÐÄ ª?ì 4ê¤]c¨4cae)Æ"€Ù,DZ½À™žG˜N)Yù¤É dA´²n·(álÓ„1ÛS§ˆ0A”ïë¯BòÈ"‡¬;å¿HƒŽ”7o ø,CO]i›¯Z{›¼Q†æ¨ONqurêx ΤÀî]0QÐzþõ2:H”'áð›±lÓ:æóu(°Hb-[ˆ&%ö’(߬G!з]iGú"êücäÖ*'ÑØ„Îl‘»Yš7Í÷þ[ñd@äá##6Ñ`‹>ÑÞ|#û[Ò\x®6‰ Ž„ Û flK]¼ÆrßS­P›¨'T-ËÈ6‰Ltb÷%öz¶åÛ:‹òûf(]'—A0;¥Ô¯S ¥:$¾yp6Pé}bbèm¯«cÞ‚åR[ì×B]e­ô r‚¬ç•ü\ƒ]Æ…ïLòTn†#ûÓVá`‡™»DMйÖ!ÿ[7å\¢c ⛄o4Þ^á`¦¥æ°á÷¿ÃŽÒ`àû }5U[ÑœÔë[Hš!%#ÁØêñAÐÞgEæ‰9ú÷*áÌfŸ$Wäk6{o¦] ªAÝÇóMÃDÝ ‡ú"|câZE»R+D/­|~zžU‡£²»ÚhÖSÕÍÐÞUFó«zjƒ~=¦XŽcáÊ5ßúø”{bnªLÛÅ~Ç®¦³jÈ0•tÕñsÓ*d²ä M¤‡ÿà Wˆî5ü•LYÑ|¥§óv^`¿}>Ë:ßžöš-&¨ ´ÐU"º±»Ö0ÖÌäEb¥wR¤ã§¸œî¼T¶/ÒÚ ¡'¼êÙ×3LžÇá5d¸nN £®Ü¿ŸËNÙ’0³ô¬ÂéûбçN*λ$HHX¨!eó³’…<ºP6íÏ7€=$¤£0GL]ÇúmdÖ€Ÿ`tŸ†'/â:>«®É:á5zKB‹Ø‘’uÈøF&Ù?äàÔ8.Ü'ˆÏ‘À­ÁŠ|÷! M,*  P)¬¢Ñð‰†ò(¿³lÁ!å;Jå®k¾z@•ä“Wžw ûÅò߸ބږ$Äb0êÂ_¯QyjºóޱÁ†5 CÏ߀êb[KX†1!·Pr“ O@?ºë&ˆ\]¥ÚºÈHI,:ÿÍÜ×× Ÿé>çv¹äDN…o±C2 Ê2#×ÙååH40 á|dVÍOæ\-2ÁCSG‘97Sâ`ÄñmÛ¬._COÿé®b(÷Ø,l[¼c•Ü7|ñžüÅNPŠ·Ze)t ám‡YcÏt«àl3gŒG$5\› 37Jdœ|ɈÕ\zê¾ëТ‰¯{—Ác^¾°B8Ô2 (Z"çG˜ "ÿxæ»2 ©_åALˆZEˆLX¢O¢‚§7úU¥å!§Š|-¯!Ò +•4"ÎAF–䢵,‰âŸ¶¢txf‚“Ã0r þ.a¦‡â†ÂÅ¿¿‘“d² ,Zm©¬‚^¨Æï×ÕhÒ[å:›ÝÛâ)I *Žºi¡ëPäÙóÍÓ¶9&ŽÄ’ì:0‚וEŽ|º*ÜZ•Ù]W[ñÜÐ}‹Ô•jå©Nä®G1Z{€ÈC !í:ᆠkƒ‡ÚõÈ´¥» Åvº˜pU3{ò^õëËjq´SLý$üòìù€ZK{W›66xb¢Y"¾^š½í@™ÇЪ](ðÃj÷È«ÀšG‡à­/ôÖm½ÇÒ¥ÿ/‹]{Dt¥^µ1F›GT¥áñZlãD¹ÚàäÓn—§5³ÿ]/zX'ÊïËéH͈jÛö&êV‘tTŸØ~¬ž~º}wAÐ×#xKÓᄘå ð'ÒŒIh„Ç´1Ÿöþ¶’¯èô<Øôœ{mn±§ú ñ'¶8¢šw/– j¶ÛÌк¨Ì§ÿvÌë•ÏõÇŒef‘qŽl^£ì#¿ë&p7Ë éÛÞGôþ_[xBг”p¨†®XN#Eá³xÛ*5AÁS ¬¢V`½Û×zî#uyç"zˆÇ@¿gš Y^Íý¶ÊW{ž±þbkÓšqËDg,å È‡Ãš37¬žËaƒZNPáà²ûZ€‘†¾to&âUu–±‚¶øYë7%„7] Zí³½±ä°9'ûA}=ô-!ëFùþ+­ƒÌà›y›ý“ÄZíìnerç2>„úSbŽo 2˜òÑ^;"_;Tždùö%RQÚ¯n䡜\«ÞÊáPeq­z†¼‚×O¿Q¹9±Œ3qD)hà2ù:qŠÁKòf¥Õ± ˜uÆT#½ß(f.ÄÑqµ¤ Áà=9Ú4§Hq>âvÒͧŸ¹¥­ué   t­fÕf"a¼™b E=¹­Ÿ€ž/ŸíYqÑã;ì a7°¬c‰NBŒéð>ÐC?ï¦UÒdŒ9ò4±° Æ0¹Q: š9½®ÅóïxjÉŠÀ£·€v/–(Uœo ­¸Q%mÓµ™µoÆ4çb:<´ÿ!¨áMOw¸ÈJÈS?aL¡;øq›Ë2ÊõÈj™q¢3e¤×Ìù‹¹…Ãf•WêRÎ}øœ_BÈ ·MÈó¢é AWL’c¯>nÙvÇÛy‹’ʼ.»Z¥? ÅXúÖVÓSÌèPBòDžO_#‘og¾O¿»àBÀËmËãªb»~%D4£o’ÓVµ å$»úøç¬WÍmñÇ•Š(†Ðã:»ÙIx´É†^W/Kºk:`P_á+#?¬1o¿öôYtý ãÀÄ8É"õÍ#&ˆajzÜCnÀž75‹y „ŒœÙÄÖqºz=í^¬[òüUÎt÷SKu› äâ1A;ˆÚ& £ƒÊ°]YŠt¿Z&Fi /á„0ž¿ ³NÞͪŒ¢‡‘˜„£óÃIô#‚ƒHäëd‰•´)=¶}ÖjlÃ/zÅ? ~°*† ÷hšçÅAXãL×H7ÍGŸTrX­}oü1ž–ÐÌëp`ê×¾IX_üYè›ZKé?Úèý ³\öYõ  müßmŸ|²¨Úog¯.‰>|„Ȧ# щQÓ¼øT<ßJÓe“SõL@át³MR5=ŸYbˆûp ÷e¥xÑù¶”â’·h÷^ÒÂޑ流~üö\âN€Våb—T)”å~M9‡0üìPb­àÄÝÍz÷2볟äzVev:ãM„ó!úéOgâ÷FÅo“(S8™ßˆaZ}‘5õy=”ÔF–m9"îÊ¢Rï(R—nû½‡“±À[fu"°Ýx9éM†B ÝA~îrYä cGëô£oéÿ“"îñ©ò)iy_›M)p÷þ0¥À*Ù»‡<ªk…» ªU’jLlíž§óÑr¦1÷8P ˜¤gk ÞNž€Èÿ©»«Lkÿ9…*N|ª&—¨=ŠhàR¨. B5Ñ ¥Ž(ã×"Pc'\Ü®)kk*Óñp#ÙÑëoèUΟC¤á³¹æHpQ+†ôšuttñÔ¾Cö±cV Á(„8tÎØö•Hì[Ð ’l=jê ì6ytø~+Ä«ð›ÅšW ¼]ž±èömºöFØ,,> ÃlÒPl­j'Ù Ÿ¸6qT„>èÜéb.Mžé€u2¦ÝÖú4qqhІþkè…–Uä…‰ºÖQš^Ñ4dµñ â+Ï¥‘=³ØÁÐÔçH%Ò˜ƒÌ/´¯Ãe”¬îÈ øŸ¶ nê~œV§ÇQÝW×t>è«–QKãÀÕm‡:Ò‡OFOÇ/ZÓ•V¶>iSÌÿ X?ôg£_BxxÕ•W/ßðñî­GqW`ã²;[—üÖ[—0©K)‹P"LØ‚¯6ãcÕõ2|b9)Ý~«N_´ä’#ævþV bEÓqŸù8\èl/n:Ìœ &Enãß0–½Ê e½Ÿ\ï}1Ϊã-=ùĉ¡Ø$G]…ÿFö!^]s@ü£I5Ööˆt1—ÖB….™ªˆ¼Ðlô2ŠÿùƒuHHÌ?ö‘gy‚EE¿¾gVl;²bŸ—£ÕrIõµ«—¯ÌBŒ®ÊßÜ!ðÇ—·Bk§b‚ZöÚÜáh0 dŒ«ù°tgñýþµˆâL'ö¹—8dªÒ£ fº˜¾øðuŒNœz$Ã×ÈR#|“Há âÀ¡S‹¬½›ŒÙH(Ú;þôÍBn\°ô4‚±«{ƒÀ ½0øMGÉû†AÝ#O›ä½+Ìb¼®§~eš-ËL±r¤QÂ6h-Ðí,µÃQüÿ ›Æ2së~rO”· žüºâ±'¦§O%,íÈ¿V[óã å—ú`úœÍÌÖ’äëòx#%3еóm*uj/Ëï”-Zd}o´ßù€¼¯ aö. YËàt(_Êåí}ÌZäîOÌ×Ðõøñ1,~ü1ûY€=\XÔ ÒÈB‚ßf …†àjP$ïqÿc>äªáxXa¯žf^£O Z¬¬ÚØ€ûÉ QÄÃgqƒ Ëx€…BB<œÌŠ„6ô2‘!ŸxqÌaàæ”°½r͉íÙD‘0Wý® ñUÉ™eÈû£¨aÁ8B<ú"Œ7™’ÍÃçzÓ@4Ur÷¯Ù'tvæó%¿tm!´æý‹ÊÃÏÜMü¸…²®Å?ÁÏ@ŒâdDÿ€£2`.›ès3Oà?2s¤ úÓòT~ó@œ‡¨ c¨FºJ=¶÷ó0M€”"áÙÒ7RPè¦cTᡆ‘q`ýWMhŽñÔa¨…'qœlKH²P$ºü9UpÒ$PÁvâÕ/úøþ qå½Ë„î $†f'%w%€ÂHSŒ›>¸™êvK %‰¥^8ÄÁ¹E¤Ò¾RÍJ‚ Ø “ÍÉÏÐl¢uÄÚè>ãCOÇt>%?űŽ×áXt ð2ú¥îêbzr¢Ï•ø^ØCgj¦CAPRÍÔ{¾_˜W<èM2UÐßÔ3ë~YÊ-£n\0¿_Pª R6 ÛÑL*—õûЀ¤“ #J³ä=°½wxoRX–W‘»’æ3bïUÙ¨c<’ΞóË0¡Ï:{ýé¯-¯xá €…ð)¥™‡†­Ø«âµÝÊ+¡! »¨|”×2ïÆ\ƒïú}âjüA*}YËzCЇôZç¦Í{0\®ÒI÷È=|Œ7(..Ülj×rbìþ󵌡t ò³T§”#ë”׋ |•°¹%‘ø>¾½,‹ë¹<—{Ü-B¡:ÕFz{%,·7 Zîµþyî›rŸÜu°³UgÙÒ=šž†ÁG©èWÎ]);¹f¾ÎÎ6”ôlݨ̛%߈b†k»ëÚc>2Õ«5[´Ÿ‰a½ÒnV”]!tè7I†æc«Ab¯ÐŒÛ<‰V¥½Ý‹wÛmŽßÊTLŽðñe—dŸ¸#{oÞv鵺 õt˜A2+™Çâ2¢çþJ“ŠÐ L° Ë…;²á0 #¯ÒƵ8¯&Ñàônµ ˆø¼Ln[ýʹ¹>I¯­bßÄ5Ôyº™ ~%ª‡ 2]Ø’…±.ZàJœñGê(Ðê¾ö?…sà‚ýôæ“tAóN†[$¹Ëmxk Åž¹™ÙÌ„jÎÛ£»Q"â& G0Ø¢P—ae ¹—Â8Ö ºËæŠ~þK Pô ‰ Ç &Ù)cPô'ë3ñEzýûE‘`Y|†¦þ5—“ŽLƒë²ÀCl± \îÄ.+QYJ~6Ó¹éèCâÇ…¯}éÞ3¨uÅŠøm¸Ðy uQý„¿ÚfŒµ™)üÓÓac;&‰(DÇ@ØÇ',¡_Âuï\T«ù»^RÞÜ9.Ö±“½šë­VÝš$ŒèÔÖ<™êD"!¥‡ç¥!¬*҉ʀ¦ú­¸«¸ÔSʘQËîö™~XÙñR ô,Š·+NšgQ5Ä^¨÷Ûž1êRVu]¹ya3™HѾՉ½ìí¢ãN®ƒT!&¤±Â>SRÄÇ\åùðÆcólÔj9\7’àí¸1ÔÚ¹ ˆÚBõ¬…&¤MunÊïWËPú8ÀµïëüÈ<‹õ  qÐÛkßn±æÅ ,µçã —ÈœBðÜvÚ-Ò„v¯\†’ cæ»\)&ˆ÷Èl×€,ûE€T:¦,9z1/iŒÄ2¨!7)¾JÔ¹g)ëÉ(M²(J(sžoh³ù²“úYëVò¤ïå—Þ×€Ä3QH;5 A˘ë™"Smé]jCnV<Ç͸$«¥·¿ÎA'Âp~qþËÌz‚2°>`ðÁnê>Jíd-?åþÈŠˆUGå…¿z±?’ð*LlË÷J€ü‚D¹¬{ÿ—ËišbEÑ"F¢ðŒ ¥;ãÔ©rï ÿgGM…ɶúڸɶÚ÷p93šbjo…× êU¾ªp:ª}(ª×¿8ûJjóÿ`ÁÅ?a×ÉzØZ§wáûKØ0r˜JÕUÐo=DY:ΰe,¦ø¡ø^m¤kÞ;`/ÅQ’–bC¬ˆ•Ø®M˜QÏ(¬î¤,WÉ3«$p[YÖAa7On-ö‰þMºÊWUîb9à@ Û†5’Hg5)xšDþÙÌ6š¶%Ç÷¢ JbóÜIM0ÍokªE 0€& Tt¿iÿÛ@;fÍ×x-z«{ò[YqGôí†3#Y§èïn¶×£ß´“↫×ýB’ø±:ê÷GF}üÀÑß*9x¤´¼ˆd7½àù³[K–†Pÿ;"SÈHÛS3Yˆ:HÔ<Z­l#Þ°%ÉÿößJö·1‘ËT3YK3£èwÓåIüï¿UÚi¡î’?6âÏpšü‹\H1aÆõ= ª|S•¾‹ bp>L8ö·á ؆&KÏÃÎB9ŒãÑh\z†à>AúSPE:SÈÇøõVÓ<.Ö)ùJe(&´×á%Ë¢ ÓCf/¾/L´“&±ývǯ²¢ê¤ùKVÄüÿþ fETûhèµ½z¾Öbäa;¡èýØ8´+¥ D85"ÒÆ Œ×Pžÿ±1ÍÂQ5‡PÖ9?þá’18^Þþ ^(z‰0Dwx"õV+¼Ëðõþ¾»I+m”r¯±w´Ûü'¸ñ¬¡‰»2˜ö[Ü$…årüZÕZíè“c(ú88ŽÏ„Ó›‚_Y;¯¦ïxü‡loÿ-›#ÆÞÞrßß‘L¾‰É‚TíeÔgª}l®¹Wÿì‘e™ëa3\ ý10…ð•ÚÀ@„FÝÕgÔ½›M“}(™OÂnM¶­{sM¨\B\å j…†Gs彩ϭÇÕ0TÄ&Ÿµ0­‰µìÏY%]¾‰_0.9Ç,jY±SA®J6fQލ'kŒ÷~ÚkŒ$H”+jãi‰$ ÷c[È1Ö>­÷äý‡ ô¨9B†Á‘Ã4BêvuJ¬5.yBJñèO@"Ù›LªwhþÎE¢¼ÃÌ®q\ß[ ±-ÉšW0J"NWŒMé[i6áZTj²¦zÝÖè£WdÙ}—1}´â(™Zè?/•zsX[B‰ø pxý?H°‘T±ÆI?QÞdð@¿˜~¸Â¿ùqˆg¦âìYE¡lœ¨[´pqüÛ¡ö½`_ óeŸÖP…ï¨Àªì$¡a]´¶¡ºI'†šZ±¦Õs ÕO%h%_X6ZÂ[- ð€‹Zm0½,Diê0Ï “Aý{möÿAú·%(É5øk*ÆÁ&Z¿õe‘à°·dho¸¡±ÿ›…gጠGRЧ*zga¢d~²è?tòªduøv‚sàYÍf†¡ÅŒ¬â•6k³C ¿&}9±o„!¿DNñs­Û)¶s1§O?Iõc'::jЊb7àPN©ùÜO›ìþŽRû«trDgˆöáI¿œ¾ZÓá`²¶à¬¿Æ´ ®ÞÁ.c€®,z‘ü'¹Ë*ƒýˆ ›VÕuŹ€Á6¿\ÙWéC‹g¥…"ù/p¦ÛñEN;ØÂª›vÑ¡™·fEˆì‘kVî0"8–š<˜$í« Ñ°ÎeÓþ,}Ž.û`i˜ß’·¼X¥ƒ—š-´}˜FâEð~£òÐg¢ing›M‰KpºC,Ì…#íÙ­Ç(Ä˸es jqâÂ<“;iòaÑ"’‚/°™-;|ç.ò¤˜¸Å$5À–CÀ\²ŒÜÙÓ-¼»À_>S+ç$Ы† …Rýïx׊oÁ/Óck^é‹<‘ðìÍØ+1Kïv-w®H‘ ªö_¾A ÅÙH&ž&î¹)1†¥»žK Zš.z<Õeƒ-#=Â(5†Y®³Ô˜0 ;?ÂEsX[:&èëV}Üp3Äz½ÁA²T†,%(Â*Q›m†Á0ê©›ÙG3wÄ>ÇyUJ°>J&ýpÏ:7»þ“4ц­®Ìó«sñc]@AÖe«^ÆßšäˆðÒ«ÏÔ£à;¥†ì ˜v®Ób3¶NÂÐ&XW©žZ‹4‡ø¸cY¨[×õ›¶IÕ)Aò„%äC¥²I~YðÙ‘˜ï£¶Î%Ænfñ(Ü|ûÇäŸ#ãê¾R?wŒtˆ¦Tì\ÀØò†AáÖ¼*ùÊy#œ[Û*¡¯¶èbG”y*\²´Ç`ŠL5rmtÇ,k«Àééö‰óS9/2Ô%«zSÎUíVí!®¹ÕjßÂ1ˆ‹Xü›Ò›Kwõÿ÷ñdÄ 58¡¢Ú†°‹7³gàß3€~Ï^‚0nÚ"æü['HQ¼ÂYÕ¶Â=ŸÊÌWo^ûŒDi'JvOW•ð•_d53S3'ØÄ{°z'œ`lm=é¤_¸`v¥JZ‡Â²Hòk°?}Ë;`8}D×t BáÅC(”ÊbÄË%ô¢áŸýS¨üçѳè×[aÖÁEÒæƒy@•êZåÚã<¢ú¤]¢sƒÍÜ ‹RÚ9•õo}FD)·4BNÍÓé’ÙHÙa%ÊNCN} Äðãìår¶ø>'àny¼õèïšXl Ö*)K´“÷`o£Ù*BÙ £OC`ö&fžˆçg•’ÔÈBq,‚ç¿Sh`?»…S‚JÁ)±Ž£T©¼vt5Ýâ_m  åè´ìiìœôϺ­?­½F>6ÔqðÊWºü¡[ѧ9³šˆðÞ^²ÆC(ákh¨f장,Npçå6£K ¦}îAþ´ ‡Œ¥eA§^Œ8¸w¥yÁß*˜à:ôQÕX'È‘-W‚¦šPÅ,ÿÃð๺­ˆ.KØ“ÙÇk}8<²Q@NÂÀùLq=Tù»­ˆŸª }° QjëAKHÿ÷Âí®îô¯òsg‰„‹@HÀó¿Ksã,³‚‘þL ÅnÅŽVq!KæXü.=¬§L"qžËüÛHrB³nÒu–ý ?PFBÏš. Îל(jÖ lÏGŽâ •…¸'>&·¾Iâñ7jÚnB/[–âtY£~„ùÇTß®:Ð#‹–ºšåöÉ~pF‡F3¸Òd(lñ^‹¨Cî;Ιå{ƒ-ƒ!Ý+Q É·:,#*?)Mÿ<£$"²ÐJñû²>hm)þæ#= Ì2+§ä†6ï·£r9P0Ë ¼Ò‹/œw¹%€SÌö²-[¦¸f¥çmoÛÓñ´Qíã+”cýEÛ‰CÌ9wåJÅ<Ëãmñ~'¯,v+çGç¼ÇL À ’c&»Íƒ¦ñ.%›³9¦éޏó?ÆÔ~(üD°EÖöÊAÙ‘N¦¢|ey¥ÝW•Ðåƒ.ç¦Ç[Ú|±Ñj3bNÇö¤moëéŸýÖÐKÓlÊØåvX£²1;®:šjcjÀa{àŽC”£Ö•iˆPµG¦Kp @ƒ|sèBÝ‹)YÂG¾Ôƒw¶®”ÑKùœB’„ýáEr¡`ôÛô%„ÿñ§ïGßÀøEoR¢ïëöZxtP)hQ·]Æ#áùÖ4ÛN×Ì& &Û_)ë°6©©îâïrÚ’q4?•a‡¬ð fÑZ²L}ì&ÿâDÕÄV»Ä)ÀÿÓb¸bîí†vF¢ “*rPöC©¶yäá‚ÒÚº÷iÙK½ÅT]0:Ê ÖlÚ<Å Í sC•=«:‰G²Êàˆ £êå]Ôþºco;-B¢ÖBSÐèo59VÈg–÷:‰z(¿Ýœžòš “›ð½®ØÅÒâ‚Z‡6Ѫ‚ˆ Á!Ø’c=lk<;z»]opÕ‡JWuãUìk‹æm')œ²¦ÑÑïìòµdD ËÝfÚ܆T¡™Ï¸OîàÒñ©Kæ½.JvE ~|«­¹¹«±)„þ×+yzSâ®oév$JíU¦ÍA‚ÿ l``Icýêï©Jm¢¹‚:zaV˜š©âYft·åó8g` Oç¦êNuÀKA=¡)b²VÕ}ÊÒp»ôëû;HyK<_/Yˈe²š‰Ÿ/y‘²ËÒžRŃX\þduQDÀU ñ¸L¯6…F•_mg³DÀ}žˆü§Ki-H|­Ã¦‰h¦]ÆÆœ‹:eŽ£€v$¢ŒN‰£ß–Œ+„ †˜ûu-šË´\9‰½ (ÐÂ7á%°9«ÜBš‡”©{0`Eßzµ”KÚøúº®Hn:>-¹7}/qcaã€}öÚd¶bÜ@2rÂÕâY8ðêr-Š=–PÎ _˜Ö§·øµ™¢‘pßÛË‹á$4tÅgÆb2ƒ˜¨jå§ÝX0©vü®=i­kH‚®Ñ›BG— ž! »7.‚ôv4‹ö ¡íÓoÅò¦ñT뵟| r[µ6ZÍt…*„Á÷Øë=t㌛šÞ€bšüº¥¨ÿGuÕK­î•[­Á§Ýlÿ òY¸ b3ê‹á^m9Fvn¦@/ WyE®‘T^ÑzQoÝfXm°92pC1E¯ž±Fâ×d3¼zÙ5ºô¾ÐXxl ïÀ€6y*˜ý#]AÙÌ!À½*ÔñoÏ%3D´¯öH†z;mÕYKvQ‡øÁä’Û9{¬¸Ž#åѹU¹ØÔÅu?k¸·RZT“ KT9q­ Â¥íXêÛúq2ÌõÔºbî«äBŸº”A†“{ʦÍo÷Çk³KåŰÙ4KŠŒùÊéµ¢¶UUa»KTÆLÒËjâÅqï«õABB„¼zö¡Ï³¿v4*}«Û2–ÕUìmI³èäŠ[Ku<úƒÙâÀÙ‚åÛÁEiA_^‹ î ÁϸöñéÌ]_œÊ¼?Ú¬%ûJ™èBÔVN|%7Ò ÞxWe©Bž^UßÀ€ÆœªÐÑÙOûX‘œ#Kq–8ïö\€¿4»·¼´²!7s°O£ìú‚Ì–GÞìá¯k'Ž åYÄ ç§*ù)†Zb¼Çœð \–”ÁòEŠþú_ ±÷S ýÅ™,N±£«>=P¾a5Ä1Ž úyGéµbÈäU’²‰3Oàŕۭüpõ†s™ªwñõU#«Ÿ'•™]Òó»H¹K ErðÆ.'a«ÃÕñ¡îJ±llOŠÓE˜š ]ê­äxvJ£·–ïF,Ôû”= ~¤'.ˆÔà®'¤ˆ¨#ÁŽZHë÷Fç™T_¸òn`M’ƒÙÓˆ#é=x9à5r½VÎ\dh’‹äJrrÉŸ§Îÿ“ôª§óQ8x@ÉŠÖ!—LÿOÖÌR{-6¥¯Î)þlÀÓË+­ô®­ŠS@´Ù-TgBõ›µöQoȽA_ìAêÜÙÃC8$x› â¶|1hÄðá(gl@³ïžŠW/ÀdôJx6)à¸íe“*„–ßæAå°DÄ;µÂšŒþޱ%ÜÅ%ìm¿Ú½« 'ö%Õ’ gêîü€ ;9ÅÒ^4<Õ%ø/6fªƒv#Ît8Ãý¬Ôô4x.vñ8Í©ƒ¯¥¹„Tÿ˜Íý.¥¸T#Ṳ̀SMÀŽÈçk(‡WãyØ šò_ÃéÙ ¿¨EtTl@nW"ÑAýô}¶>øó×f/Šö³U{®Y›Äu$ïl¸ >hRM…pdžÔ13UšÍš]é…¦¨¬ëHNb"‘Šn—f‡ díÊæ:íí;irÆÇå²ÿ¯™ºs9tyñÒÓ…# R„A眱‚fÔ{¤T5— q®Õr<…>l’>…©&)äl¹éÜ ±#ô<-D‹íDîÚ/¬¾¿ˆÒö¹C/Ÿ1†hch‹X`*x+òŠvPÕz=iE=œûfÛ\zý̇£wœˆihÒÚ€üº"‘§ÏófoA`µâ‘zÈ«>PðO\]Á í³+"í^0ô^{Fa }µõ¬V`ŒØ£ ?àQ×>a^ƒ<6È&ú_äÖŽ¬NŠÈapJfm±&šGrhŠ ¢úæüoš6¯°uí¦wÅåôÝš›!4íÀx€çY=,ú¸9ëÊç%ê 2¥Í86Ï$ýy'Lê™¨î™ ™;ô²ŽyßÍΤ½1ƒõFPÆ;‹Žà§ C¦BWéÉ 3. ¯»,MâÙ}’ƒÅGŸÊrª¤­êo‘}õàuªù.è±Dš‰êoëÒ"“\Œâ„ò‘Ó„Ö«{ÝKFøælר`þ3aS7,žñ±ƒ¢™|)¬³ íKó»<¯T‡Ï=ß½¬ÕǨ\ĸ5𙔆´oU‹¶¦ PñFƒ>pá:lúö˜sʽ?óÔ͘Ê8 „2Fu#}ŽÛdÔÛ*üUqd€.–+œrüA{½@ΫÑ|Rr#\”u¥ª? 1éœ{NÔ• ‡og k ð0æ“.÷–Ó[;{CµŽë¶÷ê3¾ŸšìsW9ƒXBFlr4O)¿#0ÿ°Z#lm`}Üë{gÿ“ åH¸z=áùÀ¸ö¦¶¾@fOœ¸á@{o ,œE0§ÕM(É”]©Qï±M}²‘g/ŸÓùy(b%E;v¾§¸°þ5|¢¼ƒïÀ'õXØšÁ’ö ±í+ÿpݺC*4"K*õèñWŸë¯~ýlo£÷‡èPñ.­Œý #ØÁ|ìÏ€ÓÎ µS6'‰CÁÑ&Š š'®«DnBŸ~»R>AcÓ'‹h?I €ÔRSãk“äþÁ3‚DK¼÷…"4ñÏ4¢·%,³ìppë˜M.úH§ ©‹êÍ̇±‹Õˆòú±kËY~.¾óa»-YRI¿A0Ø•V|ØŽY=+FÕšO¨‰CmI6i ›äÍ׫m[îÛQ÷ð7>Ž’ëÛ¥ð÷ "0áDtM{y‚ÇÁì2-GÊŠ†ïÐ/£À{kèE” éÌ›½0ضi1(ÜGñØ?Ávwyc&g/É«¶•޵3ûÇÆ9w9„n™¹¿²¸èØ*òJf¥£ÙóTfÕ}á!@^ÈÖc\çgHâžÒîNºL¤[fD 05§ ÙÁj¾“KNÔ÷c]`²ê¢{¼ŸyK}ϼzØ`ù:¯—ÔÎü¨LÐäþ€+ñóõ>5±.¼”ù"#£IàÜv}‚Í-ÈÛü/yê/š©S«ÅC :—)ò¶/“@(Ø×íÑ©2ƒr+rI²cFºÇzð‡+_–®ãÓß )4±=æpÖÜ¿ê†ÂÛ»bGÁ ÎÆ’ó¢¹ÄÿH9X¹Êœ±WõžÊéÄBþ7PƒÙ½D»I ‚H“«Dÿmÿ×…¦–2u]6Ç–úmÏ£ KË Ç.gëwÈCŸ Yë±ï‚]0²Ü´m|¸èé÷3Õ±§×sXuSªcÚ—´ŒêÙëAÙ”aÉÍxöõIã÷Ù‡'l©óq°¹»â?€ß ÐtÆ6bjýߥæ|3ÁþjÅl‚¡Š¥?OÓt=&R8÷"D[îr$¸Òç1½Þuõ+ÿ£Rs9ðÙI$ù‚{ƒ#¯¬œhZš™+Œ— ©"Bk±>+ãT{E P=e“k_­‘MýMjÇâcåžf³⡱`Ág3>EU)ÆØ|4…X*ÏãCµ ª °‹É±öÿÅ]xë‡ãÚSÞ3˜+Ñ"S °¬é1cgœ†,°Ó¨ÊãBµÇi>M{Vú\ú‰Íè»?!@ Ç3¶,Y§$«ð˜)/ßËT•D»¹±ž+DÈà®ZŽQX•8=¡vi€û²Àâ>Öý× )…Ùò­¡¤Bl ½hiì°ïk…C;³ˆk=â6 Æ„Ñ|)o£ÌëÈ•lìÉÏ=Тùò•TM.í@RIEvi°¾üÕÀÝŽ(s 0Aá­þXCNÛô©Ô¬n€­üMôŠs°…áî°»0§*…“†³Àt¯ðpbí¾ ÙË| Q,‹›*Ûí1^P/"«üÒÖÝWì,†IÛÑM)lÓB»7q†©rR(€ª…Z´TཿL)O•™>Ï/å>Ù!*«û9un.ª(R$²Ü¤ „ŠÂe"X~†‰¥Òí'²¶£^vνtôk¼…)>û3A/ÔFiáÖ\ºK—ùiº¤£Ÿè"Jóÿ¥+Æ¬×ØM0Å!)X(f<®/~UšÀ¼ºn„9\OZhÊÎcGùaŸø> ÃÎv‚f:`”iô+«Å›¾±ÏFqô’n mpþ©²Žº¬¦ôâtS2:]:!`‚qÿk»ÐÖ‰VºéDf“´ÄyÊYàKϬ´žñ{–½ˆÆŸÚþ˜¡öÕÑxv¢s¼Aa|ŠœÝùòÿ¿Imšùj/˜ŠÑ^Q)ÂúÓ‹ükaÜÙàü‡’™€2vþ84f&Œ:Ž¡j¹Ä¿d§Q}N'œ¶cýƒ»¿!‡u´êo%’¾wwì‡yä1ÞEjÌ”èV![wEfð ¯j¿~¼+ü$g³ùåýÊhNÝ»<Ã,_À¶ce¶D¤b|De±?õ.½ÐÏÔLý=)‡èNçN§qÙŒ¶ ‡t3ïœæB2{6D¦ÿG§°GÔiY—Y/7oŽEa(àtzêuûú-ÂKv¢1µ§¢º~·=ƒÈáä7V: {[æL6ƒ8æ¾J*\“¦fã y?«d•ÛÒÖhk/¿:qÞ9âR›ÔRm¼³ÎŒ•Ø–¿ŠšÄ0ëì±–{ ^Ÿ~CÀ>z“ü½Ï+}ZZ&/©S¬>ò¼.õ…Äq¯ì§{ZB[‹ØØ¶ù‘_Kè.Sj)l x©qV…ÛÛ€3•Ù6‚§ÌL{‹8óF½Nh£lÃ3WГªÅøïv®Yš°®ÀÜ4hÑÉ6"n"ˆÆZ¥ÔCdüÅr…Ûíß e3à<˜K‚+9ö¦þvaˆï~b•­‹Ê$<ý9FÄA¿¹ÜÝ?UbÚø›YЇqÕ] ©2ÌTSn¨„B'OJ5`¥xþápÉK­ÿ"sÊ#0å~D}\‡ÙÑéi¬¢™}/ob ýͻپé‰DÙ:Eŷɼ"{>æ@È`+î+L¢#ïï¡óö«ž"Îà}çeïšeâ¡Ãgžj&êÞºÃrBKŒ§Ð¾1[•ü°ÆqôÞÖ³¸M]ÍPT×üIÒ–Ë—:CãΑN"Aι”µµLcLï{Ú"¨£{;#„2âs­Õ~hz!ø<ì®®ÇgÙêÿašõ ‰.ÍWjâÅè¤Y7 SšÜÈœÏ>UþüÎ6ïÑÏË’ã©’áN¶ïÎ%Ö}޳A‹féD@hÏØæ8XZ×MèrÆkAe<›dµšf—¼Î;o qbO øªð~1üuÈíHG nôéc¤|Zú% p¯úZáùqÕ€§[ë±C´K=qº²ñË…é¹€Ñó\8Ù {9íIòã½3Úw9eªÚ¢àd*7†Õö1Lßnf·C1ã|8µÉòŽà~}Yâ4í˜V£üšIX©Œ©´ÉΣ=|G™÷5Øõ+S¿( A\; éè2€Þ©3ÿ«`5ت(ç –’`‚¾F ÉÔiÂøÁŽ_ÔQ-¨¢°}j[MX•WZz°jh¤…4.#ŽáË®À:g4ªß Þâ_¨~Ó*¢··¿…eíZ—ö¹˜û¶ŠŒÇæõÓ™nù»P|¦ZøTÐñè"lt<ÀUµ KÑÊ-µ¬¨§ª`NX ÀG0úì’HMdγ»G¦+™{õ»÷žì–=IF1£˜’¤âM[¹‚¨y ïþá‡]2¨dbIve80†;·™}Üãî ƒG%3w×ošÊp€ö·sù³$t‚‚|4ø?–ögÉí+¯,;0‘ÛØ‰ßµ7`Îöò¨Ía ¸p® 0vŽÌ%°ÖŒ¦[bó«]ö@ôƒûIZÄsžÌC§8llÚ›»!wÎ/û«ey܃ÔcßÄ‘JR8‰ˆ-Ë“šº¶òw¾•²ÕüúòþLМñN\Ýœ˜3h…º‡¢"´©ék§Ùãå8¬ý’³–( H÷Þ‰hõEÃ=gËžBZ¹~çoü!ªëÑ*ªÔj/Ùþì§pøl©ºl ÜåªÇSĪ>©4PÔhën¹·ÈBz?7Å|¸Ðp]•Ž˜ímýÔ=‰õ<‰DJ|&z¾œ´DÍ¿ÇôûblÓFu¬ìåuƒô”hIœ+*ñ§"{Ï3YÁ³Uó7¿µ)ÂU½—YÕ#áãËíŸPWžvâg[Do¿È«ý‰=Þn£êqŸÜ¸Ð<ìe©A*áå„§B?ËŒˆ)©ÕR×í^h*êúÏ<Τ“PzIQôkQÙtöpÄ‹wfŠ){º}óÂö8Nã] ØOÇðt*+J¨ìlVŠ%éxðçºÛ‡¢düÃá¨Àð,·½)IoìjèltwsÏ<ÏÑSþ7¸© Ùž,¯N ó¦Ç¥¨ÞØbP”Õ¸$†íªÀßâïX›eGÿ;T7íeÉ?`êýÈÞIs,0kÄGþþ-`Ž¿\çžm4ŸLá–¸¢Šá9VïöÞXÇSf^ŽâE ­ròƵ.b«lŸp—j¿›LÝŸÓJEÍûìú¦'h6õð¥ZÆ;ungÅ—kz_Ϧ€q8%Ñ%óHá4úN†8Œ;ðJ'(ÊìÈ[@žñx]¯~ë@}9‹súHUœ¨SÑhÝY¯~UúÀ˜9HÛ £€õŠd±xÐÞV²y™ÙõJùÌI®9ÁŽR X_ÊPSbÒAÐhéï‚Ð?3;< N<~ú®Â'o·ýÕï1„Tã_§ÉW#Ë­»ÜÝ*cãße_W0ºžE:ËM:•ÖQc]C¹½FGðìÕºÕ4 ÑáÚ´<Úœ¬•± $zá|åڽϽ+]ôGÞŠ‹8¢GñuÇv´]øG°¥ö!¾’ÎÌÝŠInµ—`âêmðìOW’к%åkNõCÙõ%ˆïbªAÄ„›>  ŒþùÑ«`Z`»¡ˆf}6rÕHðüäÑTè¦Kð–·×þ'Ê8¯ Ž?ÊŸ.£Â^!JTE0ÿªèà!š£ºÄ§÷ô;.¹`ˆ!åꛞ\Bˆ®’{ÝóÆ·¢¢*ý¾P$ö)¿18ás~b ½ÄüXa…;™;®Òè¦mÉòǿxi”S;°ñ¬Ø€ÇÏ¥‹ÓQx­*ý; ×£D6f”RG;_ï‹ÙÁxcüŠ °+4í,ctœ™²Å‹—šs\£sw?ö³$[—xd—›Ñß-JqT[ˆM) C¾¢Ò0‰ =ÎÍHæ ÅBY×P°dôjÉ {ëx_Ôé¨VnQ›CÕôU?…dᆄH|Z\/¶[ó¨†{h¨85ð@=ù–\àÍÂ:É©Ö=ú(éHÓä\Û+2ƒV:ÜwÓ•ì5š}uŸ´«²þ99áÄñ"Ÿç¢Â›:&š¶;¾Û2¬‰c jÎ2š¥PmÆŠØø×õj3aÛ)tñ™KÝÌ>äwŸLÏÆÊü…)Pi™µñ}‰ Upå¹-ÃÂŒ$™ózFq|Øíqa]%H¹ÌgàZú‡þ0 ÐU^æ_Ky”êßã1:A›¦ò¥×‚š#°0õðP'VÂ$žQ1ý‰·˜7§ _ÊÎß{=OWø‹è²#Ôž»Ã Äéd|É:ðì»nîbu•Ï‹Ã)‡ÿ—ó¬¾Ï´ PõZ1QíŒÖÏ£)n˜óc];Iöµêknæ?¸6¥¹äuÆ|\Ý Y¨Ã™õzüûNŽEÝ3··,á¸<¾ÌÊÞéëÅÉ2Zôh£¸uB±Z[³½ÌúœQédz‘jËKz]a’¢÷ÚóÞºØOÔïŒræ‹K·Q4x«Ð¬71ðèS7îÇ1x„DA˱Ã:â^7ƒ(û9g ´òdª”³MÑl+ƒŸhìýÒ^$,.žuN†s|-ˆÓÉ¡E£àCŽ9Ï2Ï`¾¤ªIPVš‰6Î9vw¿Y€8P ˆì ë÷›?§ìò›Vム)<à>¼Ž´7£û€Õ³ˆäÝþ…a«à·ŠdxTºR:(Déï µúz .Låˆr+vŽà f­+²ÜV‡@£«(_zçu’FCSš|Ûb²"Ñ××e5Á›÷ؼvˆšB˜a<ØoòOˆÕÔ!|8ç(Veo» ž„””»-&þ§¸N'^n.Änþªî•ÅôÑ(]¾Y^ 7KI@ Út_LmlŠoÃC’¨6F4+ÕìiÎAç/]Òh|Ú—ªëÎ »»‰lWu$Íê€À¼€µ-»žYiPq@,| V=H¡¨J:³ñ0Aôf¾£Mñ9ɰœe ·­aˆÏ>@u_}Ò­%ÿÛ1£+my@Jì ¦”4ß^‚ÆÿA}¼|=ør n<’/·Y%Üs:ÞÒ¤Ìoé±#~ºwïopFG*°ëÉ9É ˆÍ¡ë±¤â<Ãß)&ëÂf~i \Íß)MwQ›êÖ|S;$‹É²_c‘ø£v.,Nôîu|€ÚÆ ÀX%%'P•Úÿp!ŽºU‚F§ü€/Ö‘Ìs”>I Úbø‚kkòVðTÏ)YÀgÄCDçhÑ3®óÅšcüÅr•‰oA¦ uËx÷Æp™¶£)Ä›l¼ é8[G. ømãsez¹“Ê^Y¨_;há £Î,bsó¡”Cy”Œ…Béø·–ùºà¼¶îIñë2&¬vòf,q¦{F³'ë‡tØÜý³ºÂ&¡¨®3¯|(= HìOÑ* :qüæÎǨ‚ ÊHu¬jVÕ›D4fHd^G ž •­©.ÝÓ ×ïÊ»@ŠpDŸ§½y¸¬Ø¼qFÅ@CtJßÜ–-#c乓ï‚Sdã¤6v=d©YÙFG; Pý£_ÖÔ’)UhÌL‹§ÝÍV’/JäEp÷¢«¸4'Åèc±K>B«ÑDù¹S— •À2AŽXûª¶Ëô¯kˆ­ ˆ èŒÏ<­Nß…-í¿J¡¥äUú×[»ÁZ`<„}h<¬ÖñõÔIˆ *éÁ%kQô ٲ٘2ÿ6µZ«Aë±%œ”ñ t˜}¨%xsõŸôf;x{z‚+#«¹öH£¦\¹Ò—ÑÉR¥&¯ƒÒŒ›AŠ/ß­±² ëI8tíºm×Ïst*+m ü+Àß#u WíIžz²ä•,Ý7Z"`ê®ûN‹âñŸzŠöe‡¡F —¦+± C£³&£hïk»“ÅH¯€ì“mgr4zái‚ØÆŽ•’Õã¾ËDe¼®Ù§­ªáÄ=áNš®ã÷ ø<2eº“ŸßØïjICý20¹‹¸dB¦× ägTaÞMLžÄ7AYÞJPïÄg ¹Pƒ6¤] ìØpº?e± à[ï; ZHÆÎ­hÖ¤f†DýS^Ùe_±9ìLTsÅžÝñ7Úc\45¨Ry_ÜŽØŸ+Êüêi3¸‡kP®¥³ÆÔ èÝøƒ§ù+àФê‹2ðÏZ*Žì4ôÚè¸|ÝÜ^XJÞHÝ÷ÖAn¯!Mþcµ\·ÅN"4žÊ\ã¿HRÿ–=AH¦ç³{Tœ¸-æVÙÁŠü±É‘ÝUý¦ýÔû8ùdм·bûŒ® Ñ9"·o:²DçÎЭPÒjB%3œ‰ÎP…^‹¡òëÑžæM›•ZõV9&æˆlá\ûóð²™´ 8ñ0š5âîÇö]¥Z!൳ç†To>ûìuOævIÜßÅ–*”.${y½×Œ¡Í²BoÜ{"˜ƒ…ëÚg8‰&¤=¨†yp›IS´Ð/ã+Ùqh–S8¤îi”Ófs=Üö` ûBTÌ\ö«½xÃV%Üé¾7È.Y÷WÕ.݈¶‰fˆ“3÷d'Þ­V=q,[U%±‚FÇ&QîùH•ÿÈYΣ6ïC¤žFa·z£½A@1’ m˜–Û!xiÂ+VÆ´(fbž¬@"ŸÄª6KÔ‘…Ò– Duä1ådÊEžd»i±ùŸ{‰ë®€„WØÈ .7ÿIü’AO ×ÿ<>_ñóuVdsqݰJkƒoÎØ¹1vpÓ*d™šI/§LÿL.ÄépÕ³»l-“s!žw'9ÄúŸk9·yõún|þAja^ÚÚ·„6Ô+e¨uaØùFof‰ž‰C8\#ÿñˆpJ,zúw‹ÿ•* › øÚ–®Ïm»½ÑÜ^D€Z‘Å_؆Pi­ˆ¥©ÓÁåè wõ©?±Hµ–5+ɲ‡ãÀ¥þo?5hk}¦?aãâK†ìž©¿ä4¥5‘ÂSÑ»3•®Ó¬ðC…YHˆåg‡KS¬Ï !{iHúà}èÇÈÜ¡ýÒ›¤Æµ*`Ê?ûõWCz:äçNÃC[6ö‹¨!à í­Ÿ$è\}|S­‹;ð5‹è„ºe/Q›àÃ!ò^8C|aT}»Dš¯#3èÞå#üª½­7ùgÐBÙ‹ÍüÅÿ‡[™pT' Ä‡É O¢þôP¥g¦êÎæØ]Kj¨lmÐÛŽÑdCÂTwZæ·AÀj?.¦=OðVŸãÞ¿…þE€Æ›ÑI“.¥sB¡‹êWà hŸKagBàç-hVH³tÔ4Mÿ ¦ƒµæÑ€Ý-d³óh½- m*‡ÎxJ†½B߃‚©‰%dFà· d÷3XJ ²B®šü|18}ÝËõÎÿÍ2ÊD;ÁŒpgžVèŽÑÑc„r¤ÖQ}P¾¾k×.(Ý8ÃÚ×eΣ.ZsÐ$cryptmount-5.2/testing/keys/3.0.2_raw_none_none_00000644000175000017500000000002011402211766016656 00000000000000cryptmount012345cryptmount-5.2/testing/keys/4.0_builtin_sha1_blowfish-cbc_00000644000175000017500000000006012000461340020666 00000000000000cm-blti@öVyŸþ…vA©«ä]»/‘¯ÔŸ¼À¿Î[¬òõ¤îm 5cryptmount-5.2/testing/keys/3.1.2_libgcrypt_md5_blowfish_00000644000175000017500000000006011402211766020475 00000000000000cm-gcryX'u¢Q¸ù%ÞÙË—˜‘2_jµ¹Ø4’„â±g“¸[ë kUcryptmount-5.2/testing/Makefile.am0000644000175000017500000000120712612755121014240 00000000000000# automake script for cryptmount testing suite # RW Penney, March 2014 EXTRA_DIST = mudslinger.in passwd.fs KEYHEADERS = $(shell ls keys/*.hdr) AUTOKEYS = $(KEYHEADERS:%.hdr=%) clean-local: -rm -f mudslinger-*-*.log -rm -f ${AUTOKEYS} dist-hook: mkdir ${distdir}/keys; cp -p ${srcdir}/keys/[0-9]* ${distdir}/keys/ mudslinger: mudslinger.in sed -e 's,@PKG_VERSION@,$(PACKAGE_VERSION),g' \ -e 's,@CM_KEYMODS@,$(CM_MODULES),g' $< > $@ chmod +x mudslinger autokeys: ${AUTOKEYS} ${AUTOKEYS}: ${KEYHEADERS} for k in ${AUTOKEYS}; do \ cp $${k}.hdr $${k}; \ dd if=/dev/zero of=$${k} bs=32k count=64 \ conv=notrunc oflag=append; done cryptmount-5.2/testing/mudslinger.in0000755000175000017500000016764412613124506014730 00000000000000#!/bin/bash # Testing script for cryptmount (compiled with -DTESTING) # RW Penney, December 2005 DD=/bin/dd LOSETUP=/sbin/losetup SU_p="/bin/su -p" TMPDIR=/tmp/cm-$$ CM=../cryptmount PASSWD="hopeless" # Pair of users, with valid login-shells: USER1=bin USER2=nobody # Pair of unused loopback devices: LOOPDEV=`${LOSETUP} -f` LOOPDEV2=/dev/loop5 DATEFMT="+%d%b%y-%H:%M:%S" # # Testing infrastructure # NTESTS_RUN=0 NTESTS_FAILED=0 NTESTS_PASSED=0 NTESTS_ABORTED=0 if test -t 1 && which tput >/dev/null 2>&1; then ts_norm=$(tput sgr0) ts_bold=$(tput bold) ts_good=$(tput setaf 2) ts_warn=$(tput setaf 5) ts_fail=${ts_bold}$(tput setaf 1) fi function test_start() { # Syntax: test_start echo -n "Testing $1..." echo -e "\n\n---- Test \"$1\" ---- ("`date ${DATEFMT}`")\n" 1>&3 if [ ${NTESTS_ABORTED} -gt 0 ]; then test_abort false return else NTESTS_RUN=`expr ${NTESTS_RUN} + 1` true return fi }; function test_fail() { echo " ${ts_fail}FAILED!${ts_norm} [$1]" echo "!!! TEST FAILED [$1] ("`date ${DATEFMT}`") !!!" 1>&3 NTESTS_FAILED=`expr ${NTESTS_FAILED} + 1` # Execute optional clean-up command if [ ! -z "$2" ]; then echo " (attempting clean-up with \"$2\")" 1>&3 eval "$2" 1>&3 fi }; function test_pass() { echo " ${ts_good}passed${ts_norm}" echo "(test passed @ "`date ${DATEFMT}`")" 1>&3 NTESTS_PASSED=`expr ${NTESTS_PASSED} + 1` }; function test_abort() { echo " ${ts_warn}aborted${ts_norm}" echo "(test aborted)" 1>&3 NTESTS_ABORTED=`expr ${NTESTS_ABORTED} + 1` }; function test_summary() { echo -e "\n========" echo "${NTESTS_RUN} tests run" echo " ${NTESTS_FAILED} tests failed" echo " ${NTESTS_PASSED} tests passed" echo -e "\n\n${NTESTS_RUN}/${NTESTS_FAILED}/${NTESTS_PASSED} tests run/failed/passed" 1>&3 }; # # Utility routines # function tupelize() { # Assign comma-separated fields to set of scalars # Syntax: tupelize [var0 [var1]...] local tupstring=`echo $1 | sed 's/,/ /g'` shift for field in ${tupstring}; do local var="$1" eval "${var}=\"${field}\"" shift done } function wait_udev() { # Wait for udev events to settle udevadm settle 2>/dev/null \ || udevsettle 2>/dev/null \ || sleep 5 }; function mk_ssl_keyfile() { # Syntax: mk_ssl_keyfile ${DD} if=/dev/urandom bs=${1}c count=1 2>/dev/null | \ openssl enc -e -pass pass:${PASSWD} -md $2 -${3} }; function mkrandshort() { # Create random 4-digit hex number od -An -N2 -t x2 /dev/urandom | sed 's% *%%g' }; function mkbingrep() { # Create simple binary-grep for block-offset test cat < "${1}.c" #include #include #define BLKLEN 32 int main(int argc, char*argv[]) { int i, notzeros, state=0; long fpos=0; char buff[BLKLEN]; while (read(STDIN_FILENO,(void*)buff,(size_t)BLKLEN) == (ssize_t)BLKLEN && state < 2) { for (notzeros=0,i=0; !notzeros && i ${TMPDIR}/dm-list1 for tgt in `awk '{printf"%s\n",$1}' ${TMPDIR}/dm-list1` do if grep -q "${tgt}" ${TMPDIR}/dm-list0; then true; else echo "removing ${tgt}" umount "/dev/mapper/${tgt}" 2>&3 || true dmsetup remove ${tgt} 2>&3 fi done rm "${TMPDIR}/dm-list1" } # # Specific test-cases # function test_version() { # Check that cryptmount has been compiled properly for further tests if test_start "version"; then true; else return; fi echo "#nothing here!" > ${TMPDIR}/cmtab if ${CM} --config-dir ${TMPDIR} --version 2>&3; then test_pass else test_abort echo "*** Please ensure cryptmount has been compiled with -DTESTING" echo "*** or rebuild using 'make clean cmtest'" fi }; function test_binary() { # Run built-in unit-tests if test_start "binary self-test"; then true; else return; fi if ${CM} --self-test 2>&3; then test_pass else test_abort fi }; function test_keygen() { # Test automatic key generation if test_start "key generation"; then true; else return; fi mgrlist=`${CM} --key-managers 2>/dev/null | sed -e 's/,/ /g' -e 's/\//' -e 's/\//'` for mgr in $mgrlist; do for len in 4 16 64; do echo "${mgr}: len=${len}" 1>&3 idx=`mkrandshort` cat < ${TMPDIR}/cmtab target${idx} { dev=${LOOPDEV} dir=${TMPDIR}/mnt fstype=ext2 mountoptions=defaults cipher=twofish keyformat=${mgr} keyfile=${TMPDIR}/keyfile } EOF rm -f ${TMPDIR}/keyfile if ${SU_p} ${USER1} -c "${CM} --config-dir ${TMPDIR} --newpassword ${PASSWD} --generate-key 16 target${idx}" 2>&3; then test_fail "privilege violation"; return; fi if ${CM} --config-dir ${TMPDIR} --newpassword ${PASSWD} --generate-key ${len} target${idx} 2>&3; then true; else test_fail make-key; return; fi if [ ! -f ${TMPDIR}/keyfile ]; then test_fail missing-key; return; fi fllen=`wc -c ${TMPDIR}/keyfile | awk '{printf"%d", $1}'` if [ "${fllen}" -lt "${len}" ]; then test_fail "keyfile size"; return; fi if ${CM} --config-dir ${TMPDIR} --newpassword ${PASSWD} --generate-key 16 target${idx} 2>&3; then test_fail key-overwrite; return; fi done done test_pass }; function test_setup_dev() { # Basic test of prepare/release on raw device if test_start "basic setup (device)"; then true; else return; fi idx=`mkrandshort` cat < ${TMPDIR}/cmtab target${idx} { dev=${LOOPDEV} dir=${TMPDIR}/mnt fstype=ext2 mountoptions=defaults cipher=twofish keyformat=builtin keyfile=${TMPDIR}/keyfile } EOF rm -f ${TMPDIR}/keyfile if ${CM} --config-dir ${TMPDIR} --newpassword ${PASSWD} --generate-key 16 target${idx} 2>&3; then true; else test_fail "key-generation"; return; fi if ${CM} --config-dir ${TMPDIR} --password ${PASSWD} --prepare target${idx} 2>&3; then true; else test_fail prepare; return; fi if mke2fs -q /dev/mapper/target${idx}; then true; else test_fail mke2fs; return; fi wait_udev if ${CM} --config-dir ${TMPDIR} --release target${idx} 2>&3; then true; else test_fail release; return; fi test_pass }; function test_setup_loop() { # Basic test of prepare/release via loopback device if test_start "basic setup (loopback)"; then true; else return; fi idx=`mkrandshort` cat < ${TMPDIR}/cmtab target${idx} { dev=${TMPDIR}/loopfile loop=auto dir=${TMPDIR}/mnt fstype=ext2 mountoptions=defaults cipher=twofish keyformat=raw keyfile=${TMPDIR}/keyfile } EOF rm -f ${TMPDIR}/keyfile if ${CM} --config-dir ${TMPDIR} --newpassword ${PASSWD} --generate-key 16 target${idx} 2>&3; then true; else test_fail "key-generation"; return; fi if ${CM} --config-dir ${TMPDIR} --password ${PASSWD} --prepare target${idx} 2>&3; then true; else test_fail prepare; return; fi if mke2fs -q /dev/mapper/target${idx}; then true; else test_fail mke2fs; return; fi wait_udev if ${CM} --config-dir ${TMPDIR} --release target${idx} 2>&3; then true; else test_fail release; return; fi test_pass }; function test_setup_roloop() { # Test prepare/release of loopback on read-only device if test_start "read-only loopback"; then true; else return; fi idx=`mkrandshort` mkdir ${TMPDIR}/romnt ${DD} if=/dev/zero of=${TMPDIR}/roloopfile bs=1M count=16 2>/dev/null ${LOSETUP} ${LOOPDEV2} ${TMPDIR}/roloopfile mke2fs -q ${LOOPDEV2} mount -t ext2 ${LOOPDEV2} ${TMPDIR}/romnt ${DD} if=/dev/zero of=${TMPDIR}/romnt/lpfl bs=1M count=8 2>/dev/null cat < ${TMPDIR}/cmtab target${idx} { dev=${TMPDIR}/romnt/lpfl flags=nofsck loop=auto dir=${TMPDIR}/mnt fstype=ext2 mountoptions=ro cipher=twofish keyformat=builtin keyfile=${TMPDIR}/keyfile keyhash=sha1 keycipher=blowfish-cbc } EOF cleanup="umount ${TMPDIR}/romnt; ${LOSETUP} -d ${LOOPDEV2}; rm ${TMPDIR}/roloopfile; rmdir ${TMPDIR}/romnt" rm -f ${TMPDIR}/keyfile if ${CM} --config-dir ${TMPDIR} --newpassword ${PASSWD} --generate-key 16 target${idx} 2>&3; then true; else test_fail "key-generation" "${cleanup}"; return; fi if ${CM} --config-dir ${TMPDIR} --password ${PASSWD} --prepare target${idx} 2>&3; then true; else test_fail "prepare" "${cleanup}" ; return; fi if mke2fs -q /dev/mapper/target${idx}; then true; else test_fail "mke2fs" "${cleanup}"; return; fi wait_udev if ${CM} --config-dir ${TMPDIR} --release target${idx} 2>&3; then true; else test_fail "release" "${cleanup}"; return; fi mount -o remount,ro ${TMPDIR}/romnt if ${CM} --config-dir ${TMPDIR} --password ${PASSWD} --mount target${idx} 2>&3; then true; else test_fail "mount-ro" "${cleanup}" ; return; fi wait_udev if ${CM} --config-dir ${TMPDIR} --password ${PASSWD} --unmount target${idx} 2>&3; then true; else test_fail "unmount-ro" "${cleanup}" ; return; fi # ideally we should try rw-mounting the filesystem, # and checking that the operation fails, but libdevmapper-1.01 apparently # does not deal well with read-only loopback devices eval "${cleanup}" test_pass }; function test_null() { # Test robustness to null cmtab targets if test_start "null targets"; then true; else return; fi idx=`mkrandshort` cat < ${TMPDIR}/cmtab target${idx} { } EOF if ${CM} --config-dir ${TMPDIR} --list 1>&3 2>&3 ; then true; else test_fail list; return; fi if ${CM} --config-dir ${TMPDIR} --list target${idx} 1>&3 2>&3; then true; else test_fail list; return; fi test_pass }; function test_passchange() { # Test password-changing if test_start "password changing"; then true; else return; fi mgrlist=`${CM} --key-managers 2>/dev/null | sed -e 's/,/ /g' -e 's/\//' -e 's/\//' -e 's/\//'` for mgr in ${mgrlist}; do echo "${mgr}" 1>&3 if [ -f ${TMPDIR}/keyfile ]; then rm ${TMPDIR}/keyfile; fi idx=`mkrandshort` NEWPASSWD="${PASSWD}-new${idx}" if [ "${mgr}" != "luks" ]; then keyline="keyformat=$mgr keyfile=${TMPDIR}/keyfile" else keyline="keyformat=$mgr" fi cat < ${TMPDIR}/cmtab target${idx} { dev=${LOOPDEV} dir=${TMPDIR}/mnt fstype=ext2 mountoptions=defaults cipher=blowfish ${keyline} } EOF if ${CM} --config-dir ${TMPDIR} --newpassword ${PASSWD} --generate-key 16 target${idx} 1>&3 2>&3; then true; else test_fail "make-key"; return; fi if ${CM} --config-dir ${TMPDIR} --password ${PASSWD} --prepare target${idx} 2>&3; then true; else test_fail "prepare"; return; fi wait_udev if ${CM} --config-dir ${TMPDIR} --release target${idx} 2>&3; then true; else test_fail "release"; return; fi rm -f ${TMPDIR}/keyfile-old if ${CM} --config-dir ${TMPDIR} --password ${PASSWD} --newpassword ${NEWPASSWD} --change-password target${idx} 1>&3 2>&3; then true; else test_fail "changing password"; return; fi if [ "${mgr}" != "luks" ]; then if [ -f ${TMPDIR}/keyfile-old ]; then rm ${TMPDIR}/keyfile-old; else test_fail "missing backup key"; return; fi fi if ${CM} --config-dir ${TMPDIR} --password ${PASSWD} --prepare target${idx} 2>&3; then test_fail "old password"; return; fi if ${CM} --config-dir ${TMPDIR} --password ${NEWPASSWD} --prepare target${idx} 2>&3; then true; else test_fail "prepare-new"; return; fi if ${CM} --config-dir ${TMPDIR} --release target${idx} 2>&3; then true; else test_fail "release-new"; return; fi wait_udev done test_pass }; function test_mtab() { # Test of updates to mtab if test_start "mtab updates"; then true; else return; fi if [ -x /sbin/mkfs.minix ]; then fstype=minix else fstype=ext3 fi rm -f ${TMPDIR}/keyfile ln -s ./mnt ${TMPDIR}/mnt-link0 ln -s mnt ${TMPDIR}/mnt-link1 cleanup="true" # Slackware-12 doesn't like variant="/.//./", for unknown reasons for variant in "" "/" "//" "/./" "/.//./" "-link0" "-link1" do idx=`mkrandshort` cat < ${TMPDIR}/cmtab target${idx} { flags=user,fsck dev=${TMPDIR}/loopfile dir=${TMPDIR}/mnt${variant} fstype=${fstype} mountoptions=ro,noexec cipher=cast5 fsckoptions=-N;-T;-V keyformat=builtin keyfile=${TMPDIR}/keyfile } EOF cleanup="rm ${TMPDIR}/mnt-link0 ${TMPDIR}/mnt-link1" echo "variant=\"${variant}\"" >&3 test -f ${TMPDIR}/keyfile || ${CM} --config-dir ${TMPDIR} --newpassword ${PASSWD} --generate-key 16 target${idx} 2>&3; if ${CM} --config-dir ${TMPDIR} --password ${PASSWD} --prepare target${idx} 2>&3; then true; else test_fail "prepare" "${cleanup}" ; return; fi if mkfs -t ${fstype} /dev/mapper/target${idx} 1>&3 2>&3; then true; else ${CM} --config-dir ${TMPDIR} --release target${idx} 2>&3; test_fail "mkfs.${fstype}" "${cleanup}"; return fi wait_udev if ${CM} --config-dir ${TMPDIR} --release target${idx} 2>&3; then true; else test_fail "release" "${cleanup}" ; return; fi if [ `df -k | grep -c /dev/mapper/target${idx}` -ne 0 ]; then test_fail "pre-existing" "${cleanup}" ; return; fi if ${SU_p} ${USER1} -c "${CM} --config-dir ${TMPDIR} --password ${PASSWD} --mount target${idx}" 1>&3 2>&3; then true; else test_fail "mount" "${cleanup}" ; return; fi if [ `df -k | grep -c "/dev/mapper/target${idx}"` -ne 1 ]; then test_fail "unregistered" "${cleanup}" ; return; fi wait_udev if ${SU_p} ${USER1} -c "${CM} --config-dir ${TMPDIR} --unmount target${idx}" 2>&3; then true; else test_fail "unmount" "${cleanup}" ; return; fi if [ `df -k | grep -c /dev/mapper/target${idx}` -ne 0 ]; then test_fail "remnant" "${cleanup}" ; return; fi done eval "${cleanup}" test_pass }; function test_listing() { # Test listing of cmtab targets if test_start "listing targets"; then true; else return; fi cat < /dev/null > ${TMPDIR}/cmtab tlist="" for tgt in 0 1 2 3 4 5 6 7 do idx=`mkrandshort` idx2=`mkrandshort` cat <> ${TMPDIR}/cmtab target${idx} { dev=${TMPDIR}/loopfile dir=/mnt/point-${idx2} fstype=brokenfs mountoptions=nosuid,noatime,sync cipher=blowfish keyfile=${TMPDIR}/keyfile keyhash=md5 keycipher=aes } EOF tlist="${tlist} target${idx},/mnt/point-${idx2}" done if ${SU_p} ${USER1} -c "${CM} --config-dir ${TMPDIR} --password ${PASSWD} --list" > ${TMPDIR}/tlist 2>&3; then true; else test_fail listing; return; fi for marker in ${tlist} do tupelize $marker tgt dir dirq=`awk "/^${tgt}/{ printf\"%s\",\\$5 }" ${TMPDIR}/tlist` if [ "${dirq}" = "" ]; then test_fail "absent"; return; fi if [ "${dirq}" != "\"${dir}\"" ]; then test_fail "mismatched: ${dirq} != ${dir}"; return; fi done rm ${TMPDIR}/tlist test_pass }; function test_defaults() { # Test _DEFAULTS_ pseudo-targets if test_start "defaults pseudo-targets"; then true; else return; fi cat < /dev/null > ${TMPDIR}/cmtab tlist="" for tgt in 0 1 2 3 4 5 6 7 do idx=`mkrandshort` idx2=`mkrandshort` idx3=`mkrandshort` cat <> ${TMPDIR}/cmtab _DEFAULTS_ { fstype=fs-${idx3} cipher=random keyhash=md-${idx} } target${idx} { dev=${TMPDIR}/loopfile dir=/mnt/point-${idx2} mountoptions=sync cipher=blowfish keyfile=${TMPDIR}/keyfile } EOF tlist="${tlist} target${idx},/mnt/point-${idx2},fs-${idx3}" done if ${SU_p} ${USER1} -c "${CM} --config-dir ${TMPDIR} --password ${PASSWD} --list" > ${TMPDIR}/tlist 2>&3; then true; else test_fail listing; return; fi if [ "`echo ${tlist} | wc -w`" -ne "`wc -l < ${TMPDIR}/tlist`" ]; then test_fail "wrong number of targets"; return fi for marker in ${tlist} do tupelize $marker tgt dir fs echo $tgt __ $dir __ $fs 1>&3 dirq=`awk "/^${tgt}/{ printf\"%s\",\\$5 }" ${TMPDIR}/tlist` fsq=`awk "/^${tgt}/{ printf\"%s\",\\$7 }" ${TMPDIR}/tlist` if [ "${dirq}" != "\"${dir}\"" ]; then test_fail "mismatched mount-point (${dirq} != ${dir})"; return; fi if [ "${fsq}" != "\"${fs}\"]" ]; then test_fail "mismatched fstype (${fsq} != ${fs})"; return; fi done rm ${TMPDIR}/tlist test_pass }; function test_bad_passwd() { # Test of password mismatch if test_start "basic password mismatch"; then true; else return; fi idx=`mkrandshort` cat < ${TMPDIR}/cmtab target${idx} { dev=${LOOPDEV} dir=${TMPDIR}/mnt fstype=ext2 mountoptions=defaults cipher=twofish keyformat=builtin keyfile=${TMPDIR}/keyfile keyhash=sha1 keycipher=blowfish-cbc } EOF rm -f ${TMPDIR}/keyfile if ${CM} --config-dir ${TMPDIR} --newpassword ${PASSWD} --generate-key 16 target${idx} 2>&3; then true; else test_fail "key-generation"; return; fi if ${CM} --config-dir ${TMPDIR} --password NOT${PASSWD} --prepare target${idx} 2>&3; then ${CM} --config-dir ${TMPDIR} --release target${idx} 2>&3 test_fail prepare else test_pass; fi }; function test_fdpasswd() { # Check reading of password via file-descriptor if test_start "command-line passwords"; then true; else return; fi idx=`mkrandshort` cat < ${TMPDIR}/cmtab target${idx} { dev=${LOOPDEV} dir=${TMPDIR}/mnt keyfile=${TMPDIR}/keyfile } EOF rm -f ${TMPDIR}/keyfile echo PASS1 > ${TMPDIR}/cmstrm COMMAND="${CM} --config-dir ${TMPDIR} --passwd-fd 5 --generate-key 16 target${idx}" if ${COMMAND} 5< ${TMPDIR}/cmstrm 2>&3; then true; else test_fail "key-generation (priv)"; return; fi if ${CM} --config-dir ${TMPDIR} --password PASS1 --prepare target${idx} 2>&3; then true; else test_fail "prepare"; fi wait_udev if ${CM} --config-dir ${TMPDIR} --release target${idx} 2>&3; then true; else test_fail "release"; fi echo PASS2 >> ${TMPDIR}/cmstrm if ${CM} --config-dir ${TMPDIR} --change-password --passwd-fd 6 target${idx} 6< ${TMPDIR}/cmstrm 2>&3; then true; else test_fail "password change"; fi echo PASS2 > ${TMPDIR}/cmstrm COMMAND="${CM} --config-dir ${TMPDIR} --passwd-fd 7 --prepare target${idx}" if ${COMMAND} 5< ${TMPDIR}/cmstrm 2>&3; then test_fail "prepare (bad-fd)"; return; fi if ${COMMAND} 7< ${TMPDIR}/cmstrm 2>&3; then true; else test_fail "prepare (2,priv)"; return; fi wait_udev if ${CM} --config-dir ${TMPDIR} --release target${idx} 2>&3; then true; else test_fail "release (2)"; fi rm ${TMPDIR}/cmstrm ${TMPDIR}/keyfile-old test_pass }; function test_bad_keyfmt() { # Test of unavailable key-manager if test_start "unavailable key-format"; then true; else return; fi idx=`mkrandshort` cat < ${TMPDIR}/cmtab target${idx} { dev=${LOOPDEV} dir=${TMPDIR}/mnt fstype=ext2 mountoptions=defaults cipher=twofish keyfile=${TMPDIR}/keyfile keyformat=BAD } EOF rm -f ${TMPDIR}/keyfile if ${CM} --config-dir ${TMPDIR} --newpassword ${PASSWD} --generate-key 16 target${idx} 2>&3; then test_fail "key-generation"; return; fi ${DD} if=/dev/urandom of=${TMPDIR}/keyfile bs=16c count=1 2>/dev/null if ${CM} --config-dir ${TMPDIR} --password ${PASSWD} --prepare target${idx} 2>&3; then ${CM} --config-dir ${TMPDIR} --release target${idx} 2>&3 test_fail prepare else test_pass; fi }; function test_bad_keyhash() { # Test of unavailable keyhash algorithm if test_start "unavailable key-hashing"; then true; else return; fi mgrlist=`${CM} --key-managers 2>/dev/null | sed -e 's/,/ /g' -e 's/\//' -e 's/\//' -e 's/\//'` for mgr in $mgrlist; do for alg in md15 sha19.2 rypemd; do echo "key-manager=${mgr} keyhash=${alg}" 1>&3 idx=`mkrandshort` cat < ${TMPDIR}/cmtab target${idx} { dev=${LOOPDEV} dir=${TMPDIR}/mnt fstype=ext2 mountoptions=defaults cipher=twofish keyformat=${mgr} keyfile=${TMPDIR}/keyfile keyhash=${alg} } EOF rm -f ${TMPDIR}/keyfile if ${CM} --config-dir ${TMPDIR} --newpassword ${PASSWD} --generate-key 16 target${idx} 2>&3; then test_fail "key-generation"; return; fi done done test_pass; }; function test_envvars() { # Test targets involving environmental variables if test_start "environmental variables"; then true; else return; fi idx=`mkrandshort` rm -f ${TMPDIR}/keyfile* cat < ${TMPDIR}/cmtab target${idx} { dev=${LOOPDEV} flags=nofsck dir=${TMPDIR}/mnt-\$(GROUPNAME) fstype=ext2 mountoptions=defaults cipher=twofish keyformat=builtin keyfile=${TMPDIR}/keyfile-\$(USERNAME) } EOF if ${CM} --config-dir ${TMPDIR} --newpassword ${PASSWD} --generate-key 16 target${idx} 2>&3; then true; else test_fail "make-key"; return; fi if [ ! -f ${TMPDIR}/keyfile-root ]; then test_fail "missing key"; return; fi if ${CM} --config-dir ${TMPDIR} --password ${PASSWD} --prepare target${idx} 2>&3; then true; else test_fail "prepare"; return; fi if mke2fs -q /dev/mapper/target${idx}; then true; else test_fail "mke2fs"; return; fi if ${CM} --config-dir ${TMPDIR} --release target${idx} 2>&3; then true; else test_fail "release"; return; fi for user in ${USER1} ${USER2}; do group=`su -s /bin/sh -c "id -ng" ${user}` echo "user=${user}.${group}" >&3 cp ${TMPDIR}/keyfile-root ${TMPDIR}/keyfile-${user} if ${SU_p} ${user} -c "${CM} --config-dir ${TMPDIR} --password ${PASSWD} --newpassword ${PASSWD}-${user} --change-password target${idx}" 2>&3; then true; else test_fail "changing password"; return; fi wait_udev mkdir ${TMPDIR}/mnt-${group} if ${SU_p} ${user} -c "${CM} --config-dir ${TMPDIR} --password ${PASSWD}-${user} --mount target${idx}" 2>&3; then true; else test_fail "mount-${user}"; return; fi if [ ! -d ${TMPDIR}/mnt-${group}/lost+found ]; then test_fail "lost+found ${user}.${group}"; return; fi if ${SU_p} ${user} -c "${CM} --config-dir ${TMPDIR} --unmount target${idx}" 2>&3; then true; else test_fail "mount-${user}"; return; fi done rm -f ${TMPDIR}/keyfile-* rmdir ${TMPDIR}/mnt-* test_pass; }; function test_frenzy() { # Test multiple targets being (un)mounted in parallel if test_start "frenetic activity"; then true; else return; fi rm -f ${TMPDIR}/keyfile tgtlist="" pos=0 fsz=2048 cat /dev/null > ${TMPDIR}/cmtab for cnt in 0 1 2 3 4 5 6 7; do if [ ! -d ${TMPDIR}/mnt${cnt} ]; then mkdir ${TMPDIR}/mnt${cnt}; fi idx=`mkrandshort` while ( echo ${tgtlist} | grep -q target${idx} ); do idx=`mkrandshort` done tgtlist="$tgtlist target${idx}" cat <> ${TMPDIR}/cmtab target${idx} { dev=${LOOPDEV} startsector=${pos} numsectors=${fsz} dir=${TMPDIR}/mnt${cnt} flags=user,nofsck fstype=ext2 mountoptions=defaults cipher=blowfish keyformat=builtin keyfile=${TMPDIR}/keyfile } EOF test -f ${TMPDIR}/keyfile || ${CM} --config-dir ${TMPDIR} --newpassword ${PASSWD} --generate-key 16 target${idx} 2>&3 pos=`expr ${pos} + ${fsz}` done cleanup="${CM} --config-dir ${TMPDIR} --release --all" if ${CM} --config-dir ${TMPDIR} --password ${PASSWD} --prepare --all 2>&3; then true; else test_fail "prepare" "${cleanup}"; return; fi for tgt in ${tgtlist}; do if mke2fs -q /dev/mapper/${tgt}; then true; else test_fail mke2fs; return; fi done wait_udev for tgt in ${tgtlist}; do if ${CM} --config-dir ${TMPDIR} --release ${tgt} 2>&3; then true; else test_fail release; fi done srtlist=`echo ${tgtlist} | awk '{for (i=1; i<=NF; ++i) printf"%s\n",\$i}' | sort` for tgt in ${srtlist}; do ${SU_p} ${USER1} -c "${CM} --config-dir ${TMPDIR} --password ${PASSWD} --mount ${tgt}" 2>&3 & done wait cat ${TMPDIR}/cryptmount.status 1>&3 cleanup="${CM} --config-dir ${TMPDIR} --unmount --all" if [ "`wc -l ${TMPDIR}/cryptmount.status | awk '{printf"%d",$1}'`" -ne 10 ]; then test_fail "cmstatus" "${cleanup}" ; return; fi if [ `df -k | grep -c /dev/mapper/target` -lt 8 ]; then test_fail "df" "${cleanup}" ; return; fi if ${SU_p} ${USER1} -c "${CM} --config-dir ${TMPDIR} --unmount ${tgtlist}" 2>&3; then true; else test_fail unmount; return; fi test_pass }; function test_cipher_algs() { # Test usability of different encryption algorithms if test_start "cipher-algorithm availability"; then true; else return; fi for CipherLen in aes,32 blowfish,48 twofish,32 serpent,12 do tupelize $CipherLen cipher len echo "cipher=${CipherLen}" 1>&3 idx=`mkrandshort` cat < ${TMPDIR}/cmtab target${idx} { flags=user,fsck dev=${TMPDIR}/loopfile dir=${TMPDIR}/mnt fstype=ext3 mountoptions=noatime,sync cipher=${cipher} fsckoptions=-N;-V keyfile=${TMPDIR}/keyfile keyformat=builtin } EOF rm -f ${TMPDIR}/keyfile if ${CM} --config-dir ${TMPDIR} --newpassword ${PASSWD} --generate-key 16 target${idx} 2>&3; then true; else test_fail "key-generation"; return; fi if ${CM} --config-dir ${TMPDIR} --password ${PASSWD} --prepare target${idx} 2>&3; then true; else test_fail prepare; return; fi if mke2fs -q -j /dev/mapper/target${idx}; then true; else test_fail mke2fs; return; fi wait_udev if ${CM} --config-dir ${TMPDIR} --release target${idx} 2>&3; then true; else test_fail release; return; fi if ${SU_p} ${USER1} -c "${CM} --config-dir ${TMPDIR} --password ${PASSWD} --mount target${idx}" 1>&3 2>&3; then true; else test_fail "mount"; return; fi wait_udev if ${SU_p} ${USER1} -c "${CM} --config-dir ${TMPDIR} --unmount target${idx}" 2>&3; then true; else test_fail "unmount"; return; fi done test_pass }; function test_purepw() { # Test pure-password key-manager if test_start "pure-password key-manager"; then true; else return; fi # Check against reference encrypted filesystem: idx=`mkrandshort` cat < ${TMPDIR}/cmtab target${idx} { keyformat=password cipher=aes dev=`pwd`/passwd.fs } EOF cleanup="${CM} --config-dir ${TMPDIR} --release --all" if ${CM} --config-dir ${TMPDIR} --password "pure" --prepare target${idx} 2>&3; then true; else test_fail "prepare passwd.fs"; return; fi wait_udev if [ "`head -n 1 /dev/mapper/target${idx}`" = "PurePassword" ]; then true; else test_fail "bad decrypt" "${cleanup}"; return; fi if ${CM} --config-dir ${TMPDIR} --release target${idx} 2>&3; then true; else test_fail "release passwd.fs" "${cleanup}"; return; fi # Check creation & access of new filesystems: for CipherLen in aes,16 twofish,24 serpent,18 do tupelize $CipherLen cipher len echo "cipher=${CipherLen}" 1>&3 idx=`mkrandshort` cat < ${TMPDIR}/cmtab target${idx} { keyformat=password dev=${TMPDIR}/loopfile dir=${TMPDIR}/mnt flags=user,nofsck fstype=ext2 cipher=${cipher} } EOF rm -f ${TMPDIR}/keyfile if ${CM} --config-dir ${TMPDIR} --password ${PASSWD} --prepare target${idx} 2>&3; then true; else test_fail prepare; return; fi if mke2fs -q /dev/mapper/target${idx}; then true; else test_fail mke2fs; return; fi wait_udev if ${CM} --config-dir ${TMPDIR} --release target${idx} 2>&3; then true; else test_fail release; return; fi wait_udev if ${SU_p} ${USER1} -c "${CM} --config-dir ${TMPDIR} --password "not-${PASSWD}" --mount target${idx}" 2>&3; then test_fail "bad-password"; return; fi if ${SU_p} ${USER1} -c "${CM} --config-dir ${TMPDIR} --password ${PASSWD} --mount target${idx}" 2>&3; then true; else test_fail "mount"; return; fi if ${SU_p} ${USER1} -c "${CM} --config-dir ${TMPDIR} --unmount target${idx}" 2>&3; then true; else test_fail "unmount"; return; fi wait_udev done test_pass }; function test_ssl_algs() { # Test usability of OpenSSL key & hashing algorithms if test_start "OpenSSL-algorithm availability"; then true; else return; fi if ${CM} --key-managers 2>/dev/null | grep -q openssl; then true; else test_fail "No OpenSSL support"; return; fi for keycipher in aes-128-cbc des cast do for keyhash in md5 sha1 do echo "keycipher=${keycipher} keyhash=${keyhash}" 1>&3 mk_ssl_keyfile 16 ${keyhash} ${keycipher} > ${TMPDIR}/keyfile idx=`mkrandshort` cat < ${TMPDIR}/cmtab target${idx} { flags=user,nofsck dev=${TMPDIR}/loopfile dir=${TMPDIR}/mnt fstype=ext3 mountoptions=noatime,sync cipher=aes-ecb keyformat=openssl keyfile=${TMPDIR}/keyfile keyhash=${keyhash} keycipher=${keycipher} } EOF if ${CM} --config-dir ${TMPDIR} --password ${PASSWD} --prepare target${idx} 2>&3; then true; else test_fail prepare; return; fi if mke2fs -q -j /dev/mapper/target${idx}; then true; else test_fail mke2fs; return; fi wait_udev if ${CM} --config-dir ${TMPDIR} --release target${idx} 2>&3; then true; else test_fail release; return; fi if ${SU_p} ${USER1} -c "${CM} --config-dir ${TMPDIR} --password ${PASSWD} --mount target${idx}" 2>&3; then true; else test_fail mount; return; fi wait_udev if ${SU_p} ${USER1} -c "${CM} --config-dir ${TMPDIR} --unmount target${idx}" 2>&3; then true; else test_fail unmount; return; fi wait_udev done done test_pass }; function test_gcry_algs() { # Test usability of libgcrypt key & hashing algorithms if test_start "libgcrypt-algorithm availability"; then true; else return; fi if ${CM} --key-managers 2>/dev/null | grep -q -w libgcrypt; then true; else test_fail "No libgcrypt support"; return; fi for keycipher in blowfish cast5-ecb aes192 3des-cbc do for keyhash in ripemd160 tiger192 sha512 do echo "keycipher=${keycipher} keyhash=${keyhash}" 1>&3 idx=`mkrandshort` cat < ${TMPDIR}/cmtab target${idx} { flags=user,nofsck dev=${TMPDIR}/loopfile dir=${TMPDIR}/mnt fstype=ext3 mountoptions=noatime,sync cipher=twofish keyformat=libgcrypt keyfile=${TMPDIR}/keyfile keyhash=${keyhash} keycipher=${keycipher} } EOF rm -f ${TMPDIR}/keyfile if ${CM} --config-dir ${TMPDIR} --newpassword ${PASSWD} --generate-key 16 target${idx} 2>&3; then true; else test_fail "key-generation"; return; fi if ${CM} --config-dir ${TMPDIR} --password ${PASSWD} --prepare target${idx} 2>&3; then true; else test_fail prepare; return; fi if mke2fs -q -j /dev/mapper/target${idx}; then true; else test_fail mke2fs; return; fi wait_udev if ${CM} --config-dir ${TMPDIR} --release target${idx} 2>&3; then true; else test_fail release; return; fi if ${SU_p} ${USER1} -c "${CM} --config-dir ${TMPDIR} --password ${PASSWD} --mount target${idx}" 2>&3; then true; else test_fail mount; return; fi wait_udev if ${SU_p} ${USER1} -c "${CM} --config-dir ${TMPDIR} --unmount target${idx}" 2>&3; then true; else test_fail "unmount"; return; fi wait_udev done done test_pass }; function test_gcryossl() { # Test usability of libgcrypt OpenSSL-compatibility layer if test_start "libgcrypt OpenSSL-emulator"; then true; else return; fi if ${CM} --key-managers 2>/dev/null | grep -q -w openssl-compat; then true; else test_fail "No openssl-compat support"; return; fi configs="aes128:rmd160:aes128:ripemd160 aes-128-cbc:md5:aes-cbc:md5 \ aes-192-ecb:md4:aes192-ecb:md4 aes-256-cbc:md5:aes256-cbc:md5 \ bf-cbc:sha1:blowfish-cbc:sha1 cast:rmd160:cast5-cbc:ripemd160 \ des:sha1:des:sha1" for config in ${configs} do echo "config=${config}" 1>&3 Ocipher=`echo $config | awk 'BEGIN{FS=":"}{printf"%s",$1}'` Ohash=`echo $config | awk 'BEGIN{FS=":"}{printf"%s",$2}'` Gcipher=`echo $config | awk 'BEGIN{FS=":"}{printf"%s",$3}'` Ghash=`echo $config | awk 'BEGIN{FS=":"}{printf"%s",$4}'` # generate key-file with openssl program: mk_ssl_keyfile 16 ${Ohash} ${Ocipher} > ${TMPDIR}/keyfile idx=`mkrandshort` cat < ${TMPDIR}/cmtab target${idx} { flags=user,nofsck dev=${TMPDIR}/loopfile dir=${TMPDIR}/mnt fstype=ext3 mountoptions=noatime,sync cipher=aes-ecb keyformat=openssl-compat keyfile=${TMPDIR}/keyfile keyhash=${Ghash} keycipher=${Gcipher} } EOF # configure filesystem with libgcrypt-openssl compatibility layer: if ${CM} --config-dir ${TMPDIR} --password ${PASSWD} --prepare target${idx} 2>&3; then true; else test_fail prepare; return; fi if mke2fs -q -j /dev/mapper/target${idx}; then true; else test_fail mke2fs; return; fi wait_udev if ${CM} --config-dir ${TMPDIR} --release target${idx} 2>&3; then true; else test_fail release; return; fi # change to openssl-keymanager, if available: if ${CM} --key-managers 2>/dev/null | grep -q -w openssl; then ed -s ${TMPDIR}/cmtab <&3; then true; else test_fail mount; return; fi wait_udev if ${SU_p} ${USER1} -c "${CM} --config-dir ${TMPDIR} --unmount target${idx}" 2>&3; then true; else test_fail unmount; return; fi wait_udev done test_pass }; function test_mountlock() { # Test of mounting & user-locking if test_start "mounting & user-locking"; then true; else return; fi idx=`mkrandshort` cat < ${TMPDIR}/cmtab target${idx} { flags=user,nofsck dev=${TMPDIR}/loopfile dir=${TMPDIR}/mnt fstype=ext3 mountoptions=nosuid,noexec cipher=twofish keyfile=${TMPDIR}/keyfile } EOF rm -f ${TMPDIR}/keyfile if ${CM} --config-dir ${TMPDIR} --generate-key 32 --newpassword ${PASSWD} target${idx} 2>&3; then true; else test_fail make-key; return; fi if ${CM} --config-dir ${TMPDIR} --password ${PASSWD} --prepare target${idx} 2>&3; then true; else test_fail prepare; return; fi if mke2fs -q -j /dev/mapper/target${idx}; then true; else test_fail mke2fs; return; fi wait_udev if ${CM} --config-dir ${TMPDIR} --release target${idx} 2>&3; then true; else test_fail release; return; fi if ${SU_p} ${USER1} -c "${CM} --config-dir ${TMPDIR} --password ${PASSWD} --mount target${idx}" 2>&3; then true; else test_fail mount; return; fi if ${SU_p} ${USER2} -c "${CM} --config-dir ${TMPDIR} --unmount target${idx}" 2>&3; then test_fail bad-unmount; return; fi if ${SU_p} ${USER1} -c "${CM} --config-dir ${TMPDIR} --unmount target${idx}" 2>&3; then true; else test_fail unmount; return; fi test_pass }; function test_userflags() { # Test of mounting with user/nouser flags if test_start "mounting & user-flags"; then true; else return; fi idx=`mkrandshort` cat < ${TMPDIR}/cmtab target${idx} { flags=nouser,nofsck dev=${TMPDIR}/loopfile dir=${TMPDIR}/mnt fstype=ext3 mountoptions=nosuid,noexec cipher=twofish keyfile=${TMPDIR}/keyfile } EOF rm -f ${TMPDIR}/keyfile if ${CM} --config-dir ${TMPDIR} --generate-key 16 --newpassword ${PASSWD} target${idx} 2>&3; then true; else test_fail make-key; return; fi if ${CM} --config-dir ${TMPDIR} --password ${PASSWD} --prepare target${idx} 2>&3; then true; else test_fail prepare; return; fi if mke2fs -q -j /dev/mapper/target${idx}; then true; else test_fail mke2fs; return; fi wait_udev if ${CM} --config-dir ${TMPDIR} --release target${idx} 2>&3; then true; else test_fail release; return; fi for cfg in user,${USER1},pass user,root,pass nouser,${USER1},fail nouser,root,pass do tupelize $cfg flgs usr exp ed -s ${TMPDIR}/cmtab </dev/null 1>&2 /flags=/ c flags=${flgs},nofsck . w q EOF echo "config: ${cfg}" 1>&3 ${SU_p} ${usr} -c "${CM} --config-dir ${TMPDIR} --password ${PASSWD} --mount target${idx}" 1>&3 2>&3 stat=$? if [ \( "$stat" -eq 0 -a "$exp" != "pass" \) -o \( "$stat" -ne 0 -a "$exp" != "fail" \) ]; then test_fail bad-mount return fi wait_udev ${SU_p} ${usr} -c "${CM} --config-dir ${TMPDIR} --password ${PASSWD} --unmount target${idx}" 2>&3 stat=$? if [ \( "$stat" -eq 0 -a "$exp" != "pass" \) -o \( "$stat" -ne 0 -a "$exp" != "fail" \) ]; then test_fail bad-unmount return fi done test_pass }; function test_mountsynonyms() { # Test for synonyms of (un)mount if test_start "mount synonyms"; then true; else return; fi idx=`mkrandshort` cat < ${TMPDIR}/cmtab target${idx} { flags=user,nofsck dev=${TMPDIR}/devfile dir=${TMPDIR}/mnt fstype=ext3 mountoptions=,,,noatime cipher=blowfish keyfile=${TMPDIR}/keyfile keyformat=raw } EOF rm -f ${TMPDIR}/keyfile if ${CM} --config-dir ${TMPDIR} --generate-key 12 --newpassword ${PASSWD} target${idx} 2>&3; then true; else test_fail make-key; return; fi if ${CM} --config-dir ${TMPDIR} --password ${PASSWD} --prepare target${idx} 2>&3; then true; else test_fail prepare; return; fi if mke2fs -q -j /dev/mapper/target${idx}; then true; else test_fail mke2fs; return; fi wait_udev if ${CM} --config-dir ${TMPDIR} --release target${idx} 2>&3; then true; else test_fail release; return; fi for mntopt in "" "-m" "--mount" do for unmopt in "-u" "--unmount" do echo "mount[${mntopt}] unmount[${unmopt}]" 1>&3 if ${SU_p} ${USER1} -c "${CM} --config-dir ${TMPDIR} --password ${PASSWD} ${mntopt} target${idx}" 2>&3; then true; else test_fail mount; return; fi wait_udev if ${SU_p} ${USER1} -c "${CM} --config-dir ${TMPDIR} ${unmopt} target${idx}" 2>&3; then true; else test_fail unmount; return; fi done done test_pass }; function test_offsets() { # check if startsector/numsectors parameters operate correctly if test_start "block offsets"; then true; else return; fi rm -f ${TMPDIR}/keyfile for offset in 0 16 256 do for length in 128 512 2048 do idx=`mkrandshort` cat < ${TMPDIR}/cmtab target${idx} { flags=user,nofsck dev=${TMPDIR}/devfile startsector=${offset} numsectors=${length} dir=${TMPDIR}/mnt fstype=ext2 mountoptions=defaults cipher=aes ivoffset=61 keyfile=${TMPDIR}/keyfile } EOF test -f ${TMPDIR}/keyfile || ${CM} --config-dir ${TMPDIR} --newpassword ${PASSWD} --generate-key 16 target${idx} 2>&3 ${DD} if=/dev/zero of=${LOOPDEV} 2>/dev/null sync if ${CM} --config-dir ${TMPDIR} --password ${PASSWD} --prepare target${idx} 2>&3; then cleanup="${CM} --config-dir ${TMPDIR} --release target${idx}" ${DD} if=/dev/zero of=/dev/mapper/target${idx} bs=1b count=`expr ${length} + 16` 2>&3 wait_udev ${CM} --config-dir ${TMPDIR} --release target${idx} 2>&3 wait_udev sync locs=`${TMPDIR}/bingrep < ${LOOPDEV}` first=`echo $locs | awk '{printf"%d",($1 / 512)}'` extent=`echo $locs | awk '{printf"%d", ($2 - $1) / 512}'` echo "offset=${offset} length=${length} vs first=${first} extent=${extent}" 1>&3 if [ "${first}" -ne "${offset}" -o "${extent}" -ne "${length}" ]; then test_fail "offset/length mismatch (${first}/${extent} != ${offset}/${length})" "${cleanup}" return fi else test_fail prepare return fi done done test_pass }; function test_swap() { # Basic test of swapon/swapoff on raw device if test_start "swapon (device)"; then true; else return; fi for cfg in ext2,rand,mkswap,fail swap,rand,mkswap,pass \ swap,rand,nomkswap,fail swap,zero,mkswap,pass \ swap,blank,mkswap,fail swap,data,mkswap,fail do tupelize $cfg fstype format flg exp idx=`mkrandshort` prio=`od -An -N1 -t u1 /dev/urandom | sed 's% *%%g'` cat < ${TMPDIR}/cmtab swap${idx} { dev=${LOOPDEV} mountoptions=pri=${prio} fstype=${fstype} flags=${flg} cipher=twofish-cbc-plain keyformat=raw keyfile=/dev/urandom keymaxlen=32 } EOF echo "config: $cfg - prio=${prio}" 1>&3 case $format in zero) ${DD} if=/dev/zero of=${LOOPDEV} bs=1M count=4 2>/dev/null ;; blank) mke2fs -q ${LOOPDEV} ;; rand) ${DD} if=/dev/urandom of=${LOOPDEV} bs=1M count=4 2>/dev/null ;; data) ${DD} if=$0 of=${LOOPDEV} bs=1M count=4 2>/dev/null ;; esac wait_udev; sync if ${SU_p} ${USER1} -c "${CM} --config-dir ${TMPDIR} --password ${PASSWD} --swapon swap${idx}" 2>&3; then test_fail privilege; return; fi if grep -q swap${idx} /proc/swaps; then test_fail pre-existing; return; fi ${CM} --config-dir ${TMPDIR} --password ${PASSWD} --swapon swap${idx} 2>&3; stat=$? echo "stat: $stat" 1>&3 if [ \( "$stat" -eq 0 -a "$exp" != "pass" \) -o \( "$stat" -ne 0 -a "$exp" != "fail" \) ]; then test_fail "swapon" return fi wait_udev if [ "$stat" -eq 0 ]; then cat /proc/swaps >&3 if grep -q "\<${prio}\>" /proc/swaps; then true; else test_fail "proc+swaps"; return; fi # Beware that udev may rename our swap device within /proc/swaps! fi ${CM} --config-dir ${TMPDIR} --password ${PASSWD} --swapoff swap${idx} 2>&3; if [ \( "$stat" -eq 0 -a "$exp" != "pass" \) -o \( "$stat" -ne 0 -a "$exp" != "fail" \) ]; then test_fail swapoff return fi if [ "$stat" -eq 0 ]; then if grep -q swap${idx} /proc/swaps; then test_fail proc-swaps; return; fi fi wait_udev done test_pass }; function test_fdconfig() { # Test usage of configuration via file-descriptor if test_start "command-line config-file"; then true; else return; fi if [ -f ${TMPDIR}/keyfile ]; then rm ${TMPDIR}/keyfile; fi idx=`mkrandshort` cat < ${TMPDIR}/cmtab target${idx} { dev=${LOOPDEV} dir=${TMPDIR}/mnt fstype=ext2 flags=defaults cipher=twofish keyfile=${TMPDIR}/keyfile } EOF COMMAND="${CM} --config-dir ${TMPDIR} --newpassword ${PASSWD} --generate-key 16 target${idx}" if ${COMMAND} 2>&3; then true; else test_fail "key-generation (priv)"; return; fi cp ${TMPDIR}/cmtab ${TMPDIR}/cmstrm cat /dev/null > ${TMPDIR}/cmtab COMMAND="${CM} --config-dir ${TMPDIR} --password ${PASSWD} --config-fd 5 --prepare target${idx}" if ${SU_p} ${USER1} -c "${COMMAND}" 5< ${TMPDIR}/cmstrm 2>&3; then test_fail "config-fd"; return; fi if ${COMMAND} 5< ${TMPDIR}/cmstrm 2>&3; then true; else test_fail "config-fd (priv)"; return; fi wait_udev COMMAND="${CM} --config-dir ${TMPDIR} --password ${PASSWD} --config-fd 7 --release target${idx}" if ${SU_p} ${USER1} -c "${COMMAND}" 7< ${TMPDIR}/cmstrm 2>&3; then test_fail "config-fd"; return; fi if ${COMMAND} 7< ${TMPDIR}/cmstrm 2>&3; then true; else test_fail "config-fd (priv)"; return; fi rm ${TMPDIR}/cmstrm test_pass }; function test_privblock() { # Test blockage of privileged actions if test_start "privilege checks"; then true; else return; fi if [ -f ${TMPDIR}/keyfile ]; then rm ${TMPDIR}/keyfile; fi if [ -f ${TMPDIR}/keyfile_ ]; then rm ${TMPDIR}/keyfile_; fi ${DD} if=/dev/zero of=${LOOPDEV} bs=1M count=4 2>/dev/null; sync idx=`mkrandshort` NEWPASSWD="${PASSWD}-new${idx}" cat < ${TMPDIR}/cmtab target${idx} { dev=${LOOPDEV} dir=${TMPDIR}/mnt fstype=swap flags=mkswap cipher=twofish keyfile=${TMPDIR}/keyfile keyhash=sha1 keycipher=aes-192-cbc } target${idx}_ { dev=${LOOPDEV} dir=${TMPDIR}/mnt fstype=swap flags=mkswap cipher=twofish keyfile=${TMPDIR}/keyfile_ keyhash=sha1 keycipher=aes-192-cbc } EOF COMMAND="${CM} --config-dir ${TMPDIR} --newpassword ${PASSWD} --generate-key 16 target${idx}" if ${SU_p} ${USER1} -c "${COMMAND}" 2>&3; then test_fail "key-generation"; return; fi if ${COMMAND} 2>&3; then true; else test_fail "key-generation (priv)"; return; fi COMMAND="${CM} --config-dir ${TMPDIR} --password ${PASSWD} --newpassword ${NEWPASSWD} --reuse-key target${idx} target${idx}_" if ${SU_p} ${USER1} -c "${COMMAND}" 2>&3; then test_fail "key-reuse"; return; fi if ${COMMAND} 2>&3; then true; else test_fail "key-reuse (priv)"; return; fi wait_udev for action in --prepare --release --swapon --swapoff --safetynet do COMMAND="${CM} --config-dir ${TMPDIR} --password ${PASSWD} ${action} target${idx}" if ${SU_p} ${USER1} -c "${COMMAND}" 2>&3; then test_fail "${action}"; return; fi if ${COMMAND} 2>&3; then true; else test_fail "${action} (priv)"; return; fi wait_udev done rm ${TMPDIR}/keyfile_ test_pass }; function test_voverride() { # Test file-format overrides if test_start "version overrides"; then true; else return; fi for config in 0,pass 1,pass 2,fail; do echo "config=${config}" >&3 tupelize ${config} fversion exp idx=`mkrandshort` cat < ${TMPDIR}/cmtab target${idx} { dev=${LOOPDEV} dir=${TMPDIR}/mnt fstype=ext2 mountoptions=defaults keyformat=builtin:${fversion} keyfile=${TMPDIR}/keyfile } EOF rm -f ${TMPDIR}/keyfile ${CM} --config-dir ${TMPDIR} --newpassword ${PASSWD} --generate-key 16 target${idx} 1>&3 2>&3 stat=$? if [ "$stat" -eq 0 -a "${exp}" == "pass" ]; then obsv=`od -j 7 -N 1 -t d1 ${TMPDIR}/keyfile | sed -n '1s/^[0-9]* *//p'` if [ "$obsv" -ne "$fversion" ]; then test_fail "Version mismatch (${obsv} vs ${fversion})"; return; fi elif [ "${exp}" != "fail" ]; then test_fail "Bad version" return fi done test_pass }; function test_cryptsetup_compat() { # Check compatibility with (plain old) cryptsetup if test_start "cryptsetup compatibility"; then true; else return; fi if which cryptsetup 1>&3; then true; else test_fail "cryptsetup not available"; return; fi if ${CM} --key-managers 2>/dev/null | grep -q openssl; then true; else test_fail "No OpenSSL support"; return; fi mk_ssl_keyfile 32 md5 aes192 > ${TMPDIR}/keyfile openssl enc -d -aes192 -md md5 -in ${TMPDIR}/keyfile -pass pass:${PASSWD} -out ${TMPDIR}/keymat for cipher in blowfish serpent do for length in 4096 8192 do for startsec in 0 32 do for ivoffset in 0 172 932 do idx=`mkrandshort` echo "${cipher},${length},${startsec},${ivoffset}" 1>&3 cryptsetup --key-file ${TMPDIR}/keymat -c ${cipher} -b ${length} -o ${startsec} -p ${ivoffset} create cstarget${idx} ${LOOPDEV} 2>&3 if [ -b /dev/mapper/cstarget${idx} ]; then cs_size=`blockdev --getsize /dev/mapper/cstarget${idx}` ${DD} if=/dev/zero of=/dev/mapper/cstarget${idx} \ bs=16k count=16 2>/dev/null mke2fs -q -j /dev/mapper/cstarget${idx} wait_udev cryptsetup remove cstarget${idx} else test_fail "cryptsetup creation"; return fi if [ "${cs_size}" -ne "${length}" ]; then # Beware non-functioning '--size' option in cryptsetup-1.2 test_fail "cryptsetup incorrect sizing ($cs_size vs $length)"; return; fi cat < ${TMPDIR}/cmtab target${idx} { flags=user,nofsck dev=${LOOPDEV} startsector=${startsec} numsectors=${length} dir=${TMPDIR}/mnt fstype=ext3 mountoptions=defaults cipher=${cipher} ivoffset=${ivoffset} keyformat=openssl keyfile=${TMPDIR}/keyfile keyhash=md5 keycipher=aes192 } EOF if ${CM} --config-dir ${TMPDIR} --password ${PASSWD} target${idx} 2>&3; then true; else test_fail "mount"; return; fi wait_udev if ${CM} --config-dir ${TMPDIR} --password ${PASSWD} --unmount target${idx} 2>&3; then true; else test_fail "unmount"; return; fi done done done done rm ${TMPDIR}/keymat test_pass }; function test_luks_compat() { # Check compatibility with cryptsetup-luks, importing into cryptmount if test_start "LUKS compatibility"; then true; else return; fi if which cryptsetup 1>&3; then true; else test_fail "cryptsetup not available"; return; fi if ${CM} --key-managers 2>/dev/null | grep -q luks; then true; else test_fail "No LUKS support"; return; fi echo -n "keyslot0-password" > ${TMPDIR}/keymat0 echo -n "${PASSWD}" > ${TMPDIR}/keymat for CipherLen in aes,128 blowfish,288 twofish-ecb,128 serpent-cbc-plain,96 do tupelize $CipherLen cipher len echo "config: $CipherLen" 1>&3 # Setup partition with cryptsetup-luks: TMPTGT="mudslinger-`mkrandshort`" if ${DD} if=/dev/zero of=${LOOPDEV} bs=1k count=1 conv=notrunc 2>/dev/null; then true; else test_fail "purging"; return; fi cryptsetup --batch-mode --cipher ${cipher} --key-size ${len} luksFormat "${LOOPDEV}" ${TMPDIR}/keymat0 1>&3 2>&3 cryptsetup --key-file ${TMPDIR}/keymat0 --cipher ${cipher} --key-slot 2 luksAddKey "${LOOPDEV}" ${TMPDIR}/keymat 1>&3 2>&3 wait_udev cryptsetup --key-file ${TMPDIR}/keymat luksOpen "${LOOPDEV}" "${TMPTGT}" 1>&3 2>&3 if [ ! -b /dev/mapper/${TMPTGT} ]; then test_fail "luksOpen"; return; fi if mke2fs -q -j "/dev/mapper/${TMPTGT}"; then true; else test_fail mke2fs; return; fi wait_udev cryptsetup luksClose "${TMPTGT}" 2>&3 sync idx=`mkrandshort` cat < ${TMPDIR}/cmtab target${idx} { dev=${LOOPDEV} dir=${TMPDIR}/mnt fstype=ext3 flags=nofsck keyformat=luks cipher=aes # This should be overridden by LUKS header } EOF if ${SU_p} ${USER1} -c "${CM} --config-dir ${TMPDIR} --password ${PASSWD} target${idx}" 2>&3; then true; else test_fail "mount"; return; fi wait_udev; sleep 1 if ${SU_p} ${USER1} -c "${CM} --config-dir ${TMPDIR} --unmount target${idx}" 2>&3; then true; else test_fail "unmount"; return; fi if ${CM} --config-dir ${TMPDIR} --newpassword ${PASSWD} --generate-key 16 target${idx} 2>&3; then test_fail "re-formatting"; fi wait_udev done rm ${TMPDIR}/keymat0 ${TMPDIR}/keymat test_pass }; function test_luks_tapmoc() { # Check inverse-compatibility with cryptsetup-luks, as cryptmount export if test_start "LUKS inverse-compatibility"; then true; else return; fi if which cryptsetup 1>&3; then true; else test_fail "cryptsetup not available"; return; fi if ${CM} --key-managers 2>/dev/null | grep -q luks; then true; else test_fail "No LUKS support"; return; fi echo -n "${PASSWD}" > ${TMPDIR}/keymat for CipherMode in aes,ecb blowfish,cbc-plain twofish,cbc-essiv:md5 do tupelize $CipherMode cipher mode echo "config: $CipherMode" 1>&3 # Setup partition with cryptmount: idx=`mkrandshort` cat < ${TMPDIR}/cmtab target${idx} { dev=${LOOPDEV} dir=${TMPDIR}/mnt fstype=ext3 flags=nofsck keyformat=luks keyfile=${LOOPDEV} cipher=${cipher}-${mode} } EOF if ${DD} if=/dev/zero of=${LOOPDEV} bs=1k count=1 conv=notrunc 2>/dev/null; then true; else test_fail "purging"; return; fi sync if ${CM} --config-dir ${TMPDIR} --newpassword ${PASSWD} --generate-key 32 target${idx} 1>&3 2>&3; then true; else test_fail "key-generation"; return; fi if ${CM} --config-dir ${TMPDIR} --password ${PASSWD} --prepare target${idx} 2>&3; then true; else test_fail "prepare"; return; fi if mke2fs -q /dev/mapper/target${idx}; then true; else test_fail "mke2fs"; return; fi wait_udev if ${CM} --config-dir ${TMPDIR} --release target${idx} 2>&3; then true; else test_fail "release"; return; fi wait_udev # Attempt to mount with cryptsetup-luks: TMPTGT="mudslinger-`mkrandshort`" cryptsetup --key-file ${TMPDIR}/keymat luksOpen "${LOOPDEV}" "${TMPTGT}" 1>&3 2>&3 if [ ! -b /dev/mapper/${TMPTGT} ]; then test_fail "luksOpen"; return; fi if mount -t ext2 /dev/mapper/${TMPTGT} ${TMPDIR}/mnt; then true; else test_fail "mount"; return; fi wait_udev lukscipher=`cryptsetup luksDump "${LOOPDEV}" | sed -n '/^Cipher name/s/^[^:]*:\s*//p'` luksmode=`cryptsetup luksDump "${LOOPDEV}" | sed -n '/^Cipher mode/s/^[^:]*:\s*//p'` echo "LUKSheader: $lukscipher + $luksmode" 1>&3 umount /dev/mapper/${TMPTGT} cryptsetup luksClose "${TMPTGT}" 2>&3 if [ "$cipher" != "$lukscipher" ]; then test_fail "cipher mismatch ($lukscipher)"; return; fi if [ "$mode" != "$luksmode" ]; then test_fail "mode mismatch ($luksmode)"; return; fi # Check that re-formatting is blocked: if ${CM} --config-dir ${TMPDIR} --newpassword ${PASSWD} --generate-key 16 target${idx} 2>&3; then test_fail "re-formatting"; fi wait_udev done rm ${TMPDIR}/keymat test_pass }; function test_loopset() { # Check that 'loopdev' parameter correctly targets specific loopback dev if test_start "loopdev specification"; then true; else return; fi rm -f ${TMPDIR}/keyfile idx=`mkrandshort` for ldev in /dev/loop{3,6,1,0,7,4,2,5} do if ${LOSETUP} $ldev >/dev/null 2>&1; then # loop-device is already in use true else cat < ${TMPDIR}/cmtab target${idx} { dev=${TMPDIR}/loopfile loop=${ldev} dir=${TMPDIR}/mnt fstype=ext2 mountoptions=,,,ro,,,noatime cipher=twofish keyfile=${TMPDIR}/keyfile keyformat=raw } EOF test -f ${TMPDIR}/keyfile || ${CM} --config-dir ${TMPDIR} --newpassword ${PASSWD} --generate-key 16 target${idx} 2>&3 if ${CM} --config-dir ${TMPDIR} --password ${PASSWD} --prepare target${idx} 2>&3; then true; else test_fail prepare; return; fi wait_udev if ${LOSETUP} $ldev 1>&3 2>&3; then if ${CM} --config-dir ${TMPDIR} --password ${PASSWD} --release target${idx} 2>&3; then true; else test_fail release; return; fi else ${CM} --config-dir ${TMPDIR} --password ${PASSWD} --release target${idx} 2>&3 test_fail "loopback unconfigured"; return fi fi done test_pass }; function test_residues() { # Check if any zombie device-mapper targets have been created if test_start "device-mapper residue targets"; then true; else return; fi sleep 1 # give time for old targets to die dmsetup ls | grep '^target' > "${TMPDIR}/dm-list1" if cmp -s "${TMPDIR}/dm-list0" "${TMPDIR}/dm-list1"; then test_pass else test_fail echo "BEFORE:" 1>&3 cat "${TMPDIR}/dm-list0" 1>&3 echo "AFTER:" 1>&3 cat "${TMPDIR}/dm-list1" 1>&3 fi rm "${TMPDIR}/dm-list1" }; # # Main program # # Prepare log-file: logfile="mudslinger-@PKG_VERSION@-`date +'%H%M:%d%b%y'`.log" exec 3> ${logfile} chgrp --reference=$0 ${logfile} || true cat >&3 <&3 2>&1 lsb_release -a >&3 2>&1 || echo "(No lsb_release info)" >&3 if [ -r /usr/include/linux/version.h ]; then cat /usr/include/linux/version.h >&3 fi if [ ! -d ${TMPDIR} ]; then mkdir ${TMPDIR} ${TMPDIR}/mnt else echo "${TMPDIR} already exists - exiting" exit 1 fi for usr in ${USER1} ${USER2}; do if ${SU_p} ${usr} -c "ls /bin > /dev/null"; then true; else echo "${usr} may not be a valid user" exit 1 fi done if [ ! -u ${CM} ]; then chown root ${CM} chmod u+xs,go+rx ${CM} fi # Prepare loopback file & pseudo device file: set -e touch ${TMPDIR}/keyfile ${DD} if=/dev/zero of=${TMPDIR}/loopfile bs=1M count=64 2>&3 1>&2 ${DD} if=/dev/zero of=${TMPDIR}/devfile bs=1M count=64 2>&3 1>&2 if ${LOSETUP} ${LOOPDEV} ${TMPDIR}/devfile; then true; else echo "Failed to setup ${LOOPDEV}"; exit 2; fi LOOPDEV2=`${LOSETUP} -f` set +e # Keep record of existing device-mapper targets dmsetup ls | grep '^target' > ${TMPDIR}/dm-list0 # Prepare binary-search tool: mkbingrep ${TMPDIR}/bingrep # attempt to cleanup if interrupted: trap 'cleanup_devmap; ${LOSETUP} -d ${LOOPDEV} || true; ${LOSETUP} -d ${LOOPDEV2} || true; exit 5' SIGHUP SIGINT SIGQUIT # Run all tests: test_version test_binary test_keygen test_setup_dev test_setup_loop test_setup_roloop test_null test_passchange test_mtab test_listing test_defaults test_bad_passwd test_fdpasswd test_bad_keyfmt test_bad_keyhash test_mountlock test_userflags test_envvars test_frenzy test_cipher_algs test_purepw test_ssl_algs test_gcry_algs test_gcryossl test_mountsynonyms test_offsets test_loopset test_swap test_fdconfig test_privblock test_voverride test_cryptsetup_compat test_luks_compat test_luks_tapmoc test_residues test_summary cleanup_devmap wait_udev ${LOSETUP} -d ${LOOPDEV} rm -f ${TMPDIR}/loopfile ${TMPDIR}/devfile ${TMPDIR}/keyfile \ ${TMPDIR}/cmtab ${TMPDIR}/cryptmount.status \ ${TMPDIR}/dm-list0 ${TMPDIR}/bingrep rmdir ${TMPDIR}/mnt* ${TMPDIR} exit 0 # vim: set ts=4 sw=4 et: cryptmount-5.2/testing/Makefile.in0000644000175000017500000003117412613124571014257 00000000000000# Makefile.in generated by automake 1.14.1 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2013 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ # automake script for cryptmount testing suite # RW Penney, March 2014 VPATH = @srcdir@ am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)' am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ subdir = testing DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \ $(top_srcdir)/mkinstalldirs ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = depcomp = am__depfiles_maybe = SOURCES = DIST_SOURCES = am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CFLAGS = @CFLAGS@ CM_DEFAULT_CIPHER = @CM_DEFAULT_CIPHER@ CM_DEFAULT_SUPATH = @CM_DEFAULT_SUPATH@ CM_SYSCONF_DIR = @CM_SYSCONF_DIR@ CM_SYSRUN_DIR = @CM_SYSRUN_DIR@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DOXYGEN_DOCDIR = @DOXYGEN_DOCDIR@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ ERSATZ_MOUNT = @ERSATZ_MOUNT@ ERSATZ_UMOUNT = @ERSATZ_UMOUNT@ EXEEXT = @EXEEXT@ GETTEXT_MACRO_VERSION = @GETTEXT_MACRO_VERSION@ GMSGFMT = @GMSGFMT@ GMSGFMT_015 = @GMSGFMT_015@ GREP = @GREP@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ INTLLIBS = @INTLLIBS@ INTL_MACOSX_LIBS = @INTL_MACOSX_LIBS@ LDFLAGS = @LDFLAGS@ LIBICONV = @LIBICONV@ LIBINTL = @LIBINTL@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBS_GCRY = @LIBS_GCRY@ LIBS_LUKS = @LIBS_LUKS@ LTLIBICONV = @LTLIBICONV@ LTLIBINTL = @LTLIBINTL@ LTLIBOBJS = @LTLIBOBJS@ MAKEINFO = @MAKEINFO@ MKDIR_P = @MKDIR_P@ MSGFMT = @MSGFMT@ MSGFMT_015 = @MSGFMT_015@ MSGMERGE = @MSGMERGE@ OBJEXT = @OBJEXT@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_FSCK = @PATH_FSCK@ PATH_MKSWAP = @PATH_MKSWAP@ PATH_MOUNT = @PATH_MOUNT@ PATH_SEPARATOR = @PATH_SEPARATOR@ PATH_UMOUNT = @PATH_UMOUNT@ PKG_CONFIG = @PKG_CONFIG@ PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ POSUB = @POSUB@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ USE_NLS = @USE_NLS@ VERSION = @VERSION@ WITH_CSWAP = @WITH_CSWAP@ WITH_FSCK = @WITH_FSCK@ XGETTEXT = @XGETTEXT@ XGETTEXT_015 = @XGETTEXT_015@ XGETTEXT_EXTRA_OPTIONS = @XGETTEXT_EXTRA_OPTIONS@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_CC = @ac_ct_CC@ am__leading_dot = @am__leading_dot@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libcryptsetup_CFLAGS = @libcryptsetup_CFLAGS@ libcryptsetup_LIBS = @libcryptsetup_LIBS@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ use_doxygen = @use_doxygen@ EXTRA_DIST = mudslinger.in passwd.fs KEYHEADERS = $(shell ls keys/*.hdr) AUTOKEYS = $(KEYHEADERS:%.hdr=%) all: all-am .SUFFIXES: $(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu --ignore-deps testing/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu --ignore-deps testing/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): tags TAGS: ctags CTAGS: cscope cscopelist: distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done $(MAKE) $(AM_MAKEFLAGS) \ top_distdir="$(top_distdir)" distdir="$(distdir)" \ dist-hook check-am: all-am check: check-am all-am: Makefile installdirs: install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-generic clean-local mostlyclean-am distclean: distclean-am -rm -f Makefile distclean-am: clean-am distclean-generic dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-generic pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: .MAKE: install-am install-strip .PHONY: all all-am check check-am clean clean-generic clean-local \ cscopelist-am ctags-am dist-hook distclean distclean-generic \ distdir dvi dvi-am html html-am info info-am install \ install-am install-data install-data-am install-dvi \ install-dvi-am install-exec install-exec-am install-html \ install-html-am install-info install-info-am install-man \ install-pdf install-pdf-am install-ps install-ps-am \ install-strip installcheck installcheck-am installdirs \ maintainer-clean maintainer-clean-generic mostlyclean \ mostlyclean-generic pdf pdf-am ps ps-am tags-am uninstall \ uninstall-am clean-local: -rm -f mudslinger-*-*.log -rm -f ${AUTOKEYS} dist-hook: mkdir ${distdir}/keys; cp -p ${srcdir}/keys/[0-9]* ${distdir}/keys/ mudslinger: mudslinger.in sed -e 's,@PKG_VERSION@,$(PACKAGE_VERSION),g' \ -e 's,@CM_KEYMODS@,$(CM_MODULES),g' $< > $@ chmod +x mudslinger autokeys: ${AUTOKEYS} ${AUTOKEYS}: ${KEYHEADERS} for k in ${AUTOKEYS}; do \ cp $${k}.hdr $${k}; \ dd if=/dev/zero of=$${k} bs=32k count=64 \ conv=notrunc oflag=append; done # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: cryptmount-5.2/testing/passwd.fs0000644000175000017500000000100011402211766014024 00000000000000í'7¬c:ìrŒŒiµ…Õ¶=¼…_VIº 4Ù§š?»t n¼dùE¿&Õ¶ä¥Ì²å¼ OíT¤ B yä3š'^‡. HÝ–ðµH%|Ž ª ÍÍ}+²„›Ýcj½£™)RøÊ†Ñ;É]×UwS(ÙT÷}V‹#dÒp–úHD™ÚDK^ª?ôõ´¶€†¿?¿üf~` #include #include #include #include #include #include #include #include #include #include "armour.h" #include "cryptmount.h" #include "delegates.h" #include "tables.h" #include "utils.h" #ifdef TESTING # include "cmtesting.h" #endif const char *cm_status_filename = "cryptmount.status"; enum /* config-file tokens */ { T_IDENT, T_LBRACE, T_OPT, T_RBRACE, T_ERROR }; /** * Description of an open target-status file. * * Internally, the status-file has the following structure: \verbatim # [TITLE] - one-line text header 0 - integer file-format version number n,[TARGET],uid - target-name length, target-name, uid of mounter ... - further target records \endverbatim */ struct statfile /* information about status file */ { int version; /* file format version */ FILE *fp; /* file handle */ }; /** * Representation of an option flag within the configuration file, * associated with a bit field within a target definition. */ typedef struct { const char *name; unsigned andmask; unsigned ormask; } tgt_option_t; static tgt_option_t /** Menu of options within 'flags' field of target definition */ setup_options[] = { { "defaults", 0U, FLG_DEFAULTS }, { "user", ~0U, FLG_USER }, { "nouser", ~0U ^ FLG_USER, 0U }, { "fsck", ~0U, FLG_FSCK }, { "nofsck", ~0U ^ FLG_FSCK, 0U }, { "mkswap", ~0U, FLG_MKSWAP }, { "nomkswap", ~0U ^ FLG_MKSWAP, 0U }, { "trim", ~0U, FLG_TRIM }, { "notrim", ~0U ^ FLG_TRIM, 0U }, { NULL, ~0U, 0U } }, /** Menu of options within 'bootaction' field of target definition */ boot_options[] = { { "none", ~0U ^ FLG_BOOT_MASK, 0 }, { "mount", ~0U ^ FLG_BOOT_MASK, FLG_BOOT_MOUNT }, { "swap", ~0U ^ FLG_BOOT_MASK, FLG_BOOT_SWAP }, { "prepare", ~0U ^ FLG_BOOT_MASK, FLG_BOOT_PREP }, { NULL, ~0U, 0U } }; struct vardefn /** Description of a quasi-environmental variable */ { char *varname; char *value; struct vardefn *next; }; static struct vardefn *vardefns = NULL; static tgtdefn_t *parse_stream(FILE *fp, const char *cfgname); void set_variable(const char *varname, const char *value) /** Set the value of an environmental variable */ { struct vardefn *newvar; newvar = (struct vardefn*)malloc(sizeof(struct vardefn)); newvar->next = vardefns; newvar->varname = cm_strdup(varname); newvar->value = cm_strdup(value); vardefns = newvar; } const char *query_variable(char *varname) /** Get the current value of an environmental variable */ { struct vardefn *var; for (var=vardefns; var!=NULL; var=var->next) { if (strcmp(varname, var->varname) == 0) return var->value; } return NULL; } void init_env_dictionary() /** Initialize internal dictionary of quasi-environmental variables */ { char buff[512]; const uid_t uid = getuid(); const gid_t gid = getgid(); struct passwd *pwent = NULL; struct group *grent = NULL; if (vardefns != NULL) return; sprintf(buff, "%d", (int)uid); set_variable("UID", buff); pwent = getpwuid(uid); if (pwent != NULL) { set_variable("USERNAME", pwent->pw_name); set_variable("HOME", pwent->pw_dir); } sprintf(buff, "%d", (int)gid); set_variable("GID", buff); grent = getgrgid(gid); if (grent != NULL) set_variable("GROUPNAME", grent->gr_name); } void clear_env_dictionary() { struct vardefn *vd; while (vardefns != NULL) { vd = vardefns; if (vd->varname != NULL) free((void*)vd->varname); if (vd->value != NULL) free((void*)vd->value); vardefns = vd->next; free((void*)vd); } } tgtdefn_t *alloc_tgtdefn(const tgtdefn_t *prototype) /** Allocate storage for a target-structure */ { tgtdefn_t *tgt; #define DFLT_OR_PROTO(dflt, proto) \ (prototype == NULL ? (dflt) : (proto)) tgt = (tgtdefn_t*)malloc(sizeof(tgtdefn_t)); tgt->ident = NULL; tgt->flags = DFLT_OR_PROTO(FLG_DEFAULTS, prototype->flags); tgt->dev = NULL; tgt->start = 0; tgt->length = -1; tgt->dir = NULL; tgt->fstype = DFLT_OR_PROTO(NULL, cm_strdup(prototype->fstype)); tgt->mountoptions = DFLT_OR_PROTO(NULL, cm_strdup(prototype->mountoptions)); tgt->fsckoptions = DFLT_OR_PROTO(NULL, cm_strdup(prototype->fsckoptions)); tgt->loopdev = NULL; tgt->supath = DFLT_OR_PROTO(NULL, cm_strdup(prototype->supath)); tgt->cipher = DFLT_OR_PROTO(cm_strdup(CM_DEFAULT_CIPHER), cm_strdup(prototype->cipher)); tgt->ivoffset = 0; tgt->key.format = DFLT_OR_PROTO(NULL, cm_strdup(prototype->key.format)); tgt->key.filename = NULL; tgt->key.digestalg = DFLT_OR_PROTO(NULL, cm_strdup(prototype->key.digestalg)); tgt->key.cipheralg = DFLT_OR_PROTO(NULL, cm_strdup(prototype->key.cipheralg)); tgt->key.maxlen = DFLT_OR_PROTO(-1L, prototype->key.maxlen); tgt->key.retries = DFLT_OR_PROTO(1U, prototype->key.retries); tgt->nx = NULL; #undef DFLT_OR_PROTO return tgt; } const tgtdefn_t *get_tgtdefn(const tgtdefn_t *head, const char *ident) /** Find info-structure for target of given name */ { const tgtdefn_t *itr,*ent=NULL; for (itr=head; itr!=NULL && ent==NULL; itr=itr->nx) { if (strcmp(ident, itr->ident) == 0) { ent = itr; } } return ent; } tgtdefn_t *clone_tgtdefn(const tgtdefn_t *orig) /** Create (deep) copy of target-definition */ { tgtdefn_t *clone; if (orig == NULL) return NULL; clone = (tgtdefn_t*)malloc(sizeof(tgtdefn_t)); clone->ident = cm_strdup(orig->ident); clone->flags = orig->flags; clone->dev = cm_strdup(orig->dev); clone->start = orig->start; clone->length = orig->length; clone->dir = cm_strdup(orig->dir); clone->fstype = cm_strdup(orig->fstype); clone->mountoptions = cm_strdup(orig->mountoptions); clone->fsckoptions = cm_strdup(orig->fsckoptions); clone->loopdev = cm_strdup(orig->loopdev); clone->supath = cm_strdup(orig->supath); clone->cipher = cm_strdup(orig->cipher); clone->ivoffset = orig->ivoffset; clone->key.format = cm_strdup(orig->key.format); clone->key.filename = cm_strdup(orig->key.filename); clone->key.digestalg = cm_strdup(orig->key.digestalg); clone->key.cipheralg = cm_strdup(orig->key.cipheralg); clone->key.maxlen = orig->key.maxlen; clone->key.retries = orig->key.retries; clone->nx = NULL; return clone; } void free_tgtdefn(tgtdefn_t *tgt) /** Relinquish storage for a target-structure */ { free((void*)tgt->ident); free((void*)tgt->dev); free((void*)tgt->dir); free((void*)tgt->fstype); free((void*)tgt->mountoptions); free((void*)tgt->fsckoptions); free((void*)tgt->loopdev); free((void*)tgt->supath); free((void*)tgt->cipher); free((void*)tgt->key.format); free((void*)tgt->key.filename); free((void*)tgt->key.digestalg); free((void*)tgt->key.cipheralg); free((void*)tgt); } static void append(char c, char **buff, unsigned *pos, unsigned *bufflen) /** Append character to string, reallocating memory as necessary */ { unsigned newlen; if (*pos >= *bufflen) { newlen = (*bufflen) * 2 + 64; *buff = (char*)realloc(*buff, (size_t)newlen); *bufflen = newlen; } (*buff)[*pos] = c; ++(*pos); } void expand_variables(char **buff, const char *src) /** Expand $(VAR) patterns within a string */ { const size_t srclen = strlen(src); enum { S_PLAIN, S_VAR }; const char *curs = src; char *varname, *varp = NULL; int literal = 0; unsigned state; cm_string_t *result; result = cm_str_alloc(64); state = S_PLAIN; varname = (char*)malloc(srclen * 2); for (curs=src; *curs!='\0'; ++curs) { if (!literal && *curs == '\\') { literal = 1; continue; } switch (state) { case S_PLAIN: if (!literal && curs[0] == '$' && curs[1] == '(') { /* Mark start of variable term */ state = S_VAR; varp = varname; ++curs; } else { /* Copy character unchanged into output */ cm_str_append_char(result, *curs); } break; case S_VAR: if (!literal && *curs == ')') { /* Extract value from dictionary */ *varp = '\0'; cm_str_append_str(result, query_variable(varname)); state = S_PLAIN; } else { /* accumulate characters of variable name */ *varp = *curs; ++varp; } break; default: break; } literal = 0; } free((void*)varname); if (*buff != NULL) free((void*)(*buff)); *buff = cm_str_strip(result); } #ifdef TESTING /*! \addtogroup unit_tests * @{ */ int tb_test_expand() /** Check variable expansion in configuration-file parser */ { char answer[1024], *buff = NULL; CM_TEST_START("Variable expansion"); expand_variables(&buff, "nothing here"); CM_ASSERT_STR_EQUAL("nothing here", buff); expand_variables(&buff, "nothing\\ here"); CM_ASSERT_STR_EQUAL("nothing here", buff); expand_variables(&buff, "nothing-$(UID) here"); sprintf(answer, "nothing-%d here", getuid()); CM_ASSERT_STR_EQUAL(answer, buff); if (buff != NULL) free((void*)buff); CM_TEST_OK(); } /** @} */ #endif /* TESTING */ static int proc_string(void *ptr, const char *src, const void *config) /** Process var=val entry in config-table for "string" type */ { char **addr = (char**)ptr; expand_variables(addr, src); return (*addr == NULL); } #define PROC_VARVAL(FN_NAME, TYPE, FMT) \ static int FN_NAME(void *ptr, const char *src, const void *x) \ /** Process var=val entry in config-table for "TYPE" */ \ { TYPE qv, *addr=(TYPE*)ptr; \ if (sscanf(src, FMT, &qv) == 1) { \ *addr = qv; return 0; \ } \ return 1; \ } PROC_VARVAL(proc_unsigned, unsigned, "%u") PROC_VARVAL(proc_long, long, "%ld") PROC_VARVAL(proc_int64, int64_t, "%" SCNi64) #undef PROC_VARVAL /** * Convert string of comma-separated configuration-switches * within \a selection into binary flags. A pointer to the (unsigned) flags, * is supplied via \a flagptr, and the set of available switches * is in the form of an array of tgt_option_t, passed via \a menuptr. */ int proc_flags(void *flagptr, const char *selection, const void *menuptr) { unsigned *flags = (unsigned*)flagptr; const tgt_option_t *menu = (const tgt_option_t*)menuptr; unsigned idx, len; if (selection == NULL) return 0; for (;;) { for (len=0; selection[len]!='\0' && selection[len]!=','; ++len); for (idx=0; menu[idx].name!=NULL; ++idx) { if (strncmp(selection, menu[idx].name, (size_t)len) == 0) { *flags = (*flags & menu[idx].andmask) | menu[idx].ormask; break; } } if (menu[idx].name == NULL) { fprintf(stderr, "bad option \"%s\"\n", selection); return 1; } if (selection[len] == '\0') break; selection += len + 1; } return 0; } static void read_token(char *buff, unsigned *t_state, tgtdefn_t *tgt) /** Process token (word) from configuration-file while parsing */ { struct tokinfo_t { const char *name; int varoffset; int (*proc)(void *var, const char *val, const void *config); const void *config; } *tok; #define OFFSET(x) (int)((char*)&((tgtdefn_t*)NULL)->x - (char*)NULL) struct tokinfo_t toktable[] = { { "flags", OFFSET(flags), proc_flags, setup_options }, { "bootaction", OFFSET(flags), proc_flags, boot_options }, { "dev", OFFSET(dev), proc_string, NULL }, { "dir", OFFSET(dir), proc_string, NULL }, { "startsector", OFFSET(start), proc_int64, NULL }, { "numsectors", OFFSET(length), proc_int64, NULL }, { "fstype", OFFSET(fstype), proc_string, NULL }, { "mountoptions", OFFSET(mountoptions), proc_string, NULL }, /* FIXME - "fsoptions" was deprecated in version 4.1 - remove by Jan2016 */ { "fsoptions", OFFSET(mountoptions), proc_string, NULL }, { "fsckoptions", OFFSET(fsckoptions), proc_string, NULL }, { "loop", OFFSET(loopdev), proc_string, NULL }, { "supath", OFFSET(supath), proc_string, NULL }, { "cipher", OFFSET(cipher), proc_string, NULL }, { "ivoffset", OFFSET(ivoffset), proc_int64, NULL }, { "keyformat", OFFSET(key.format), proc_string, NULL }, { "keyfile", OFFSET(key.filename), proc_string, NULL }, { "keyhash", OFFSET(key.digestalg), proc_string, NULL }, { "keycipher", OFFSET(key.cipheralg), proc_string, NULL }, { "keymaxlen", OFFSET(key.maxlen), proc_long, NULL }, { "passwdretries", OFFSET(key.retries), proc_unsigned, NULL }, { NULL, 0, NULL } }; #undef OFFSET char *eq; switch (*t_state) { case T_IDENT: (void)proc_string((void*)&tgt->ident, buff, NULL); *t_state = T_LBRACE; break; case T_LBRACE: *t_state = (strcmp(buff, "{") == 0 ? T_OPT : T_ERROR); break; case T_OPT: if (strcmp(buff, "}") == 0) { *t_state = T_RBRACE; break; } if ((eq = strchr(buff,'=')) == NULL) { *t_state = T_ERROR; break; } *eq = '\0'; ++eq; /* Delegate processing to specific token-processor from table: */ for (tok=toktable; tok->name!=NULL; ++tok) { if (strcmp(tok->name, buff) == 0) { (*tok->proc)((void*)((char*)tgt + tok->varoffset), eq, tok->config); break; } } if (strcmp(buff, "fsoptions") == 0) { fprintf(stderr, _("cryptmount: please replace \"fsoptions\" with \"mountoptions\" in cmtab\n")); *t_state = T_ERROR; } if (tok->name == NULL) { fprintf(stderr, _("cryptmount: unrecognized option \"%s\" in cmtab\n"), buff); *t_state = T_ERROR; } break; default: break; } } tgtdefn_t *parse_stream(FILE *fp, const char *cfgname) /** Convert config-file information into linked-list of target-structures */ { enum { C_SPACE, C_WORD, C_COMMENT }; int ch, lineno = 1, literal = 0; unsigned pos = 0, bufflen = 0; unsigned c_state, t_state; char *buff = NULL; tgtdefn_t *head = NULL, **cmp = &head, *tgt = NULL, *prototype = NULL; c_state = C_SPACE; t_state = T_IDENT; tgt = alloc_tgtdefn(prototype); while (!feof(fp) && t_state != T_ERROR) { ch = fgetc(fp); if (ch == (int)'\n') ++lineno; if (literal && ch == (int)'\n') { /* Ignore escaped end-of-line */ literal = 0; continue; } if (!literal && ch == (int)'#') c_state = C_COMMENT; if (!literal && ch == (int)'\\') { /* Treat next character literally */ literal = 1; continue; } switch (c_state) { case C_SPACE: if (literal || !isspace(ch)) { pos = 0; append((char)ch, &buff, &pos, &bufflen); c_state = C_WORD; } break; case C_WORD: if (literal || !isspace(ch)) { append((char)ch, &buff, &pos, &bufflen); } else { append('\0', &buff, &pos, &bufflen); read_token(buff, &t_state, tgt); c_state = C_SPACE; } break; case C_COMMENT: if (!literal && ch == '\n') c_state = C_SPACE; break; default: break; } literal = 0; if (t_state == T_RBRACE) { /* Parsing has reached end of target definition */ if (strcmp(tgt->ident, "_DEFAULTS_") == 0) { /* New target definition is set of default values */ if (prototype != NULL) free_tgtdefn(prototype); prototype = tgt; } else { /* New target definition is genuine target */ *cmp = tgt; cmp = &tgt->nx; } tgt = alloc_tgtdefn(prototype); t_state = T_IDENT; } } if (t_state == T_ERROR) { fprintf(stderr, _("Configuration error near %s:%d\n"), cfgname, lineno); } if (prototype != NULL) free_tgtdefn(prototype); if (tgt != NULL) free_tgtdefn(tgt); if (buff != NULL) free((void*)buff); return head; } tgtdefn_t *parse_config(const char *cfgname) /** Convert config-file into linked-list of target-structures */ { FILE *fp; tgtdefn_t *head = NULL; fp = fopen(cfgname, "r"); if (fp == NULL) { fprintf(stderr, "failed to open \"%s\"\n", cfgname); return NULL; } head = parse_stream(fp, cfgname); fclose(fp); return head; } tgtdefn_t *parse_config_fd(int fd) /** Convert input-stream config-data into target-structures */ { FILE *fp = NULL; tgtdefn_t *head = NULL; char label[64]; fp = fdopen(fd, "r"); if (fp == NULL) { fprintf(stderr, "failed to read input-stream %d\n", fd); return NULL; } snprintf(label, sizeof(label), "stream-%d", fd); head = parse_stream(fp, label); return head; } void free_config(tgtdefn_t **head) /** Free all entries in target-config list */ { tgtdefn_t *cmx; if (head == NULL) return; while ((cmx = *head) != NULL) { *head = cmx->nx; free_tgtdefn(cmx); } } tgtstat_t *alloc_tgtstatus(const tgtdefn_t *tgt) /** Create new status record for given target */ { tgtstat_t *ts; ts = (tgtstat_t*)malloc(sizeof(tgtstat_t)); ts->ident = NULL; ts->uid = 0; ts->nx = NULL; if (tgt != NULL) ts->ident = cm_strdup(tgt->ident); return ts; } void free_tgtstatus(tgtstat_t *ts) /** Free storage of target-status record (or list thereof) */ { tgtstat_t *tx = NULL; while ((tx = ts) != NULL) { ts = tx->nx; if (tx->ident != NULL) free((void*)tx->ident); free((void*)tx); } } /** * Prepare status-file for reading/writing. * * This will perform basic validation on the header * of the status file (typically /var/run/cmstatus). * If the file appears to be corrupted, this function * will return NULL. */ struct statfile *statfile_open(const char *fname, const char *mode) { struct statfile *sf = NULL; char buff[256]; FILE *fp; if ((fp = fopen(fname, mode)) != NULL) { sf = (struct statfile*)malloc(sizeof(struct statfile)); sf->fp = fp; if (mode[0] == 'w') { sf->version = 0; /* Format-version for new files */ fprintf(fp,"# auto-generated by cryptmount - do not edit\n"); fprintf(fp, "%d\n", sf->version); } else { if (fgets(buff, (int)sizeof(buff), fp) == NULL || fscanf(fp, "%d", &sf->version) != 1) { fclose(sf->fp); free((void*)sf); sf = NULL; } } } return sf; } /** * Read information about next target from the status-file. * * This will typically only be called after acquiring * a lock via cm_mutex_lock(). */ tgtstat_t *statfile_read(struct statfile *sf) { tgtstat_t *ts = NULL; char *ident = NULL; int len; unsigned long uid; if (sf == NULL) goto bail_out; if (fscanf(sf->fp, "%d,", &len) != 1) goto bail_out; ident = (char*)malloc((size_t)(len + 1)); if (cm_fread((void*)ident, (size_t)(len + 1), sf->fp) != 0) { goto bail_out; } ident[len] = '\0'; if (fscanf(sf->fp, "%lu", &uid) != 1) goto bail_out; if (feof(sf->fp)) goto bail_out; ts = alloc_tgtstatus(NULL); ts->ident = ident; ts->uid = uid; ident = NULL; bail_out: if (ident != NULL) free((void*)ident); return ts; } /** * Write mount-status information about the given target * into the status-file. * * This will typically only be called after acquiring * a lock via cm_mutex_lock(). */ void statfile_write(struct statfile *sf, const tgtstat_t *stat) { fprintf(sf->fp, "%u,", (unsigned)strlen(stat->ident)); fprintf(sf->fp, "%s,", stat->ident); fprintf(sf->fp, "%lu\n", stat->uid); } void statfile_close(struct statfile *sf) { fclose(sf->fp); free((void*)sf); } /*! @brief Find mount/owner status of given target * * Read an entry from persistent storage within /run/cryptmount.status * to identify whether the given target is currently mounted * or used as an active swap partition. * * Note that any unmount/swapoff operations applied by tools * other than cryptmount are likely to make this metadata unreliable. * * \see put_tgtstatus(). */ tgtstat_t *get_tgtstatus(const tgtdefn_t *tgt) { char *fname = NULL; tgtstat_t *ts = NULL; struct statfile *sf; int badlock; (void)cm_path(&fname, CM_SYSRUN_PFX, cm_status_filename); badlock = cm_mutex_lock(); sf = statfile_open(fname, "r"); if (sf == NULL) goto bail_out; while ((ts = statfile_read(sf)) != NULL) { if (strcmp(tgt->ident, ts->ident) == 0) break; else free_tgtstatus(ts); } statfile_close(sf); bail_out: if (!badlock) cm_mutex_unlock(); if (fname != NULL) free((void*)fname); return ts; } /*! @brief Find list of mount/owner status for all mounted targets. * * \see get_tgtstatus(), statfile_read(). */ tgtstat_t *get_all_tgtstatus() { char *fname = NULL; tgtstat_t *ts = NULL, *head = NULL, **sfp = &head; struct statfile *sf; int badlock; (void)cm_path(&fname, CM_SYSRUN_PFX, cm_status_filename); badlock = cm_mutex_lock(); sf = statfile_open(fname, "r"); if (sf == NULL) goto bail_out; while ((ts = statfile_read(sf)) != NULL) { *sfp = ts; sfp = &ts->nx; } statfile_close(sf); bail_out: if (!badlock) cm_mutex_unlock(); if (fname != NULL) free((void*)fname); return head; } /*! @brief Update mount/owner status of given target * * Insert or update an entry from persistent storage * within /run/cryptmount.status to mark the given target * as currently being mounted or used as an active swap partition. * * \see get_tgtstatus(). */ int put_tgtstatus(const tgtdefn_t *tgt, const tgtstat_t *newstat) { char *newfname = NULL, *oldfname = NULL; struct statfile *sfin, *sfout; tgtstat_t *ts = NULL; struct stat sbuff; int badlock, eflag = 0; (void)cm_path(&oldfname, CM_SYSRUN_PFX, cm_status_filename); (void)cm_path(&newfname, CM_SYSRUN_PFX, "cmstatus-temp"); badlock = cm_mutex_lock(); sfout = statfile_open(newfname, "w"); if (sfout == NULL) { eflag = 1; goto bail_out; } if (stat(oldfname, &sbuff) == 0) { sfin = statfile_open(oldfname, "r"); if (sfin == NULL) { statfile_close(sfout); unlink(newfname); eflag = 1; goto bail_out; } /* Copy most entries from existing status-file: */ while ((ts = statfile_read(sfin)) != NULL) { if (strcmp(tgt->ident, ts->ident) != 0) { statfile_write(sfout, ts); } free_tgtstatus(ts); } statfile_close(sfin); } /* Add new entry onto end of new status-file: */ if (newstat != NULL) { statfile_write(sfout, newstat); } statfile_close(sfout); /* Overwrite old status-file: */ if (rename(newfname, oldfname) != 0 || chown(oldfname, (uid_t)0, (gid_t)0) != 0 || chmod(oldfname, S_IWUSR|S_IRUSR | S_IRGRP | S_IROTH) != 0) { eflag = 1; goto bail_out; } bail_out: if (!badlock) cm_mutex_unlock(); if (newfname != NULL) free((void*)newfname); if (oldfname != NULL) free((void*)oldfname); return eflag; } /** * Perform basic validation on the contents of the target-status file * (typically /var/run/cmstatus). * * @return zero if the file is known to be damaged. */ int is_cmstatus_intact() { char *fname = NULL; struct stat sbuff; struct statfile *sf; int intact = 1, badlock; (void)cm_path(&fname, CM_SYSRUN_PFX, cm_status_filename); badlock = cm_mutex_lock(); if (stat(fname, &sbuff) != 0) { /* A missing file is considered to be valid */ goto bail_out; } sf = statfile_open(fname, "r"); if (sf == NULL) { intact = 0; goto bail_out; } /* Read each status line, performing basic syntax checking */ while (intact) { unsigned long uid = 0; int len = 0, err; err = fscanf(sf->fp, "%d,", &len); if (err == EOF) break; if (err != 1) intact = 0; if (len > 1024 || fseek(sf->fp, len, SEEK_CUR) < 0) intact = 0; if (fgetc(sf->fp) != ',') intact = 0; if (fscanf(sf->fp, "%lu", &uid) != 1) intact = 0; } statfile_close(sf); bail_out: if (!badlock) cm_mutex_unlock(); if (fname != NULL) free((void*)fname); return intact; } /* * (C)Copyright 2005-2015, RW Penney */ cryptmount-5.2/debian/0000755000175000017500000000000012613166774012044 500000000000000cryptmount-5.2/debian/rules0000755000175000017500000000210512605014535013026 00000000000000#!/usr/bin/make -f # -*- makefile -*- # See debhelper(7) (uncomment to enable) # output every command that modifies files on the build system. #DH_VERBOSE = 1 # see EXAMPLES in dpkg-buildflags(1) and read /usr/share/dpkg/* DPKG_EXPORT_BUILDFLAGS = 1 include /usr/share/dpkg/default.mk # see FEATURE AREAS in dpkg-buildflags(1) #export DEB_BUILD_MAINT_OPTIONS = hardening=+all # see ENVIRONMENT in dpkg-buildflags(1) # package maintainers to append CFLAGS #export DEB_CFLAGS_MAINT_APPEND = -Wall -pedantic # package maintainers to append LDFLAGS #export DEB_LDFLAGS_MAINT_APPEND = -Wl,--as-needed # main packaging script based on dh7 syntax %: dh $@ --with autoreconf,systemd --parallel .PHONY: override_dh_auto_configure override_dh_fixperms # debmake generated override targets override_dh_auto_configure: dh_auto_configure -- \ --prefix=/usr --sysconfdir=/etc --with-sysrundir=/run \ --with-systemd --with-libgcrypt --enable-luks \ --enable-delegation --enable-fsck \ --enable-cswap --enable-openssl-compat override_dh_fixperms: dh_fixperms --exclude usr/bin/cryptmount cryptmount-5.2/debian/watch0000644000175000017500000000066312414562172013011 00000000000000# uscan watch for cryptmount # run the "uscan" command to check for upstream updates and more. # See uscan(1) for format # Compulsory format-version line: version=3 # Search sourceforge.net webpage (via qa.debian.org redirector): http://sf.net/cryptmount/ cryptmount-([\d\.]*)\.tar\.gz # Location of cryptographic signature of upstream package: opts=pgpsigurlmangle=s/$/.sig/ http://sf.net/cryptmount/ cryptmount-([\d\.]*)\.tar\.gz cryptmount-5.2/debian/copyright0000644000175000017500000000225712564133376013722 00000000000000Format: http://www.debian.org/doc/packaging-manuals/copyright-format/1.0/ Upstream-Name: cryptmount Source: http://www.sourceforge.net/projects/cryptmount License: GPL-2+ Files: * Copyright: (C) 2005 - 2015 RW Penney License: GPL-2+ Files: blowfish.c blowfish.h Copyright: (C) Bruce Schneier License: GPL-2+ License: GPL-2+ This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. . This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. . You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. . On Debian systems, the full text of the GNU General Public License version 2 can be found in the file `/usr/share/common-licenses/GPL-2'. cryptmount-5.2/debian/postinst0000644000175000017500000000225212605014535013557 00000000000000#! /bin/sh # postinst script for cryptmount # # see: dh_installdeb(1) set -e # summary of how this script can be called: # * `configure' # * `abort-upgrade' # * `abort-remove' `in-favour' # # * `abort-deconfigure' `in-favour' # `removing' # # for details, see http://www.debian.org/doc/debian-policy/ or # the debian-policy package # case "$1" in configure) if [ -r /proc/1/root -a /proc/1/root/ -ef /proc/self/root/ ]; then modprobe -q -a dm-mod dm-crypt || true else echo "A chroot environment has been detected - not running 'modprobe dm-crypt'" fi ;; abort-upgrade|abort-remove|abort-deconfigure) ;; *) echo "postinst called with unknown argument \`$1'" >&2 exit 1 ;; esac # dh_installdeb will replace this with shell code automatically # generated by other debhelper scripts. #DEBHELPER# exit 0 # vim: set ts=4 sw=4 et: cryptmount-5.2/debian/control0000644000175000017500000000307612605014535013361 00000000000000Source: cryptmount Section: admin Priority: extra Maintainer: RW Penney Homepage: http://cryptmount.sourceforge.net Build-Depends: debhelper (>= 9.0.0), dpkg-dev (>=1.16.1), automake, dh-autoreconf, dh-systemd, libcryptsetup-dev (>= 1.6), libdevmapper-dev, libgcrypt20-dev (>= 1.5), pkg-config Standards-Version: 3.9.6 Package: cryptmount Architecture: linux-any Depends: ${shlibs:Depends}, ${misc:Depends} Recommends: udev Suggests: openssl, dmsetup Description: Management of encrypted file systems cryptmount is a utility for creating encrypted filesystems & swap partitions and which allows an ordinary user to mount/unmount filesystems without requiring superuser privileges. . It offers the following features: * easy and safe on-demand access to filesystems without su/sudo; * access passwords can be changed easily without involving the sys-admin; * filesystems can reside on raw disk partitions or ordinary files; * supports LUKS encrypted filesystems created by cryptsetup; * encrypted access keys can be stored on removable media (e.g. USB flash disks); * includes support for encrypted swap partitions; * multiple filesystems can be stored in a single disk partition; * encrypted filesystems can be initialized at boot-up or on demand; * temporary filesystems can be setup via command-line, for use in shell-scripts; * transparent configuration of dm-crypt & loopback devices during mounting; * access keys can optionally be made compatible with OpenSSL. cryptmount-5.2/debian/cryptmount.lintian-overrides0000644000175000017500000000025412564133376017566 00000000000000# lintian-override for cryptmount # cryptmount needs to have setuid privileges to be usable by ordinary users: cryptmount: setuid-binary usr/bin/cryptmount 4755 root/root cryptmount-5.2/debian/docs0000644000175000017500000000006612613124531012622 00000000000000NEWS README README.OpenSSL README.sshfs RELNOTES ToDo cryptmount-5.2/debian/changelog0000644000175000017500000001767612613166463013652 00000000000000cryptmount (5.2-1) unstable; urgency=low * Updated to version 5.2 of upstream package * Improved handling of mistyped password in setup script (Closes: bug#795440) * Allow setup of PATH before invoking fsck (Closes: bug#779851) -- RW Penney Sun, 25 Oct 2015 15:00:00 +0000 cryptmount (5.1-3) unstable; urgency=medium * Delegated setup in postinst/postrm to dh-systemd (Closes: bug#798358) -- RW Penney Tue, 08 Sep 2015 16:00:00 +0000 cryptmount (5.1-2) unstable; urgency=medium * Patched installation path for cryptmount.service to be beneath /lib/systemd * Improved postinst/postrm support for systemd * Removed duplicated example configuration file * Rebuilt debian/rules script to use debhelper v7 and dh_autoreconf -- RW Penney Sun, 26 Jul 2015 12:00:00 +0000 cryptmount (5.1-1) unstable; urgency=low * Updated to version 5.1 of upstream package -- RW Penney Sat, 20 Jun 2015 15:00:00 +0000 cryptmount (5.0-2) unstable; urgency=medium * Fixed unprivileged access to LUKS partitions under libcryptsetup-1.6.6 (Closes: bug#759263) * Added cryptographic signature verification to uscan watch file -- RW Penney Sat, 30 Aug 2014 15:40:00 +0000 cryptmount (5.0-1) unstable; urgency=low * Updated to version 5.0 of upstream package -- RW Penney Wed, 30 Apr 2014 18:30:00 +0000 cryptmount (4.5.1-1) unstable; urgency=medium * Patched unexpanded @ETCDIR@ in cryptmount-setup script (Closes: bug#738736) -- RW Penney Sun, 16 Feb 2014 06:30:00 +0000 cryptmount (4.5-1) unstable; urgency=low * Updated to version 4.5 of upstream package * Updated Debian standards version to 3.9.5 -- RW Penney Tue, 14 Jan 2014 20:30:00 +0000 cryptmount (4.4.1-1) unstable; urgency=low * Updated to version 4.4.1 of upstream package * Fixes lintian systemd-related warnings -- RW Penney Fri, 25 Oct 2013 20:00:00 +0000 cryptmount (4.4-1) unstable; urgency=low * Updated to version 4.4 of upstream package * Fixes lintian hardening-no-fortify-functions & hardening-no-relro warnings -- RW Penney Sun, 19 May 2013 20:00:00 +0000 cryptmount (4.3.1-1) unstable; urgency=low * Patched version-specific dependency on libdevmapper (Closes: bug#672678) -- RW Penney Sun, 13 May 2012 20:00:00 +0000 cryptmount (4.3-1) unstable; urgency=low * Added support for setting ownership of vfat partitions (Closes: bug#641476) -- RW Penney Sun, 18 Mar 2012 08:00:00 +0000 cryptmount (4.2.1-1) unstable; urgency=low * Added 'build-arch' and 'build-indep' rules * Updated use of /dev/.udev to first try /run/udev (Closes: bug#644311) -- RW Penney Sun, 09 Oct 2011 12:00:00 +0000 cryptmount (4.2-1) unstable; urgency=low * Updated Debian standards version to 3.9.2 * Fixed wrong fileystem size on optical media (Closes: bug#615865) -- RW Penney Fri, 17 Jun 2011 19:30:00 +0000 cryptmount (4.1-3) unstable; urgency=low * Updated Debian standards version to 3.9.0 -- RW Penney Sun, 01 Aug 2010 20:00:00 +0000 cryptmount (4.1-2) unstable; urgency=low * Updated Debian packaging format to "3.0 (quilt)" -- RW Penney Sun, 20 Jun 2010 20:00:00 +0000 cryptmount (4.1-1) unstable; urgency=low * Updated to version 4.1 of upstream package * Fixed modprobe to work within chroot environment (Closes: bug#562680) * Fixed missing /sbin/udevsettle for LUKS target (Closes: bug#570877) -- RW Penney Thu, 03 Jun 2010 20:00:00 +0000 cryptmount (4.0.2-1) unstable; urgency=low * Updated to version 4.0.2 of upstream package * Fixed deconfiguring targets during system shutdown (Closes: bug#558347) -- RW Penney Sun, 13 Dec 2009 08:00:00 +0000 cryptmount (4.0.1-1) unstable; urgency=low * Updated to version 4.0.1 of upstream package * Patched incorrect dependencies with /etc/init.d scripts (Closes: bug#546502) -- RW Penney Mon, 14 Sep 2009 20:00:00 +0000 cryptmount (4.0-1) unstable; urgency=low * Updated to version 4.0 of upstream package -- RW Penney Mon, 04 May 2009 08:00:00 +0000 cryptmount (3.1.2-1) unstable; urgency=low * Minor update to version 3.1.2 of upstream package * Closes: bug#516922 (Initialization of libgcrypt library) * Clears lintian warnings about sourceforge-redirector in watch-file, and redirection of output of updaterc.d -- RW Penney Sat, 28 Feb 2009 09:00:00 +0000 cryptmount (3.1.1-1) unstable; urgency=low * Minor update to version 3.1.1 of upstream package * Closes: bug#507899 (Latest upstream version not in 'sid') -- RW Penney Fri, 05 Dec 2008 21:00:00 +0000 cryptmount (3.1-1) unstable; urgency=low * Initial release of 3.1-series -- RW Penney Fri, 03 Oct 2008 14:00:00 +0000 cryptmount (3.0.1-1) unstable; urgency=low * Minor update to version 3.0.1 of upstream package * Closes: bug#486687 (Updating German localization) -- RW Penney Sat, 07 Aug 2008 11:00:00 +0000 cryptmount (3.0-1) unstable; urgency=low * Initial release of 3.0-series. * Closes: bug#436676 (Handling of nostrip build-option) * Closes: bug#479682 (Clarifying translation query) * Closes: bug#484727 (Adding German localization) -- RW Penney Sat, 07 Jun 2008 11:00:00 +0000 cryptmount (2.2-1) unstable; urgency=low * Initial release of 2.2-series. * Uploading closes: bug#436676 -- RW Penney Sun, 20 Jan 2008 10:00:00 +0000 cryptmount (2.1-1) unstable; urgency=low * Initial release of 2.1-series. * Uploading closes: bug#420066 -- RW Penney Sun, 05 Aug 2007 10:00:00 +0000 cryptmount (2.0-1) unstable; urgency=low * Initial release of 2.0-series. -- RW Penney Tue, 10 Apr 2007 08:00:00 +0000 cryptmount (1.2.1-1) unstable; urgency=low * Updated to include upstream version 1.2.1 -- RW Penney Fri, 06 Apr 2007 08:00:00 +0000 cryptmount (1.2-3) unstable; urgency=low * Patched /etc/init.d script to ensure dm-crypt kernel-module is loaded * Patched documentation to explain devmapper error messages for bad key-size * Incorporated minor robustness improvements from upstream version 1.2.1 -- RW Penney Sat, 23 Jun 2007 14:00:00 +0000 cryptmount (1.2-2) unstable; urgency=low * Patched postinst script to update rc.d more sensibly * Incorporated Dan O'Huiginn's patch for installation of cmtab.example * Uploading closes: bug#415054 -- RW Penney Fri, 16 Mar 2007 21:00:00 +0000 cryptmount (1.2-1) unstable; urgency=low * Initial release of 1.2-series. -- RW Penney Sun, 15 Oct 2006 16:00:00 +0000 cryptmount (1.1-2) unstable; urgency=low * Added Erich Schubert's patch for init-script to improve POSIX compliance closes: bug#385157 * Added basic LSB headers to init-script -- RW Penney Thu, 31 Aug 2006 19:00:00 +0000 cryptmount (1.1-1) unstable; urgency=low * Initial release of 1.1-series. -- RW Penney Tue, 15 Aug 2006 20:00:00 +0000 cryptmount (1.0.2-1) unstable; urgency=low * Initial release. * Uploading closes: bug#375008 -- RW Penney Tue, 18 Jul 2006 22:00:00 +0000 cryptmount-5.2/debian/source/0000755000175000017500000000000012613166774013344 500000000000000cryptmount-5.2/debian/source/format0000644000175000017500000000001412000461340014443 000000000000003.0 (quilt) cryptmount-5.2/debian/compat0000644000175000017500000000000212400360510013134 000000000000009 cryptmount-5.2/debian/postrm0000644000175000017500000000031212605014535013213 00000000000000#! /bin/sh # postrm script for cryptmount # # see: dh_installdeb(1) set -e # dh_installdeb will replace this with shell code automatically # generated by other debhelper scripts. #DEBHELPER# exit 0 cryptmount-5.2/debian/upstream/0000755000175000017500000000000012613166774013704 500000000000000cryptmount-5.2/debian/upstream/signing-key.asc0000644000175000017500000000353212414562172016532 00000000000000-----BEGIN PGP PUBLIC KEY BLOCK----- Version: GnuPG v1.4.12 (GNU/Linux) mQGiBEORVcsRBADc3+oOxpi74mf/+Aup/qbauS//MyRD/kKM3zqIbl2B+lJ6kdvT Ny92+8EtrpHmMHYlx2SLVYfOLj6ZuVw07Jbtzkyybf/kjSNXp2iPeZt8JxseeitX HeVDE9mdZilhf/ruRxgu+Ny6vSlA0JxJ/cS1kgsiQ6su4Eugwdw3HTgqAwCgwpiq PjCu5ZvfR8NNuPFSATFyalUD/1ZfJy11dWlP66oFf72IdBAkh1sNCLHZbXHA0mqR JBYVG+2aXaD2TOCRePo0Q7fUsIgz5Y5DZe6oPLf/DYhIMGLiuRqbWP5MXGMbYaDV rAyeSziQc0am7g3rzEGqXUe0HHJaKvbqQU3wJeqj0Uqd6YD/6gIVcMaxtqc8ftOL WmPXBACx+sown7mev+DeU0a9pby800ziQ5+Ix4Io1Dyfj5+y16Qoykdth6tqlPIH fAvz9qQGIEPopseeKbJd6lWB5/I10kxEMNF3HwIMYs4nYvD46CquQh7JQegafoIF B+j89Fq7wHg+lBRLvcbmYXhVTVSAODG6xJLw8N3xiv3xuFJ757QpRHIgUlcgUGVu bmV5IDxjcnlwdG1vdW50QHJ3cGVubmV5Lm9yZy51az6IXgQTEQIAHgUCQ5FVywIb AwYLCQgHAwIDFQIDAxYCAQIeAQIXgAAKCRCm2CxluM7153XzAJ45saNgbLIIXmmm KtRCeyJH9ByuRQCeOYzXEXd7nfGGZz9VOj8XFxC6Aua0KlJXIFBlbm5leSA8cndw ZW5uZXlAdXNlcnMuc291cmNlZm9yZ2UubmV0PoheBBMRAgAeBQJESOihAhsDBgsJ CAcDAgMVAgMDFgIBAh4BAheAAAoJEKbYLGW4zvXnNNMAn2ip9xgmeTrQgLJT5CyM pTLq7YMUAKC1AAbxGzJEUFT97ep7p6o1+dD+1LkCDQRDkVXhEAgAoPoPBPORbm7J 6BI5e4t5MVwkB/j1RjLnZ4gsv6TMaElIARVLdxZFIOjQBg1KFys1RvGn6RobMrhM vOUgFq1ZuaX1EWA5zYjhFcQUhK8gb+f1NOGoMA7WGwngN6WzO9z5fPvf6RKc2nNy iRAvo/oKXkJlNMA+W3L9GuiPdR/sxw4ZXnjEPzu5QRfa4W5QVtOSDfoRlSZIEeMk HzDWhtARjykn2lOlH5hFPsiaiJudFEFc7LFlb1otjEh5UoN8SxBjXDnqVqnQC9ha Z3fNF24tjoPr1aOJVXtN42pQbdcgB4L/EgPTIP62nurBMv40DSRM6lqsuvc3/evG yiVZvOSjwwADBQf+PrcJu92SSJIWLV8Ex/U/DAe0p0pQ/UEV3/587U1trozIdGBY 4htkB47v653I6RcvUeJg40kTEWvFuSMimw5ThxB2FGObneZqMunCise13u8z68WE mWKBMS2FJC02oxi7frSLkr85d5yuHwNfgbTkZthEq2LxXZzburb6x5+LTaCS0ael at6PPkAa3adzi3qrjuxEYVPRPLOM8cwJKa7MUucFP+ymv2DLlWt7zTHQUmH29hvW 5MLKfQkbc1I11QQoNVLkZX20TC0RTo6yvPsyg6K86KQZi/Lqxx1wrCwgNYSbvjEH ustRdj70Y95qEhkizHl+pqXqdCyY4eO38iboDohJBBgRAgAJBQJDkVXhAhsMAAoJ EKbYLGW4zvXnO0MAnRtyFozdW0EU+Ups+o416Ot/fCR/AJoDRZkFBU8RpHG1JaCP DKJJtxxZ1w== =LOce -----END PGP PUBLIC KEY BLOCK----- cryptmount-5.2/cryptmount.spec0000644000175000017500000000707612613124531013635 00000000000000# # rpm spec-file for cryptmount # Copyright 2006-2015, Holger Mueller, Eriks Zelenka & RW Penney # Summary: Let ordinary users mount an encrypted file system Name: cryptmount Version: 5.2 Release: 1%{?dist} License: GPL URL: http://cryptmount.sourceforge.net Group: System/Filesystems Source0: http://sourceforge.net/projects/cryptmount/files/cryptmount-%{version}/%{name}-%{version}.tar.gz %if 0%{?fedora} #{ # Fedora BuildRequires: cryptsetup-devel libgcrypt-devel Requires: cryptsetup-libs libgcrypt device-mapper #} %else #{ %if 0%{?rhel} #{ # RHEL, CentOS %if 0%{?rhl} >= 7 BuildRequires: cryptsetup-devel libgcrypt-devel Requires: cryptsetup-libs libgcrypt device-mapper %else BuildRequires: cryptsetup-luks-devel libgcrypt-devel Requires: cryptsetup-luks-libs libgcrypt device-mapper %endif #} %else #{ # Default - OpenSuse13.1 BuildRequires: libcryptsetup-devel libgcrypt-devel Requires: libcryptsetup4 libgcrypt11 device-mapper #} %endif #} %endif BuildRoot: %{_tmppath}/%{name}-%{version}-root %description cryptmount is a utility for the GNU/Linux operating system which allows an ordinary user to mount an encrypted filing system without requiring superuser privileges. Filesystems can reside on raw disk partitions or ordinary files, with cryptmount automatically configuring device-mapper and loopback devices before mounting. %prep %setup -n %{name}-%{version} %{__perl} -pi.orig -e ' s|^(\s*)chown(\s*root)|\1#chown\2|g; s|/etc/init.d|%{_initrddir}|g; ' Makefile.am Makefile.in %build %configure --enable-delegation --enable-fsck %{__make} %{?_smp_mflags} %install %{__rm} -rf %{buildroot} %{__install} -d -m0755 %{buildroot}%{_initrddir} %{__install} -d -m0755 %{buildroot}%{_sbindir} %{__install} -d -m0755 %{buildroot}/usr/lib/systemd/system %{__make} DESTDIR=%{buildroot} install %find_lang %{name} %clean %{__rm} -rf %{buildroot} %files -f %{name}.lang %defattr(-, root, root, 0755) %doc AUTHORS ChangeLog COPYING NEWS README* RELNOTES ToDo %doc %{_mandir}/man5/cmtab.5* %doc %{_mandir}/man8/cryptmount*.8* %doc %{_mandir}/*/man5/cmtab.5* %doc %{_mandir}/*/man8/cryptmount*.8* %config(noreplace) %{_sysconfdir}/cryptmount/ %config %{_initrddir}/cryptmount %config /etc/modules-load.d/cryptmount.conf %config /usr/lib/systemd/system/cryptmount.service %{_sbindir}/cryptmount-setup %attr(4751, root, root) %{_bindir}/cryptmount %post /sbin/chkconfig --add cryptmount %preun if [ "$1" = 0 ]; then /sbin/chkconfig --del cryptmount fi %changelog * Thu Oct 08 2015 RW Penney - 5.2 -- Various bug-fixes and cleanups * Mon May 04 2015 RW Penney - 5.1 -- Improved portability across RPM-based systems * Mon Apr 28 2014 RW Penney - 5.0 -- Migrated LUKS functionality to use libcryptsetup * Mon Dec 23 2013 RW Penney - 4.5 -- Added support for TRIM on SSDs * Tue May 21 2013 RW Penney - 4.4 -- Added support systemd * Thu Dec 29 2011 RW Penney - 4.3 -- Added support for environmental variables in configuration file * Tue May 03 2011 RW Penney - 4.2 -- Added entropy-based protection against accidental swap formatting * Wed Mar 10 2010 RW Penney - 4.1 -- Improved compatability with cryptsetup-1.1 * Mon Jan 05 2009 RW Penney - 4.0 -- Improved password fortification via iterated hashing * Sun Jan 22 2006 Holger Mueller - 0.1-1mr -- RPM spec created cryptmount-5.2/looputils.h0000644000175000017500000000277612521465225012750 00000000000000/* * Declarations for loopback-device utilities for cryptmount * (C)Copyright 2005-2015, RW Penney */ /* This file is part of cryptmount cryptmount is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. cryptmount is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. */ #ifndef _LOOPUTILS_H #define _LOOPUTILS_H #include #include /*! \addtogroup loop_utils * @{ */ int loop_findfree(char *buff, size_t buffsz); int loop_setup(const char *dev, const char *file, int flags); int loop_ident(unsigned maj, unsigned min, char *buff, size_t buffsz); int loop_destroy(const char *dev); int loop_dellist(unsigned devcnt, const dev_t *devids); int blockify_file(const char *filename, int fmode, const char *prefdev, const char **devname, int *isloop); int unblockify_file(const char **devname, int isloop); /** @} */ #endif /* _LOOPUTILS_H */ /* * (C)Copyright 2005-2015, RW Penney */ cryptmount-5.2/Makefile.am0000644000175000017500000000624312613124531012564 00000000000000# automake script for 'cryptmount' # RW Penney, November 2005 AM_CPPFLAGS = -DCM_SYSCONF_DIR="\"$(CM_SYSCONF_DIR)\"" \ -DCM_SYSRUN_DIR="\"$(CM_SYSRUN_DIR)\"" bin_PROGRAMS=cryptmount cryptmount_SOURCES=cryptmount.c cryptmount.h \ armour.c armour.h \ armour-builtin.c armour-gcry.c armour-luks.c \ blowfish.c blowfish.h \ dmutils.c dmutils.h \ fsutils.c fsutils.h \ looputils.c looputils.h \ tables.c tables.h \ utils.c utils.h \ cmtesting.c cmtesting.h cryptmount_NONHEADERS = $(shell echo "${cryptmount_SOURCES}" | sed 's%\<[^ ]*\.h\>%%g') if BUILD_LUKSCOMPAT cryptmount_LDADD = ${libcryptsetup_LIBS} endif localedir=$(datadir)/locale AM_CPPFLAGS += -DLOCALEDIR=\"$(localedir)\" EXTRA_DIST = config.rpath mkinstalldirs cmtab.example \ README.OpenSSL README.sshfs RELNOTES ToDo cryptmount.spec \ debian/changelog debian/compat debian/control \ debian/copyright debian/docs \ debian/rules debian/cryptmount.lintian-overrides \ debian/postinst debian/postrm debian/watch debian/source/format \ debian/upstream/signing-key.asc SUBDIRS = man po sysinit testing install-exec-hook: install-etcdir chown root.root $(DESTDIR)$(bindir)/cryptmount$(EXEEXT) chmod u+srwx,go-w,go+r $(DESTDIR)$(bindir)/cryptmount$(EXEEXT) @if test -z "$(DESTDIR)" -o "$(DESTDIR)" = "/"; then \ modprobe -a loop dm-crypt || true; \ ( egrep -q '\' /proc/devices \ && egrep -q '\' /proc/devices ) || \ echo "Warning: kernel support for /dev/loop and /dev/mapper is needed by cryptmount"; \ fi .PHONY: install-etcdir install-etcdir: if test ! -d "${DESTDIR}${CM_SYSCONF_DIR}" ; then \ ${mkdir_p} "${DESTDIR}${CM_SYSCONF_DIR}" ; \ ${INSTALL_PROGRAM_ENV} ${INSTALL_DATA} cmtab.example "${DESTDIR}${CM_SYSCONF_DIR}" ; \ fi if test ! -f "${DESTDIR}${CM_SYSCONF_DIR}/cmtab" ; then \ echo -e "# ${CM_SYSCONF_DIR}/cmtab - encrypted filesystem information for cryptmount\n# try 'man 8 cryptmount' or 'man 5 cmtab' for more details\n" >> "${DESTDIR}${CM_SYSCONF_DIR}/cmtab"; \ fi install-setup: setupscript test -d "${DESTDIR}${sbindir}" || ${mkdir_p} "${DESTDIR}${sbindir}" ${INSTALL_PROGRAM_ENV} ${INSTALL_SCRIPT} setupscript "${DESTDIR}${sbindir}/cryptmount-setup" clean-local: -rm -f splint.log dist-hook: sed -e "s,^\(Version:\s*\)[0-9].*,\1${VERSION}," cryptmount.spec > cm_spec.new; cmp -q cryptmount.spec cm_spec.new || mv cm_spec.new cryptmount.spec; rm -f cm_spec.new pedantic: CFLAGS = -Wall -W -pedantic -g pedantic: ${bin_PROGRAMS} if HAVE_DOXYGEN doxydocs: doxygen.conf doxygen doxygen.conf endif .PHONY: splint splint: @echo -n "" > splint.log for src in ${cryptmount_NONHEADERS}; do \ echo "==== $${src} ====" >> splint.log; \ splint ${DEFS} ${DEFAULT_INCLUDES} ${INCLUDES} ${AM_CPFLAGS} ${CPPFLAGS} -D__signed__="" -posix-lib -checks $${src} >> splint.log 2>&1 ; \ echo -e "\n\n" >> splint.log || true; \ done # 'cmtest' target is for use with 'mudslinger' testing script: cmtest: CFLAGS = -Wall -g -DTESTING -DCM_SRCDIR=\"${abs_srcdir}\" cmtest: ${bin_PROGRAMS} ${MAKE} -C testing autokeys mudslinger .PHONY: depend depend: ${CC} -MM ${DEFS} ${DEFAULT_INCLUDES} ${INCLUDES} ${AM_CPFLAGS} ${CPPFLAGS} ${cryptmount_NONHEADERS} > .depend -include .depend cryptmount-5.2/doxygen.conf.in0000644000175000017500000002360612400360510013454 00000000000000# Doxyfile 1.7.6.1 #--------------------------------------------------------------------------- # Project related configuration options #--------------------------------------------------------------------------- DOXYFILE_ENCODING = UTF-8 PROJECT_NAME = @PACKAGE@ PROJECT_NUMBER = @PACKAGE_VERSION@ PROJECT_BRIEF = PROJECT_LOGO = OUTPUT_DIRECTORY = @DOXYGEN_DOCDIR@ CREATE_SUBDIRS = NO OUTPUT_LANGUAGE = English BRIEF_MEMBER_DESC = YES REPEAT_BRIEF = YES ABBREVIATE_BRIEF = ALWAYS_DETAILED_SEC = NO INLINE_INHERITED_MEMB = NO FULL_PATH_NAMES = YES STRIP_FROM_PATH = STRIP_FROM_INC_PATH = SHORT_NAMES = NO JAVADOC_AUTOBRIEF = NO QT_AUTOBRIEF = NO MULTILINE_CPP_IS_BRIEF = NO INHERIT_DOCS = YES SEPARATE_MEMBER_PAGES = NO TAB_SIZE = 4 ALIASES = TCL_SUBST = OPTIMIZE_OUTPUT_FOR_C = YES OPTIMIZE_OUTPUT_JAVA = NO OPTIMIZE_FOR_FORTRAN = NO OPTIMIZE_OUTPUT_VHDL = NO EXTENSION_MAPPING = BUILTIN_STL_SUPPORT = NO CPP_CLI_SUPPORT = NO SIP_SUPPORT = NO IDL_PROPERTY_SUPPORT = YES DISTRIBUTE_GROUP_DOC = NO SUBGROUPING = YES INLINE_GROUPED_CLASSES = NO INLINE_SIMPLE_STRUCTS = NO TYPEDEF_HIDES_STRUCT = NO SYMBOL_CACHE_SIZE = 0 LOOKUP_CACHE_SIZE = 0 #--------------------------------------------------------------------------- # Build related configuration options #--------------------------------------------------------------------------- EXTRACT_ALL = YES EXTRACT_PRIVATE = NO EXTRACT_STATIC = YES EXTRACT_LOCAL_CLASSES = YES EXTRACT_LOCAL_METHODS = NO EXTRACT_ANON_NSPACES = NO HIDE_UNDOC_MEMBERS = NO HIDE_UNDOC_CLASSES = NO HIDE_FRIEND_COMPOUNDS = NO HIDE_IN_BODY_DOCS = NO INTERNAL_DOCS = NO CASE_SENSE_NAMES = YES HIDE_SCOPE_NAMES = NO SHOW_INCLUDE_FILES = YES FORCE_LOCAL_INCLUDES = NO INLINE_INFO = YES SORT_MEMBER_DOCS = YES SORT_BRIEF_DOCS = NO SORT_MEMBERS_CTORS_1ST = NO SORT_GROUP_NAMES = NO SORT_BY_SCOPE_NAME = NO STRICT_PROTO_MATCHING = NO GENERATE_TODOLIST = YES GENERATE_TESTLIST = YES GENERATE_BUGLIST = YES GENERATE_DEPRECATEDLIST= YES ENABLED_SECTIONS = MAX_INITIALIZER_LINES = 30 SHOW_USED_FILES = YES SHOW_DIRECTORIES = NO SHOW_FILES = YES SHOW_NAMESPACES = YES FILE_VERSION_FILTER = LAYOUT_FILE = CITE_BIB_FILES = #--------------------------------------------------------------------------- # configuration options related to warning and progress messages #--------------------------------------------------------------------------- QUIET = NO WARNINGS = YES WARN_IF_UNDOCUMENTED = YES WARN_IF_DOC_ERROR = YES WARN_NO_PARAMDOC = NO WARN_FORMAT = "$file:$line: $text" WARN_LOGFILE = #--------------------------------------------------------------------------- # configuration options related to the input files #--------------------------------------------------------------------------- INPUT = . luks INPUT_ENCODING = UTF-8 FILE_PATTERNS = *.c *.h doxyfront.txt RECURSIVE = NO EXCLUDE = EXCLUDE_SYMLINKS = NO EXCLUDE_PATTERNS = EXCLUDE_SYMBOLS = EXAMPLE_PATH = EXAMPLE_PATTERNS = EXAMPLE_RECURSIVE = NO IMAGE_PATH = INPUT_FILTER = FILTER_PATTERNS = FILTER_SOURCE_FILES = NO FILTER_SOURCE_PATTERNS = #--------------------------------------------------------------------------- # configuration options related to source browsing #--------------------------------------------------------------------------- SOURCE_BROWSER = YES INLINE_SOURCES = NO STRIP_CODE_COMMENTS = YES REFERENCED_BY_RELATION = YES REFERENCES_RELATION = NO REFERENCES_LINK_SOURCE = YES USE_HTAGS = NO VERBATIM_HEADERS = YES #--------------------------------------------------------------------------- # configuration options related to the alphabetical class index #--------------------------------------------------------------------------- ALPHABETICAL_INDEX = YES COLS_IN_ALPHA_INDEX = 5 IGNORE_PREFIX = #--------------------------------------------------------------------------- # configuration options related to the HTML output #--------------------------------------------------------------------------- GENERATE_HTML = YES HTML_OUTPUT = html HTML_FILE_EXTENSION = .html HTML_HEADER = HTML_FOOTER = HTML_STYLESHEET = HTML_EXTRA_FILES = HTML_COLORSTYLE_HUE = 220 HTML_COLORSTYLE_SAT = 100 HTML_COLORSTYLE_GAMMA = 80 HTML_TIMESTAMP = YES HTML_ALIGN_MEMBERS = YES HTML_DYNAMIC_SECTIONS = NO GENERATE_DOCSET = NO DOCSET_FEEDNAME = "Doxygen generated docs" DOCSET_BUNDLE_ID = org.doxygen.Project DOCSET_PUBLISHER_ID = org.doxygen.Publisher DOCSET_PUBLISHER_NAME = Publisher GENERATE_HTMLHELP = NO CHM_FILE = HHC_LOCATION = GENERATE_CHI = NO CHM_INDEX_ENCODING = BINARY_TOC = NO TOC_EXPAND = NO GENERATE_QHP = NO QCH_FILE = QHP_NAMESPACE = org.doxygen.Project QHP_VIRTUAL_FOLDER = doc QHP_CUST_FILTER_NAME = QHP_CUST_FILTER_ATTRS = QHP_SECT_FILTER_ATTRS = QHG_LOCATION = GENERATE_ECLIPSEHELP = NO ECLIPSE_DOC_ID = org.doxygen.Project DISABLE_INDEX = NO GENERATE_TREEVIEW = NO ENUM_VALUES_PER_LINE = 4 USE_INLINE_TREES = NO TREEVIEW_WIDTH = 250 EXT_LINKS_IN_WINDOW = NO FORMULA_FONTSIZE = 10 FORMULA_TRANSPARENT = YES USE_MATHJAX = NO MATHJAX_RELPATH = http://www.mathjax.org/mathjax MATHJAX_EXTENSIONS = SEARCHENGINE = YES SERVER_BASED_SEARCH = NO #--------------------------------------------------------------------------- # configuration options related to the LaTeX output #--------------------------------------------------------------------------- GENERATE_LATEX = YES LATEX_OUTPUT = latex LATEX_CMD_NAME = latex MAKEINDEX_CMD_NAME = makeindex COMPACT_LATEX = NO PAPER_TYPE = a4 EXTRA_PACKAGES = LATEX_HEADER = LATEX_FOOTER = PDF_HYPERLINKS = YES USE_PDFLATEX = YES LATEX_BATCHMODE = NO LATEX_HIDE_INDICES = NO LATEX_SOURCE_CODE = NO LATEX_BIB_STYLE = plain #--------------------------------------------------------------------------- # configuration options related to the RTF output #--------------------------------------------------------------------------- GENERATE_RTF = NO RTF_OUTPUT = rtf COMPACT_RTF = NO RTF_HYPERLINKS = NO RTF_STYLESHEET_FILE = RTF_EXTENSIONS_FILE = #--------------------------------------------------------------------------- # configuration options related to the man page output #--------------------------------------------------------------------------- GENERATE_MAN = NO MAN_OUTPUT = man MAN_EXTENSION = .3 MAN_LINKS = NO #--------------------------------------------------------------------------- # configuration options related to the XML output #--------------------------------------------------------------------------- GENERATE_XML = NO XML_OUTPUT = xml XML_SCHEMA = XML_DTD = XML_PROGRAMLISTING = YES #--------------------------------------------------------------------------- # configuration options for the AutoGen Definitions output #--------------------------------------------------------------------------- GENERATE_AUTOGEN_DEF = NO #--------------------------------------------------------------------------- # configuration options related to the Perl module output #--------------------------------------------------------------------------- GENERATE_PERLMOD = NO PERLMOD_LATEX = NO PERLMOD_PRETTY = YES PERLMOD_MAKEVAR_PREFIX = #--------------------------------------------------------------------------- # Configuration options related to the preprocessor #--------------------------------------------------------------------------- ENABLE_PREPROCESSING = YES MACRO_EXPANSION = NO EXPAND_ONLY_PREDEF = NO SEARCH_INCLUDES = YES INCLUDE_PATH = INCLUDE_FILE_PATTERNS = PREDEFINED = TESTING=1 EXPAND_AS_DEFINED = SKIP_FUNCTION_MACROS = YES #--------------------------------------------------------------------------- # Configuration::additions related to external references #--------------------------------------------------------------------------- TAGFILES = GENERATE_TAGFILE = ALLEXTERNALS = NO EXTERNAL_GROUPS = YES PERL_PATH = /usr/bin/perl #--------------------------------------------------------------------------- # Configuration options related to the dot tool #--------------------------------------------------------------------------- CLASS_DIAGRAMS = YES MSCGEN_PATH = HIDE_UNDOC_RELATIONS = YES HAVE_DOT = NO DOT_NUM_THREADS = 0 DOT_FONTNAME = Helvetica DOT_FONTSIZE = 10 DOT_FONTPATH = CLASS_GRAPH = YES COLLABORATION_GRAPH = YES GROUP_GRAPHS = YES UML_LOOK = NO TEMPLATE_RELATIONS = NO INCLUDE_GRAPH = YES INCLUDED_BY_GRAPH = YES CALL_GRAPH = NO CALLER_GRAPH = NO GRAPHICAL_HIERARCHY = YES DIRECTORY_GRAPH = YES DOT_IMAGE_FORMAT = png INTERACTIVE_SVG = NO DOT_PATH = DOTFILE_DIRS = MSCFILE_DIRS = DOT_GRAPH_MAX_NODES = 50 MAX_DOT_GRAPH_DEPTH = 0 DOT_TRANSPARENT = NO DOT_MULTI_TARGETS = YES GENERATE_LEGEND = YES DOT_CLEANUP = YES cryptmount-5.2/fsutils.c0000644000175000017500000004535712613124506012400 00000000000000/* * Filesystem-related utilities for cryptmount * (C)Copyright 2005-2015, RW Penney */ /* This file is part of cryptmount cryptmount is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. cryptmount is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. */ #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include "cryptmount.h" #include "delegates.h" #include "dmutils.h" #include "fsutils.h" #if WITH_CSWAP # include #endif #ifdef TESTING # include "cmtesting.h" #endif static const char *ETCMTAB = "/etc/mtab", *ETCMTABTMP = "/etc/mtab.cm", *STDPATH = CM_DEFAULT_SUPATH; enum { F_MATCHUID = 0x01, /*!< Set real UID to match effective UID */ F_CLOSE1 = 0x02, /*!< Close stdout on child process */ F_SETPATH = 0x04 /*!< Set standard PATH for child process */ }; static int run_sucommand(const char *path, const char *argv[], const char *supath, unsigned switches); int do_addmntent(const tgtdefn_t *tgt); int do_rmvmntent(const tgtdefn_t *tgt); static char **split_fsckopts(const char *fsckoptions, unsigned *argc) /*! Split options separated by ';' into vector of strings */ { const char SEP = ';'; const char *pos, *posnext; size_t optlen; char **opttable=NULL; size_t tablesize = 0; *argc = 0; if (fsckoptions == NULL || *fsckoptions == '\0') return opttable; pos = fsckoptions; do { if (*argc >= tablesize) { tablesize = (tablesize + 8) * 2; opttable = (char**)realloc((void*)opttable, (size_t)(tablesize * sizeof(char*))); } posnext = pos; optlen = 0; while (*posnext != SEP && *posnext != '\0') { ++posnext; ++optlen; } opttable[*argc] = (char*)malloc(optlen + 1); strncpy(opttable[*argc], pos, optlen); opttable[*argc][optlen] = '\0'; ++*argc; pos = posnext + 1; } while (*posnext != '\0'); return opttable; } #if ERSATZ_MOUNT static int parse_mountoptions(const char *buff, unsigned long *mflags) /*! Convert string of mount-options into binary flags */ { struct fsopt_t { const char *str; unsigned long mask; }; struct fsopt_t fsopts[] = { { "defaults", 0 }, { "noatime", MS_NOATIME }, { "nodev", MS_NODEV }, { "noexec", MS_NOEXEC }, { "nosuid", MS_NOSUID }, { "ro", MS_RDONLY }, { "sync", MS_SYNCHRONOUS }, { NULL, 0 } }; unsigned idx,len; *mflags = 0; if (buff == NULL) return 0; for (;;) { for (len=0; buff[len]!='\0' && buff[len]!=','; ++len); for (idx=0; fsopts[idx].str!=NULL; ++idx) { if (strncmp(buff, fsopts[idx].str, (size_t)len) == 0) { *mflags |= fsopts[idx].mask; break; } } if (fsopts[idx].str == NULL) { fprintf(stderr, "bad option \"%s\"\n", buff); return 1; } if (buff[len] == '\0') break; buff += len + 1; } return 0; } int fs_mount(const char *mntdev, const tgtdefn_t *tgt) /*! Fallback version of mount(8) using mount(2) */ { unsigned long mflags; int eflag=ERR_NOERROR; char *errstr=NULL; if (parse_mountoptions(tgt->mountoptions, &mflags) != 0) { return ERR_BADMOUNT; } errstr = (char*)malloc((size_t)(strlen(mntdev) + strlen(tgt->dir) + 64)); sprintf(errstr, "mounting \"%s\" on \"%s\" failed", mntdev, tgt->dir); if (mount(mntdev, tgt->dir, tgt->fstype, mflags, NULL) == 0) { (void)do_addmntent(tgt); } else { perror(errstr); eflag = ERR_BADMOUNT; } free((void*)errstr); return eflag; } #else /* !ERSATZ_MOUNT */ int fs_mount(const char *dev, const tgtdefn_t *tgt) /*! Delegate filesystem mounting to mount(8) */ { int idx, stat, eflag=ERR_NOERROR; const char *argv[16]; /* Construct argument list for mount -t ... -o ... */ idx = 0; argv[idx++] = "[cryptmount-mount]"; if (tgt->fstype != NULL) { argv[idx++] = "-t"; argv[idx++] = tgt->fstype; } if (tgt->mountoptions != NULL) { argv[idx++] = "-o"; argv[idx++] = tgt->mountoptions; } argv[idx++] = dev; argv[idx++] = tgt->dir; argv[idx++] = NULL; stat = run_sucommand(DLGT_MOUNT, argv, tgt->supath, F_MATCHUID); eflag = (stat != 0 ? ERR_BADMOUNT: ERR_NOERROR); return eflag; } #endif /* ERSATZ_MOUNT */ #if ERSATZ_UMOUNT int fs_unmount(const tgtdefn_t *tgt) /*! Fallback version of umount(8) using umount(2) */ { int eflag=ERR_NOERROR; char *errstr=NULL; errstr = (char*)malloc((size_t)(strlen(tgt->dir) + 64)); sprintf(errstr, "unmounting \"%s\" failed", tgt->dir); if (umount(tgt->dir) == 0) { (void)do_rmvmntent(tgt); } else { perror(errstr); eflag = ERR_BADMOUNT; } free((void*)errstr); return eflag; } #else /* !ERSATZ_UMOUNT */ int fs_unmount(const tgtdefn_t *tgt) /*! Delegate filesystem mounting to umount(8) */ { int idx, stat, eflag=ERR_NOERROR; const char *argv[16]; /* Construct argument list for umount -t ... */ idx = 0; argv[idx++] = "[cryptmount-umount]"; #ifdef PARANOID if (tgt->fstype != NULL) { argv[idx++] = "-t"; argv[idx++] = tgt->fstype; } if (tgt->mountoptions != NULL) { argv[idx++] = "-O"; argv[idx++] = tgt->mountoptions; } #endif argv[idx++] = tgt->dir; argv[idx++] = NULL; stat = run_sucommand(DLGT_UMOUNT, argv, tgt->supath, F_MATCHUID); eflag = (stat != 0 ? ERR_BADMOUNT: ERR_NOERROR); return eflag; } #endif /* ERSATZ_UMOUNT */ #if WITH_CSWAP int fs_swapon(const char *mntdev, const tgtdefn_t *tgt) /*! Install \a mntdev as a new swap device */ { int idx, stat, prio, rawprio = 0x100, expendable = 0, eflag=ERR_NOERROR; const char *argv[8]; double cry_entropy = 0.0, raw_entropy = 0.0; const size_t entrosize = 1 << 20; const double blank_thresh = 1e-5, noise_thresh = 7.0; if (strcmp(tgt->fstype,"swap") != 0) { fprintf(stderr, _("Unsuitable filesystem type \"%s\" for swapping\n"), tgt->fstype); eflag = ERR_BADSWAP; goto bail_out; } /* Measure entropy of filesystem and underlying raw device to check whether it's safe to force mkswap to format what it thinks is a whole disk(!), or which could be a file containing wanted data: */ raw_entropy = fs_entropy(tgt->dev, entrosize); cry_entropy = fs_entropy(mntdev, entrosize); expendable = (raw_entropy < blank_thresh) || (cry_entropy < blank_thresh) || (raw_entropy > noise_thresh && cry_entropy > noise_thresh); if ((tgt->flags & FLG_MKSWAP) != 0) { if (expendable) { /* Construct argument list for mkswap */ idx = 0; argv[idx++] = "[cryptmount-mkswap]"; if (expendable) argv[idx++] = "-f"; argv[idx++] = mntdev; argv[idx++] = NULL; stat = run_sucommand(DLGT_MKSWAP, argv, tgt->supath, F_CLOSE1); eflag = (stat != 0 ? ERR_BADSWAP : ERR_NOERROR); if (eflag != ERR_NOERROR) goto bail_out; } else { fprintf(stderr, _("Device \"%s\" appears to contain data (entropy=%.3g,%.3g) - please run mkswap manually\n"), tgt->dev, raw_entropy, cry_entropy); } } if (tgt->mountoptions != NULL && sscanf(tgt->mountoptions, "pri=%i", &prio) == 1) { rawprio = prio; } prio = ( SWAP_FLAG_PREFER | ((rawprio << SWAP_FLAG_PRIO_SHIFT) & SWAP_FLAG_PRIO_MASK) ); if (swapon(mntdev, prio) != 0) { eflag = ERR_BADSWAP; goto bail_out; } bail_out: return eflag; } int fs_swapoff(const tgtdefn_t *tgt) { char *mntdev=NULL; int eflag=ERR_NOERROR; if (strcmp(tgt->fstype,"swap") != 0) { eflag = ERR_BADSWAP; goto bail_out; } devmap_path(&mntdev, tgt->ident); if (swapoff(mntdev) != 0) { eflag = ERR_BADSWAP; goto bail_out; } bail_out: if (mntdev != NULL) free((void*)mntdev); return eflag; } #endif /* WITH_CSWAP */ int do_addmntent(const tgtdefn_t *tgt) /*! Add entry into /etc/mtab for newly-mounted filing system */ { char *mntdev = NULL; struct mntent mntinfo; FILE *fp; int eflag=ERR_NOERROR; devmap_path(&mntdev, tgt->ident); mntinfo.mnt_fsname = mntdev; mntinfo.mnt_dir = tgt->dir; mntinfo.mnt_type = tgt->fstype; mntinfo.mnt_opts = "none"; mntinfo.mnt_freq = 0; mntinfo.mnt_passno = 0; fp = setmntent(ETCMTAB, "a"); if (fp == NULL) { eflag = ERR_BADFILE; goto bail_out; } (void)addmntent(fp, &mntinfo); endmntent(fp); bail_out: if (mntdev != NULL) free((void*)mntdev); return eflag; } int do_rmvmntent(const tgtdefn_t *tgt) /*! Remove entry from /etc/mtab after unmounting filing system */ { char *mntdev=NULL; struct mntent *mntinfo; FILE *fp_in=NULL,*fp_out=NULL; struct stat sbuff; int i,eflag=ERR_NOERROR,found=0; /* FIXME - add lots more checks on integrity: */ devmap_path(&mntdev, tgt->ident); /* Open old /etc/mtab & create temporary replacement: */ fp_in = setmntent(ETCMTAB, "r"); fp_out = setmntent(ETCMTABTMP, "w"); if (fp_in == NULL || fp_out == NULL) { eflag = ERR_BADFILE; goto bail_out; } i = stat(ETCMTAB, &sbuff); if (i != 0 || !S_ISREG(sbuff.st_mode)) { fprintf(stderr, "%s is not a valid file\n", ETCMTAB); eflag = ERR_BADFILE; goto bail_out; } /* Transfer entries from old /etc/mtab to prototype replacement file: */ while ((mntinfo = getmntent(fp_in)) != NULL) { if (strcmp(mntinfo->mnt_fsname, mntdev) == 0 && strcmp(mntinfo->mnt_dir, tgt->dir) == 0) { ++found; } else { addmntent(fp_out, mntinfo); } } /* Transfer ownership & permissions from old /etc/mtab to new: */ if (chown(ETCMTABTMP, sbuff.st_uid, sbuff.st_gid) != 0 || chmod(ETCMTABTMP, sbuff.st_mode) != 0) { fprintf(stderr, "cannot transfer ownership/modes to \"%s\"\n", ETCMTABTMP); eflag = ERR_BADFILE; goto bail_out; } endmntent(fp_in); fp_in = NULL; if (rename(ETCMTABTMP, ETCMTAB)) { fprintf(stderr, "Failed to recreate %s\n", ETCMTAB); } bail_out: if (fp_in != NULL) endmntent(fp_in); if (fp_out != NULL) endmntent(fp_out); if (mntdev != NULL) free((void*)mntdev); return eflag; } /*! * Check whether a filesystem target is mounted. * * This will examine entries in /etc/mtab via getmntent(), * looking for a filesystem whose major and minor device numbers * match those of the block device associated with the supplied target. * * Note that this will return false for targets that refer * to swap partitions, even if they are active. */ int is_mounted(const tgtdefn_t *tgt) { int mounted=0; char *mntdev=NULL; struct mntent *mntinfo; struct stat st_mtb, st_tgt; FILE *fp; /* check if underlying device has been configured at all: */ if (!is_configured(tgt->ident, NULL)) return 0; /* find path to device that would have been mounted & device info: */ devmap_path(&mntdev, tgt->ident); if (stat(mntdev, &st_tgt) != 0) return 0; /* check entries in /etc/mtab: */ fp = setmntent(ETCMTAB, "r"); if (fp == NULL) { return 0; /* indeterminate case - assume not mounted */ } while ((mntinfo = getmntent(fp)) != NULL && !mounted) { if (stat(mntinfo->mnt_fsname, &st_mtb) != 0) continue; /* compare to mounted device on basis of kernel device maj/min: */ if (major(st_mtb.st_rdev) == major(st_tgt.st_rdev) && minor(st_mtb.st_rdev) == minor(st_tgt.st_rdev)) { mounted = 1; } } endmntent(fp); return mounted; } int is_readonlyfs(const char *path) /*! Check if filesystem containing *path is read-only */ { struct statvfs sbuff; return (path == NULL || (statvfs(path, &sbuff) != 0 || (sbuff.f_flag & ST_RDONLY) != 0)); } #if WITH_FSCK int fs_check(const char *dev, const tgtdefn_t *tgt) /*! Run 'fsck' on target filesystem */ { int idx, stat, eflag=ERR_NOERROR; unsigned pos, n_opts = 0; const char **opts = NULL, **argv = NULL; if (tgt->fsckoptions != NULL) { opts = (const char**)split_fsckopts(tgt->fsckoptions, &n_opts); } argv = (const char**)malloc((16 + n_opts) * sizeof(char*)); /* Construct argument list for fsck -T -t ... */ idx = 0; argv[idx++] = "[cryptmount-fsck]"; argv[idx++] = "-T"; if (tgt->fstype != NULL) { argv[idx++] = "-t"; argv[idx++] = tgt->fstype; } for (pos=0; possupath, F_MATCHUID | F_SETPATH); eflag = ((stat == 0 || stat == 1) ? ERR_NOERROR : ERR_BADFSCK); if (opts != NULL) { for (pos=0; pos sizeof(buff)) chunk = sizeof(buff); step = read(fd, (void*)buff, chunk); if (step <= 0) break; for (i=0; i 0) { for (i=0; i<256; ++i) { if (counts[i] == 0) continue; plogp -= counts[i] * log((double)counts[i]); } plogp = (plogp / totcount) + log((double)totcount); } plogp /= log(2.0); free((void*)counts); close(fd); return plogp; } #if !ERSATZ_MOUNT || !ERSATZ_UMOUNT || WITH_FSCK || WITH_CSWAP static int run_sucommand(const char *path, const char **argv, const char *supath, unsigned switches) /*! Fork (& wait for) system-command as root */ { pid_t child; int stat=-1, fd; switch ((child = fork())) { case -1: /* fork failed */ fprintf(stderr, "failed to fork (%s)\n", path); break; case 0: /* child fork */ if ((switches & F_MATCHUID) != 0) { /* change real UID to match effective UID (probably only useful if euid==root): */ if (setuid(geteuid()) != 0) exit(EXIT_BADEXEC); } if ((switches & F_CLOSE1) != 0) { /* redirect standard output to /dev/null */ fd = open("/dev/null", O_WRONLY); if (fd >= 0) (void)dup2(fd, STDOUT_FILENO); else (void)close(STDOUT_FILENO); } if ((switches & F_SETPATH) != 0) { if (supath == NULL) supath = STDPATH; if (setenv("PATH", supath, 1) != 0) { exit(EXIT_BADEXEC); } } execv(path, (char *const *)argv); fprintf(stderr, "failed to invoke \"%s\"\n", path); exit(EXIT_BADEXEC); break; default: /* parent fork */ if (waitpid(child, &fd, 0) == child) { stat = fd; } break; } return stat; } #endif /* !ERSATZ_MOUNT ... */ #ifdef TESTING /*! \addtogroup unit_tests * @{ */ int fs_test_splitopts() { char **opttable, buff[256]; unsigned argc, idx, limit; const char *SEP = ";", *optsrc[] = { "The", "rain", "in", "Spain", "falls", "mainly", "in", "the", "plain", ",allegedly", NULL }; CM_TEST_START("Splitting fsck options"); argc = 17; opttable = split_fsckopts(NULL, &argc); CM_ASSERT_EQUAL(0, argc); CM_ASSERT_EQUAL(NULL, opttable); argc = 34; opttable = split_fsckopts("", &argc); CM_ASSERT_EQUAL(0, argc); CM_ASSERT_EQUAL(NULL, opttable); for (limit=0; optsrc[limit] != NULL; ++limit) { buff[0] = '\0'; for (idx=0; idx<=limit; ++idx) { strcat(buff, optsrc[idx]); if (idx < limit) strcat(buff, SEP); } opttable = split_fsckopts(buff, &argc); CM_ASSERT_EQUAL((limit+1), argc); for (idx=0; idx 1e-2) CM_TEST_FAIL("Mismatch"); } (void)unlink(fname); CM_TEST_OK(); } /** @} */ #endif /* TESTING */ /* * (C)Copyright 2005-2015, RW Penney */ cryptmount-5.2/cmtesting.h0000644000175000017500000000771212521465225012706 00000000000000/* * Declarations for unit-test utilities for cryptmoumt * (C)Copyright 2006-2015, RW Penney */ /* This file is part of cryptmount cryptmount is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. cryptmount is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. */ #ifndef _CMTEST_H #define _CMTEST_H #include /*! \addtogroup unit_tests * @{ */ enum { CM_TEST_PASSED = 0, CM_TEST_FAILED, CM_TEST_ABORTED, CM_TEST_LAST }; enum { CM_READONLY = 0x001, /* Omit tests of key-creation */ CM_HASLEGACY = 0x002 /* Test against legacy key files */ }; typedef struct cm_testinfo { const char *current; /* name of current test */ int tests_run; /* total number of tests initiated */ int test_stats[CM_TEST_LAST]; /* statistics of test outcomes */ const char *argconfigdir; /* adjustable config-directory */ } cm_testinfo_t; extern cm_testinfo_t *test_ctxtptr; #define CM_TEST_START(name) \ { \ fprintf(stderr, "starting test \"%s\"...", name); \ ++test_ctxtptr->tests_run; \ test_ctxtptr->current = NULL; \ } #define CM_TEST_IDENT(ident) \ { \ test_ctxtptr->current = (const char*)ident; \ } #define CM_ASSERT_EQUAL(expected, actual) \ if ((expected) != (actual)) { \ fprintf(stderr, " test failed %s:%d (%s != %s)\n", \ __FILE__, __LINE__, #expected, #actual); \ if (test_ctxtptr->current != NULL) { \ fprintf(stderr, " [%s]\n", test_ctxtptr->current); } \ ++test_ctxtptr->test_stats[CM_TEST_FAILED]; \ return CM_TEST_FAILED; \ } #define CM_ASSERT_STR_EQUAL(expected, actual) \ if (strcmp(expected, actual) != 0) { \ fprintf(stderr, " test failed %s:%d (\"%s\" != \"%s\")\n", \ __FILE__, __LINE__, expected, actual); \ if (test_ctxtptr->current != NULL) { \ fprintf(stderr, " [%s]\n", test_ctxtptr->current); } \ ++test_ctxtptr->test_stats[CM_TEST_FAILED]; \ return CM_TEST_FAILED; \ } #define CM_ASSERT_DIFFERENT(expected, actual) \ if ((expected) == (actual)) { \ fprintf(stderr, " test failed %s:%d\n (%s == %s)", \ __FILE__, __LINE__, #expected, #actual); \ if (test_ctxtptr->current != NULL) { \ fprintf(stderr, " [%s]\n", test_ctxtptr->current); } \ ++test_ctxtptr->test_stats[CM_TEST_FAILED]; \ return CM_TEST_FAILED; \ } #define CM_TEST_OK(TI) \ { \ fprintf(stderr, " ok\n"); \ ++test_ctxtptr->test_stats[CM_TEST_PASSED]; \ return CM_TEST_PASSED; \ } #define CM_TEST_FAIL(TI) \ { \ fprintf(stderr, " FAILED at %s:%d\n", __FILE__, __LINE__); \ if (test_ctxtptr->current != NULL) { \ fprintf(stderr, " [%s]\n", test_ctxtptr->current); } \ ++test_ctxtptr->test_stats[CM_TEST_FAILED]; \ return CM_TEST_FAILED; \ } #define CM_TEST_ABORT(TI) \ { \ fprintf(stderr, " ABORTED at %s:%d\n", __FILE__, __LINE__); \ if (test_ctxtptr->current != NULL) { \ fprintf(stderr, " [%s]\n", test_ctxtptr->current); } \ ++test_ctxtptr->test_stats[CM_TEST_ABORTED]; \ return CM_TEST_ABORTED; \ } int cm_run_tests(); /** @} */ #endif /* _CMTEST_H */ /* * (C)Copyright 2006-2015, RW Penney */ cryptmount-5.2/dmutils.h0000644000175000017500000000275512521465225012374 00000000000000/* * Declarations for device-mapper utilities for cryptmount * (C)Copyright 2005-2015, RW Penney */ /* This file is part of cryptmount cryptmount is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. cryptmount is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. */ #ifndef _DMUTILS_H #define _DMUTILS_H #include #include /*! \addtogroup dev_mapper * @{ */ struct dm_task *devmap_prepare(int type, const char *devname); int devmap_path(char **buff, const char *ident); int devmap_create(const char *ident, uint64_t blk0, uint64_t blklen, const char *tgttype, const char *params); int devmap_dependencies(const char *ident, unsigned *count, dev_t **devids); int devmap_remove(const char *ident); int is_configured(const char *ident, struct dm_info *dminfo); int udev_settle(); /** @} */ #endif /* _DMUTILS_H */ /* * (C)Copyright 2005-2015, RW Penney */ cryptmount-5.2/missing0000755000175000017500000001533012521464731012133 00000000000000#! /bin/sh # Common wrapper for a few potentially missing GNU programs. scriptversion=2013-10-28.13; # UTC # Copyright (C) 1996-2013 Free Software Foundation, Inc. # Originally written by Fran,cois Pinard , 1996. # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2, or (at your option) # any later version. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # You should have received a copy of the GNU General Public License # along with this program. If not, see . # As a special exception to the GNU General Public License, if you # distribute this file as part of a program that contains a # configuration script generated by Autoconf, you may include it under # the same distribution terms that you use for the rest of that program. if test $# -eq 0; then echo 1>&2 "Try '$0 --help' for more information" exit 1 fi case $1 in --is-lightweight) # Used by our autoconf macros to check whether the available missing # script is modern enough. exit 0 ;; --run) # Back-compat with the calling convention used by older automake. shift ;; -h|--h|--he|--hel|--help) echo "\ $0 [OPTION]... PROGRAM [ARGUMENT]... Run 'PROGRAM [ARGUMENT]...', returning a proper advice when this fails due to PROGRAM being missing or too old. Options: -h, --help display this help and exit -v, --version output version information and exit Supported PROGRAM values: aclocal autoconf autoheader autom4te automake makeinfo bison yacc flex lex help2man Version suffixes to PROGRAM as well as the prefixes 'gnu-', 'gnu', and 'g' are ignored when checking the name. Send bug reports to ." exit $? ;; -v|--v|--ve|--ver|--vers|--versi|--versio|--version) echo "missing $scriptversion (GNU Automake)" exit $? ;; -*) echo 1>&2 "$0: unknown '$1' option" echo 1>&2 "Try '$0 --help' for more information" exit 1 ;; esac # Run the given program, remember its exit status. "$@"; st=$? # If it succeeded, we are done. test $st -eq 0 && exit 0 # Also exit now if we it failed (or wasn't found), and '--version' was # passed; such an option is passed most likely to detect whether the # program is present and works. case $2 in --version|--help) exit $st;; esac # Exit code 63 means version mismatch. This often happens when the user # tries to use an ancient version of a tool on a file that requires a # minimum version. if test $st -eq 63; then msg="probably too old" elif test $st -eq 127; then # Program was missing. msg="missing on your system" else # Program was found and executed, but failed. Give up. exit $st fi perl_URL=http://www.perl.org/ flex_URL=http://flex.sourceforge.net/ gnu_software_URL=http://www.gnu.org/software program_details () { case $1 in aclocal|automake) echo "The '$1' program is part of the GNU Automake package:" echo "<$gnu_software_URL/automake>" echo "It also requires GNU Autoconf, GNU m4 and Perl in order to run:" echo "<$gnu_software_URL/autoconf>" echo "<$gnu_software_URL/m4/>" echo "<$perl_URL>" ;; autoconf|autom4te|autoheader) echo "The '$1' program is part of the GNU Autoconf package:" echo "<$gnu_software_URL/autoconf/>" echo "It also requires GNU m4 and Perl in order to run:" echo "<$gnu_software_URL/m4/>" echo "<$perl_URL>" ;; esac } give_advice () { # Normalize program name to check for. normalized_program=`echo "$1" | sed ' s/^gnu-//; t s/^gnu//; t s/^g//; t'` printf '%s\n' "'$1' is $msg." configure_deps="'configure.ac' or m4 files included by 'configure.ac'" case $normalized_program in autoconf*) echo "You should only need it if you modified 'configure.ac'," echo "or m4 files included by it." program_details 'autoconf' ;; autoheader*) echo "You should only need it if you modified 'acconfig.h' or" echo "$configure_deps." program_details 'autoheader' ;; automake*) echo "You should only need it if you modified 'Makefile.am' or" echo "$configure_deps." program_details 'automake' ;; aclocal*) echo "You should only need it if you modified 'acinclude.m4' or" echo "$configure_deps." program_details 'aclocal' ;; autom4te*) echo "You might have modified some maintainer files that require" echo "the 'autom4te' program to be rebuilt." program_details 'autom4te' ;; bison*|yacc*) echo "You should only need it if you modified a '.y' file." echo "You may want to install the GNU Bison package:" echo "<$gnu_software_URL/bison/>" ;; lex*|flex*) echo "You should only need it if you modified a '.l' file." echo "You may want to install the Fast Lexical Analyzer package:" echo "<$flex_URL>" ;; help2man*) echo "You should only need it if you modified a dependency" \ "of a man page." echo "You may want to install the GNU Help2man package:" echo "<$gnu_software_URL/help2man/>" ;; makeinfo*) echo "You should only need it if you modified a '.texi' file, or" echo "any other file indirectly affecting the aspect of the manual." echo "You might want to install the Texinfo package:" echo "<$gnu_software_URL/texinfo/>" echo "The spurious makeinfo call might also be the consequence of" echo "using a buggy 'make' (AIX, DU, IRIX), in which case you might" echo "want to install GNU make:" echo "<$gnu_software_URL/make/>" ;; *) echo "You might have modified some files without having the proper" echo "tools for further handling them. Check the 'README' file, it" echo "often tells you about the needed prerequisites for installing" echo "this package. You may also peek at any GNU archive site, in" echo "case some other package contains this missing '$1' program." ;; esac } give_advice "$1" | sed -e '1s/^/WARNING: /' \ -e '2,$s/^/ /' >&2 # Propagate the correct exit status (expected to be 127 for a program # not found, 63 for a program that failed due to version mismatch). exit $st # Local variables: # eval: (add-hook 'write-file-hooks 'time-stamp) # time-stamp-start: "scriptversion=" # time-stamp-format: "%:y-%02m-%02d.%02H" # time-stamp-time-zone: "UTC" # time-stamp-end: "; # UTC" # End: cryptmount-5.2/armour-luks.c0000644000175000017500000003453612613124531013163 00000000000000/* * Methods for LUKS-related key-management for cryptmount * (C)Copyright 2005-2015, RW Penney */ /* This file is part of cryptmount cryptmount is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. cryptmount is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. */ #include #include #include #include #include #include #include #include "armour.h" #include "cryptmount.h" #include "dmutils.h" #include "utils.h" #ifdef TESTING # include "cmtesting.h" #endif /*! \addtogroup keymgrs * @{ */ #ifndef GCRYPT_REQ_VERSION # define GCRYPT_REQ_VERSION "1.1.42" #endif typedef struct { unsigned keyslot; } luks_overrides_t; /* * ==== LUKS key-management routines ==== */ #if USE_LUKSCOMPAT # include # include static int kmluks_hdrvalid(FILE *fp_key) /* Check whether a valid LUKS header is present */ { const uint8_t luks_magic[] = { 'L','U','K','S', 0xba, 0xbe }; const size_t magic_len = sizeof(luks_magic); char buff[32]; int flg = 0; if (fp_key == NULL) return 0; if (cm_fread((void*)buff, magic_len, fp_key) == 0) { fseek(fp_key, -((long)magic_len), SEEK_CUR); flg = (strncmp(buff, (const char*)luks_magic, (size_t)magic_len) == 0); } return flg; } static void kmluks_splitmode(const char *fullname, char **cipher, char **mode) /* Split fully-qualified cipher name into algorithm + mode */ { size_t divpos=0, nlen=0; const char *pos=fullname; if (*cipher != NULL) free((void*)*cipher); if (*mode != NULL) free((void*)*mode); *cipher = *mode = NULL; if (fullname != NULL) { /* Split name according to 'ALGO-MODE' pattern: */ while (*pos != '\0' && *pos != '-') { ++pos; ++nlen; } divpos = nlen; while (*pos != '\0') { ++pos; ++nlen; } if (divpos > 0) { *cipher = (char*)malloc(divpos + 1); strncpy(*cipher, fullname, divpos); (*cipher)[divpos] = '\0'; } if (divpos < nlen) { *mode = (char*)malloc((nlen - divpos)); strcpy(*mode, fullname + divpos + 1); } } if (*cipher == NULL) *cipher = cm_strdup("aes"); if (*mode == NULL) *mode = cm_strdup("cbc-plain"); } static int kmluks_init_algs() { static int done_secmem = 0; int flg = 0; if (!done_secmem || !gcry_control(GCRYCTL_INITIALIZATION_FINISHED_P)) { if (!gcry_check_version(GCRYPT_REQ_VERSION)) return -1; /* Disable gcrypt secure-memory initialization as cryptmount makes * its own arrangements for locking pages in memory. * gcrypt secmem facilities will also drop setuid privileges, * which would conflict with device-mapper system calls * within cryptmount */ (void)gcry_control(GCRYCTL_DISABLE_SECMEM); (void)gcry_control(GCRYCTL_INITIALIZATION_FINISHED, 0); done_secmem = 1; } return flg; } static int kmluks_free_algs() { /* Nothing needed */ return 0; } static int kmluks_bind(bound_tgtdefn_t *bound, FILE *fp_key) { int compat = 0; if (bound->tgt->key.format != NULL) { compat = (strcmp(bound->tgt->key.format, "luks") == 0); } else { /* Check header of existing key-file: */ compat |= kmluks_hdrvalid(fp_key); } if (compat) { tgtdefn_t *tgt = bound->tgt; if (tgt->key.filename == NULL && tgt->dev != NULL) { tgt->key.filename = cm_strdup(tgt->dev); } if (tgt->key.digestalg == NULL) { tgt->key.digestalg = cm_strdup("sha1"); } if (tgt->key.cipheralg == NULL) { tgt->key.cipheralg = cm_strdup("aes128"); } } return compat; } static unsigned kmluks_get_properties(const bound_tgtdefn_t *boundtgt) { unsigned props; FILE *fp; props = KM_PROP_HASPASSWD | KM_PROP_FIXEDLOC; fp = fopen(boundtgt->tgt->key.filename, "rb"); if (fp != NULL) { if (kmluks_hdrvalid(fp)) { props |= KM_PROP_FORMATTED; } fclose(fp); } return props; } /*! * Change the password associated with a given LUKS key-slot. * * This will either create an entirely new keyslot with the given password, * or attempt to change the password associated with a particular keyslot * while taking a temporary backup of the key in that slot. This requires * that there is at least one spare keyslot available to take that backup. * * @param key The volume key for the LUKS device * @param keyslot Either CRYPT_ANY_SLOT or a nominated slot. * * @return The slot associated with the new password. */ int kmluks_change_slot_passwd(struct crypt_device *cd, int keyslot, const uint8_t *key, const int keylen, const char *passwd) { const size_t passwdlen = strlen(passwd); int new_slot = -1, bckp_slot = -1, r; char logmsg[256]; if (keyslot != CRYPT_ANY_SLOT) { bckp_slot = crypt_keyslot_add_by_volume_key(cd, CRYPT_ANY_SLOT, (const char*)key, keylen, passwd, passwdlen); if (bckp_slot < 0) return bckp_slot; r = crypt_keyslot_destroy(cd, keyslot); if (r < 0) return r; sprintf(logmsg, "kmluks created keyslot backup %d -> %d", keyslot, bckp_slot); crypt_log(cd, CRYPT_LOG_NORMAL, logmsg); } new_slot = crypt_keyslot_add_by_volume_key(cd, keyslot, (const char*)key, keylen, passwd, passwdlen); if (new_slot < 0) return new_slot; sprintf(logmsg, "kmluks added keyslot %d", new_slot); crypt_log(cd, CRYPT_LOG_NORMAL, logmsg); if (keyslot != CRYPT_ANY_SLOT && bckp_slot >= 0 && bckp_slot != new_slot) { crypt_keyslot_destroy(cd, bckp_slot); sprintf(logmsg, "kmluks removed keyslot backup %d", bckp_slot); crypt_log(cd, CRYPT_LOG_NORMAL, logmsg); } return new_slot; } void kmluks_log(int level, const char *msg, void *data) /*! stderr-based logging function for libcryptsetup */ { fprintf(stderr, "LUKS[%d] - %s\n", level, msg); } static int kmluks_get_key(bound_tgtdefn_t *boundtgt, const km_pw_context_t *pw_ctxt, uint8_t **key, int *keylen, FILE *fp_key) /*! Extract key from LUKS header file */ { tgtdefn_t *tgt = boundtgt->tgt; char *passwd = NULL, label[256]; struct crypt_device *luks_ctxt = NULL; int slot = -1, eflag = ERR_NOERROR; luks_overrides_t *luksor; int64_t delta; size_t lcs_keylen = 256; const size_t namesz = 128; /* This is vulnerable to permission-issues created by libgcrypt * -- see http://code.google.com/p/cryptsetup/issues/detail?id=47, * which are mitigated by kmluks_init_algs(). */ snprintf(label, sizeof(label), "cm-luks-tmp-%d-%x", getpid(), (unsigned)(size_t)tgt); eflag = km_get_passwd(tgt->ident, pw_ctxt, &passwd, 0, 0); if (eflag != ERR_NOERROR) goto bail_out; if (crypt_init(&luks_ctxt, tgt->key.filename) < 0 || crypt_load(luks_ctxt, NULL, NULL) < 0) { fprintf(stderr, _("Failed to initialize device for LUKS keyfile\n")); eflag = ERR_BADDECRYPT; goto bail_out; } //crypt_set_log_callback(luks_ctxt, kmluks_log, NULL); // FIXME - remove soon slot = crypt_activate_by_passphrase(luks_ctxt, label, CRYPT_ANY_SLOT, passwd, strlen(passwd), CRYPT_ACTIVATE_READONLY); if (slot < 0) { fprintf(stderr, _("Failed to extract LUKS key for \"%s\" (errno=%d)\n"), tgt->ident, -slot); eflag = ERR_BADDECRYPT; goto bail_out; } /* Extract cipher-algorithm parameters from LUKS header: */ delta = (crypt_get_data_offset(luks_ctxt) - tgt->start); if (delta >= 0) { tgt->start += delta; if (tgt->length >= 0) tgt->length -= delta; } if (tgt->cipher != NULL) free((void*)tgt->cipher); tgt->cipher = (char*)malloc(namesz); snprintf(tgt->cipher, namesz, "%s-%s", crypt_get_cipher(luks_ctxt), crypt_get_cipher_mode(luks_ctxt)); tgt->ivoffset = crypt_get_iv_offset(luks_ctxt); if (boundtgt->km_data != NULL) free((void*)boundtgt->km_data); luksor = (luks_overrides_t*)malloc(sizeof(luks_overrides_t)); luksor->keyslot = slot; boundtgt->km_data = (void*)luksor; /* Take copy of LUKS master-key: */ *key = (uint8_t*)sec_realloc((void*)*key, lcs_keylen); crypt_volume_key_get(luks_ctxt, slot, (char*)*key, &lcs_keylen, passwd, strlen(passwd)); *keylen = lcs_keylen; bail_out: crypt_deactivate(luks_ctxt, label); crypt_free(luks_ctxt); udev_settle(); if (passwd != NULL) sec_free((void*)passwd); return eflag; } static int kmluks_put_key(bound_tgtdefn_t *boundtgt, const km_pw_context_t *pw_ctxt, const uint8_t *key, const int keylen, FILE *fp_key) /** Store or create key in LUKS header */ { const keyinfo_t *keyinfo = &boundtgt->tgt->key; char *passwd = NULL, *ciphername = NULL, *ciphermode = NULL; struct crypt_device *luks_ctxt = NULL; unsigned keyslot = 0; luks_overrides_t *luksor = NULL; int formatting = 0, r, eflag = ERR_NOERROR; formatting = (boundtgt->km_data == NULL) && !kmluks_hdrvalid(fp_key); if (boundtgt->km_data != NULL) { luksor = (luks_overrides_t*)boundtgt->km_data; } if (formatting) { #ifndef TESTING char msgbuff[1024]; snprintf(msgbuff, sizeof(msgbuff), _("Formatting \"%s\", will probably destroy all existing data"), keyinfo->filename); if (!cm_confirm(msgbuff)) { eflag = ERR_ABORT; goto bail_out; } #endif /* !TESTING */ } eflag = km_get_passwd(boundtgt->tgt->ident, pw_ctxt, &passwd, 1, 1); if (eflag != ERR_NOERROR) goto bail_out; if (crypt_init(&luks_ctxt, keyinfo->filename) < 0) { fprintf(stderr, _("Failed to initialize device for LUKS keyfile\n")); eflag = ERR_BADDECRYPT; goto bail_out; } //crypt_set_log_callback(luks_ctxt, kmluks_log, NULL); // FIXME - remove soon if (formatting) { struct crypt_params_luks1 luks_params = { boundtgt->tgt->key.digestalg, 0, NULL }; kmluks_splitmode(boundtgt->tgt->cipher, &ciphername, &ciphermode); r = crypt_format(luks_ctxt, CRYPT_LUKS1, ciphername, ciphermode, NULL, (const char*)key, keylen, &luks_params); if (r < 0) { fprintf(stderr, _("Failed to create LUKS header for \"%s\"\n"), boundtgt->tgt->ident); eflag = ERR_BADDEVICE; goto bail_out; } r = crypt_keyslot_add_by_volume_key(luks_ctxt, 0, (const char*)key, keylen, passwd, strlen(passwd)); if (r < 0) { fprintf(stderr, _("Failed to create LUKS key for \"%s\"\n"), boundtgt->tgt->ident); } } else { keyslot = (luksor != NULL ? luksor->keyslot : 0); if (crypt_load(luks_ctxt, NULL, NULL) < 0) { eflag = ERR_BADDEVICE; goto bail_out; } printf(_("Setting password on LUKS keyslot-%u\n"), keyslot); if (kmluks_change_slot_passwd(luks_ctxt, keyslot, key, keylen, passwd) < 0) { char errmsg[256]; crypt_last_error(luks_ctxt, errmsg, sizeof(errmsg)); fprintf(stderr, "LUKS error: %s\n", errmsg); eflag = ERR_BADENCRYPT; goto bail_out; } } bail_out: crypt_free(luks_ctxt); if (passwd != NULL) sec_free((void*)passwd); if (ciphername != NULL) free((void*)ciphername); if (ciphermode != NULL) free((void*)ciphermode); udev_settle(); return eflag; } # ifdef TESTING static int kmluks_test_modesplit() { struct tcase { const char *orig, *cipher, *mode; }; struct tcase tcases[] = { { "", "aes", "cbc-plain" }, { "nothing", "nothing", "cbc-plain" }, { "alg-mode", "alg", "mode" }, { "blowfish-cfb-essiv", "blowfish", "cfb-essiv" }, { "-mode:suffix", "aes", "mode:suffix" }, { NULL, "aes", "cbc-plain" } }; char *head=NULL, *tail=NULL; unsigned idx, cnt; CM_TEST_START("LUKS cipher-mode parsing"); cnt = sizeof(tcases) / sizeof(struct tcase); for (idx=0; idx # Created: 1993-05-16 # Public domain. # # This file is maintained in Automake, please report # bugs to or send patches to # . errstatus=0 dirmode="" usage="\ Usage: mkinstalldirs [-h] [--help] [--version] [-m MODE] DIR ... Create each directory DIR (with mode MODE, if specified), including all leading file name components. Report bugs to ." # process command line arguments while test $# -gt 0 ; do case $1 in -h | --help | --h*) # -h for help echo "$usage" exit 0 ;; -m) # -m PERM arg shift test $# -eq 0 && { echo "$usage" 1>&2; exit 1; } dirmode=$1 shift ;; --version) echo "$0 $scriptversion" exit 0 ;; --) # stop option processing shift break ;; -*) # unknown option echo "$usage" 1>&2 exit 1 ;; *) # first non-opt arg break ;; esac done for file do if test -d "$file"; then shift else break fi done case $# in 0) exit 0 ;; esac # Solaris 8's mkdir -p isn't thread-safe. If you mkdir -p a/b and # mkdir -p a/c at the same time, both will detect that a is missing, # one will create a, then the other will try to create a and die with # a "File exists" error. This is a problem when calling mkinstalldirs # from a parallel make. We use --version in the probe to restrict # ourselves to GNU mkdir, which is thread-safe. case $dirmode in '') if mkdir -p --version . >/dev/null 2>&1 && test ! -d ./--version; then echo "mkdir -p -- $*" exec mkdir -p -- "$@" else # On NextStep and OpenStep, the `mkdir' command does not # recognize any option. It will interpret all options as # directories to create, and then abort because `.' already # exists. test -d ./-p && rmdir ./-p test -d ./--version && rmdir ./--version fi ;; *) if mkdir -m "$dirmode" -p --version . >/dev/null 2>&1 && test ! -d ./--version; then echo "mkdir -m $dirmode -p -- $*" exec mkdir -m "$dirmode" -p -- "$@" else # Clean up after NextStep and OpenStep mkdir. for d in ./-m ./-p ./--version "./$dirmode"; do test -d $d && rmdir $d done fi ;; esac for file do set fnord `echo ":$file" | sed -ne 's/^:\//#/;s/^://;s/\// /g;s/^#/\//;p'` shift pathcomp= for d do pathcomp="$pathcomp$d" case $pathcomp in -*) pathcomp=./$pathcomp ;; esac if test ! -d "$pathcomp"; then echo "mkdir $pathcomp" mkdir "$pathcomp" || lasterr=$? if test ! -d "$pathcomp"; then errstatus=$lasterr else if test ! -z "$dirmode"; then echo "chmod $dirmode $pathcomp" lasterr="" chmod "$dirmode" "$pathcomp" || lasterr=$? if test ! -z "$lasterr"; then errstatus=$lasterr fi fi fi fi pathcomp="$pathcomp/" done done exit $errstatus # Local Variables: # mode: shell-script # sh-indentation: 2 # eval: (add-hook 'write-file-hooks 'time-stamp) # time-stamp-start: "scriptversion=" # time-stamp-format: "%:y-%02m-%02d.%02H" # time-stamp-end: "$" # End: cryptmount-5.2/ABOUT-NLS0000644000175000017500000023334011231412134011751 000000000000001 Notes on the Free Translation Project *************************************** Free software is going international! The Free Translation Project is a way to get maintainers of free software, translators, and users all together, so that free software will gradually become able to speak many languages. A few packages already provide translations for their messages. If you found this `ABOUT-NLS' file inside a distribution, you may assume that the distributed package does use GNU `gettext' internally, itself available at your nearest GNU archive site. But you do _not_ need to install GNU `gettext' prior to configuring, installing or using this package with messages translated. Installers will find here some useful hints. These notes also explain how users should proceed for getting the programs to use the available translations. They tell how people wanting to contribute and work on translations can contact the appropriate team. When reporting bugs in the `intl/' directory or bugs which may be related to internationalization, you should tell about the version of `gettext' which is used. The information can be found in the `intl/VERSION' file, in internationalized packages. 1.1 Quick configuration advice ============================== If you want to exploit the full power of internationalization, you should configure it using ./configure --with-included-gettext to force usage of internationalizing routines provided within this package, despite the existence of internationalizing capabilities in the operating system where this package is being installed. So far, only the `gettext' implementation in the GNU C library version 2 provides as many features (such as locale alias, message inheritance, automatic charset conversion or plural form handling) as the implementation here. It is also not possible to offer this additional functionality on top of a `catgets' implementation. Future versions of GNU `gettext' will very likely convey even more functionality. So it might be a good idea to change to GNU `gettext' as soon as possible. So you need _not_ provide this option if you are using GNU libc 2 or you have installed a recent copy of the GNU gettext package with the included `libintl'. 1.2 INSTALL Matters =================== Some packages are "localizable" when properly installed; the programs they contain can be made to speak your own native language. Most such packages use GNU `gettext'. Other packages have their own ways to internationalization, predating GNU `gettext'. By default, this package will be installed to allow translation of messages. It will automatically detect whether the system already provides the GNU `gettext' functions. If not, the included GNU `gettext' library will be used. This library is wholly contained within this package, usually in the `intl/' subdirectory, so prior installation of the GNU `gettext' package is _not_ required. Installers may use special options at configuration time for changing the default behaviour. The commands: ./configure --with-included-gettext ./configure --disable-nls will, respectively, bypass any pre-existing `gettext' to use the internationalizing routines provided within this package, or else, _totally_ disable translation of messages. When you already have GNU `gettext' installed on your system and run configure without an option for your new package, `configure' will probably detect the previously built and installed `libintl.a' file and will decide to use this. This might not be desirable. You should use the more recent version of the GNU `gettext' library. I.e. if the file `intl/VERSION' shows that the library which comes with this package is more recent, you should use ./configure --with-included-gettext to prevent auto-detection. The configuration process will not test for the `catgets' function and therefore it will not be used. The reason is that even an emulation of `gettext' on top of `catgets' could not provide all the extensions of the GNU `gettext' library. Internationalized packages usually have many `po/LL.po' files, where LL gives an ISO 639 two-letter code identifying the language. Unless translations have been forbidden at `configure' time by using the `--disable-nls' switch, all available translations are installed together with the package. However, the environment variable `LINGUAS' may be set, prior to configuration, to limit the installed set. `LINGUAS' should then contain a space separated list of two-letter codes, stating which languages are allowed. 1.3 Using This Package ====================== As a user, if your language has been installed for this package, you only have to set the `LANG' environment variable to the appropriate `LL_CC' combination. Here `LL' is an ISO 639 two-letter language code, and `CC' is an ISO 3166 two-letter country code. For example, let's suppose that you speak German and live in Germany. At the shell prompt, merely execute `setenv LANG de_DE' (in `csh'), `export LANG; LANG=de_DE' (in `sh') or `export LANG=de_DE' (in `bash'). This can be done from your `.login' or `.profile' file, once and for all. You might think that the country code specification is redundant. But in fact, some languages have dialects in different countries. For example, `de_AT' is used for Austria, and `pt_BR' for Brazil. The country code serves to distinguish the dialects. The locale naming convention of `LL_CC', with `LL' denoting the language and `CC' denoting the country, is the one use on systems based on GNU libc. On other systems, some variations of this scheme are used, such as `LL' or `LL_CC.ENCODING'. You can get the list of locales supported by your system for your language by running the command `locale -a | grep '^LL''. Not all programs have translations for all languages. By default, an English message is shown in place of a nonexistent translation. If you understand other languages, you can set up a priority list of languages. This is done through a different environment variable, called `LANGUAGE'. GNU `gettext' gives preference to `LANGUAGE' over `LANG' for the purpose of message handling, but you still need to have `LANG' set to the primary language; this is required by other parts of the system libraries. For example, some Swedish users who would rather read translations in German than English for when Swedish is not available, set `LANGUAGE' to `sv:de' while leaving `LANG' to `sv_SE'. Special advice for Norwegian users: The language code for Norwegian bokma*l changed from `no' to `nb' recently (in 2003). During the transition period, while some message catalogs for this language are installed under `nb' and some older ones under `no', it's recommended for Norwegian users to set `LANGUAGE' to `nb:no' so that both newer and older translations are used. In the `LANGUAGE' environment variable, but not in the `LANG' environment variable, `LL_CC' combinations can be abbreviated as `LL' to denote the language's main dialect. For example, `de' is equivalent to `de_DE' (German as spoken in Germany), and `pt' to `pt_PT' (Portuguese as spoken in Portugal) in this context. 1.4 Translating Teams ===================== For the Free Translation Project to be a success, we need interested people who like their own language and write it well, and who are also able to synergize with other translators speaking the same language. Each translation team has its own mailing list. The up-to-date list of teams can be found at the Free Translation Project's homepage, `http://www.iro.umontreal.ca/contrib/po/HTML/', in the "National teams" area. If you'd like to volunteer to _work_ at translating messages, you should become a member of the translating team for your own language. The subscribing address is _not_ the same as the list itself, it has `-request' appended. For example, speakers of Swedish can send a message to `sv-request@li.org', having this message body: subscribe Keep in mind that team members are expected to participate _actively_ in translations, or at solving translational difficulties, rather than merely lurking around. If your team does not exist yet and you want to start one, or if you are unsure about what to do or how to get started, please write to `translation@iro.umontreal.ca' to reach the coordinator for all translator teams. The English team is special. It works at improving and uniformizing the terminology in use. Proven linguistic skills are praised more than programming skills, here. 1.5 Available Packages ====================== Languages are not equally supported in all packages. The following matrix shows the current state of internationalization, as of October 2006. The matrix shows, in regard of each package, for which languages PO files have been submitted to translation coordination, with a translation percentage of at least 50%. Ready PO files af am ar az be bg bs ca cs cy da de el en en_GB eo +----------------------------------------------------+ GNUnet | [] | a2ps | [] [] [] [] [] | aegis | () | ant-phone | () | anubis | [] | ap-utils | | aspell | [] [] [] [] [] | bash | [] [] [] | batchelor | [] | bfd | | bibshelf | [] | binutils | [] | bison | [] [] | bison-runtime | | bluez-pin | [] [] [] [] [] | cflow | [] | clisp | [] [] | console-tools | [] [] | coreutils | [] [] [] | cpio | | cpplib | [] [] [] | cryptonit | [] | darkstat | [] () [] | dialog | [] [] [] [] [] [] | diffutils | [] [] [] [] [] [] | doodle | [] | e2fsprogs | [] [] | enscript | [] [] [] [] | error | [] [] [] [] | fetchmail | [] [] () [] | fileutils | [] [] | findutils | [] [] [] | flex | [] [] [] | fslint | [] | gas | | gawk | [] [] [] | gbiff | [] | gcal | [] | gcc | [] | gettext-examples | [] [] [] [] [] | gettext-runtime | [] [] [] [] [] | gettext-tools | [] [] | gimp-print | [] [] [] [] | gip | [] | gliv | [] | glunarclock | [] | gmult | [] [] | gnubiff | () | gnucash | () () [] | gnucash-glossary | [] () | gnuedu | | gnulib | [] [] [] [] [] [] | gnunet-gtk | | gnutls | | gpe-aerial | [] [] | gpe-beam | [] [] | gpe-calendar | | gpe-clock | [] [] | gpe-conf | [] [] | gpe-contacts | | gpe-edit | [] | gpe-filemanager | | gpe-go | [] | gpe-login | [] [] | gpe-ownerinfo | [] [] | gpe-package | | gpe-sketchbook | [] [] | gpe-su | [] [] | gpe-taskmanager | [] [] | gpe-timesheet | [] | gpe-today | [] [] | gpe-todo | | gphoto2 | [] [] [] [] | gprof | [] [] | gpsdrive | () () | gramadoir | [] [] | grep | [] [] [] [] [] [] | gretl | | gsasl | | gss | | gst-plugins | [] [] [] [] | gst-plugins-base | [] [] [] | gst-plugins-good | [] [] [] [] [] [] [] | gstreamer | [] [] [] [] [] [] [] | gtick | () | gtkam | [] [] [] | gtkorphan | [] [] | gtkspell | [] [] [] [] | gutenprint | [] | hello | [] [] [] [] [] | id-utils | [] [] | impost | | indent | [] [] [] | iso_3166 | [] [] | iso_3166_2 | | iso_4217 | [] | iso_639 | [] [] | jpilot | [] | jtag | | jwhois | | kbd | [] [] [] [] | keytouch | | keytouch-editor | | keytouch-keyboa... | | latrine | () | ld | [] | leafpad | [] [] [] [] [] | libc | [] [] [] [] [] | libexif | [] | libextractor | [] | libgpewidget | [] [] [] | libgpg-error | [] | libgphoto2 | [] [] | libgphoto2_port | [] [] | libgsasl | | libiconv | [] [] | libidn | [] [] | lifelines | [] () | lilypond | [] | lingoteach | | lynx | [] [] [] [] | m4 | [] [] [] [] | mailutils | [] | make | [] [] | man-db | [] () [] [] | minicom | [] [] [] | mysecretdiary | [] [] | nano | [] [] [] | nano_1_0 | [] () [] [] | opcodes | [] | parted | | pilot-qof | [] | psmisc | [] | pwdutils | | python | | qof | | radius | [] | recode | [] [] [] [] [] [] | rpm | [] [] | screem | | scrollkeeper | [] [] [] [] [] [] [] [] | sed | [] [] [] | sh-utils | [] [] | shared-mime-info | [] [] [] [] | sharutils | [] [] [] [] [] [] | shishi | | silky | | skencil | [] () | sketch | [] () | solfege | | soundtracker | [] [] | sp | [] | stardict | [] | system-tools-ba... | [] [] [] [] [] [] [] [] [] | tar | [] | texinfo | [] [] [] | textutils | [] [] [] | tin | () () | tp-robot | [] | tuxpaint | [] [] [] [] [] | unicode-han-tra... | | unicode-transla... | | util-linux | [] [] [] [] | vorbis-tools | [] [] [] [] | wastesedge | () | wdiff | [] [] [] [] | wget | [] [] | xchat | [] [] [] [] [] [] | xkeyboard-config | | xpad | [] [] | +----------------------------------------------------+ af am ar az be bg bs ca cs cy da de el en en_GB eo 10 0 1 2 9 22 1 42 41 2 60 95 16 1 17 16 es et eu fa fi fr ga gl gu he hi hr hu id is it +--------------------------------------------------+ GNUnet | | a2ps | [] [] [] () | aegis | | ant-phone | [] | anubis | [] | ap-utils | [] [] | aspell | [] [] [] | bash | [] [] [] | batchelor | [] [] | bfd | [] | bibshelf | [] [] [] | binutils | [] [] [] | bison | [] [] [] [] [] [] | bison-runtime | [] [] [] [] [] | bluez-pin | [] [] [] [] [] | cflow | [] | clisp | [] [] | console-tools | | coreutils | [] [] [] [] [] [] | cpio | [] [] [] | cpplib | [] [] | cryptonit | [] | darkstat | [] () [] [] [] | dialog | [] [] [] [] [] [] [] [] | diffutils | [] [] [] [] [] [] [] [] [] | doodle | [] [] | e2fsprogs | [] [] [] | enscript | [] [] [] | error | [] [] [] [] [] | fetchmail | [] | fileutils | [] [] [] [] [] [] | findutils | [] [] [] [] | flex | [] [] [] | fslint | [] | gas | [] [] | gawk | [] [] [] [] | gbiff | [] | gcal | [] [] | gcc | [] | gettext-examples | [] [] [] [] [] [] | gettext-runtime | [] [] [] [] [] [] | gettext-tools | [] [] [] | gimp-print | [] [] | gip | [] [] [] | gliv | () | glunarclock | [] [] [] | gmult | [] [] [] | gnubiff | () () | gnucash | () () () | gnucash-glossary | [] [] | gnuedu | [] | gnulib | [] [] [] [] [] [] [] [] | gnunet-gtk | | gnutls | | gpe-aerial | [] [] | gpe-beam | [] [] | gpe-calendar | | gpe-clock | [] [] [] [] | gpe-conf | [] | gpe-contacts | [] [] | gpe-edit | [] [] [] [] | gpe-filemanager | [] | gpe-go | [] [] [] | gpe-login | [] [] [] | gpe-ownerinfo | [] [] [] [] [] | gpe-package | [] | gpe-sketchbook | [] [] | gpe-su | [] [] [] [] | gpe-taskmanager | [] [] [] | gpe-timesheet | [] [] [] [] | gpe-today | [] [] [] [] | gpe-todo | [] | gphoto2 | [] [] [] [] [] | gprof | [] [] [] [] | gpsdrive | () () [] () | gramadoir | [] [] | grep | [] [] [] [] [] [] [] [] [] [] [] [] | gretl | [] [] [] | gsasl | [] [] | gss | [] | gst-plugins | [] [] [] | gst-plugins-base | [] [] | gst-plugins-good | [] [] [] | gstreamer | [] [] [] | gtick | [] | gtkam | [] [] [] [] | gtkorphan | [] [] | gtkspell | [] [] [] [] [] [] | gutenprint | [] | hello | [] [] [] [] [] [] [] [] [] [] [] [] [] | id-utils | [] [] [] [] [] | impost | [] [] | indent | [] [] [] [] [] [] [] [] [] [] | iso_3166 | [] [] [] | iso_3166_2 | [] | iso_4217 | [] [] [] [] | iso_639 | [] [] [] [] [] | jpilot | [] [] | jtag | [] | jwhois | [] [] [] [] [] | kbd | [] [] | keytouch | [] | keytouch-editor | [] | keytouch-keyboa... | [] | latrine | [] [] [] | ld | [] [] | leafpad | [] [] [] [] [] [] | libc | [] [] [] [] [] | libexif | [] | libextractor | [] | libgpewidget | [] [] [] [] [] | libgpg-error | | libgphoto2 | [] [] [] | libgphoto2_port | [] [] | libgsasl | [] [] | libiconv | [] [] | libidn | [] [] | lifelines | () | lilypond | [] | lingoteach | [] [] [] | lynx | [] [] [] | m4 | [] [] [] [] | mailutils | [] [] | make | [] [] [] [] [] [] [] [] | man-db | () | minicom | [] [] [] [] | mysecretdiary | [] [] [] | nano | [] [] [] [] [] [] | nano_1_0 | [] [] [] [] [] | opcodes | [] [] [] [] | parted | [] [] [] [] | pilot-qof | | psmisc | [] [] [] | pwdutils | | python | | qof | [] | radius | [] [] | recode | [] [] [] [] [] [] [] [] | rpm | [] [] | screem | | scrollkeeper | [] [] [] | sed | [] [] [] [] [] | sh-utils | [] [] [] [] [] [] [] | shared-mime-info | [] [] [] [] [] [] | sharutils | [] [] [] [] [] [] [] [] | shishi | | silky | [] | skencil | [] [] | sketch | [] [] | solfege | [] | soundtracker | [] [] [] | sp | [] | stardict | [] | system-tools-ba... | [] [] [] [] [] [] [] [] | tar | [] [] [] [] [] [] [] | texinfo | [] [] | textutils | [] [] [] [] [] | tin | [] () | tp-robot | [] [] [] [] | tuxpaint | [] [] | unicode-han-tra... | | unicode-transla... | [] [] | util-linux | [] [] [] [] [] [] [] | vorbis-tools | [] [] | wastesedge | () | wdiff | [] [] [] [] [] [] [] [] | wget | [] [] [] [] [] [] [] [] | xchat | [] [] [] [] [] [] [] [] | xkeyboard-config | [] [] [] [] | xpad | [] [] [] | +--------------------------------------------------+ es et eu fa fi fr ga gl gu he hi hr hu id is it 88 22 14 2 40 115 61 14 1 8 1 6 59 31 0 52 ja ko ku ky lg lt lv mk mn ms mt nb ne nl nn no +-------------------------------------------------+ GNUnet | | a2ps | () [] [] () | aegis | () | ant-phone | [] | anubis | [] [] [] | ap-utils | [] | aspell | [] [] | bash | [] | batchelor | [] [] | bfd | | bibshelf | [] | binutils | | bison | [] [] [] | bison-runtime | [] [] [] | bluez-pin | [] [] [] | cflow | | clisp | [] | console-tools | | coreutils | [] | cpio | | cpplib | [] | cryptonit | [] | darkstat | [] [] | dialog | [] [] | diffutils | [] [] [] | doodle | | e2fsprogs | [] | enscript | [] | error | [] | fetchmail | [] [] | fileutils | [] [] | findutils | [] | flex | [] [] | fslint | [] [] | gas | | gawk | [] [] | gbiff | [] | gcal | | gcc | | gettext-examples | [] [] | gettext-runtime | [] [] [] | gettext-tools | [] [] | gimp-print | [] [] | gip | [] [] | gliv | [] | glunarclock | [] [] | gmult | [] [] | gnubiff | | gnucash | () () | gnucash-glossary | [] | gnuedu | | gnulib | [] [] [] [] | gnunet-gtk | | gnutls | | gpe-aerial | [] | gpe-beam | [] | gpe-calendar | [] | gpe-clock | [] [] [] | gpe-conf | [] [] | gpe-contacts | [] | gpe-edit | [] [] [] | gpe-filemanager | [] [] | gpe-go | [] [] [] | gpe-login | [] [] [] | gpe-ownerinfo | [] [] | gpe-package | [] [] | gpe-sketchbook | [] [] | gpe-su | [] [] [] | gpe-taskmanager | [] [] [] [] | gpe-timesheet | [] | gpe-today | [] [] | gpe-todo | [] | gphoto2 | [] [] | gprof | | gpsdrive | () () () | gramadoir | () | grep | [] [] [] [] | gretl | | gsasl | [] | gss | | gst-plugins | [] | gst-plugins-base | | gst-plugins-good | [] | gstreamer | [] | gtick | | gtkam | [] | gtkorphan | [] | gtkspell | [] [] | gutenprint | | hello | [] [] [] [] [] [] | id-utils | [] | impost | | indent | [] [] | iso_3166 | [] | iso_3166_2 | [] | iso_4217 | [] [] [] | iso_639 | [] [] | jpilot | () () () | jtag | | jwhois | [] | kbd | [] | keytouch | [] | keytouch-editor | | keytouch-keyboa... | | latrine | [] | ld | | leafpad | [] [] | libc | [] [] [] [] [] | libexif | | libextractor | | libgpewidget | [] | libgpg-error | | libgphoto2 | [] | libgphoto2_port | [] | libgsasl | [] | libiconv | | libidn | [] [] | lifelines | [] | lilypond | | lingoteach | [] | lynx | [] [] | m4 | [] [] | mailutils | | make | [] [] [] | man-db | () | minicom | [] | mysecretdiary | [] | nano | [] [] [] | nano_1_0 | [] [] [] | opcodes | [] | parted | [] [] | pilot-qof | | psmisc | [] [] [] | pwdutils | | python | | qof | | radius | | recode | [] | rpm | [] [] | screem | [] | scrollkeeper | [] [] [] [] | sed | [] [] | sh-utils | [] [] | shared-mime-info | [] [] [] [] [] | sharutils | [] [] | shishi | | silky | [] | skencil | | sketch | | solfege | | soundtracker | | sp | () | stardict | [] [] | system-tools-ba... | [] [] [] [] | tar | [] [] [] | texinfo | [] [] [] | textutils | [] [] [] | tin | | tp-robot | [] | tuxpaint | [] | unicode-han-tra... | | unicode-transla... | | util-linux | [] [] | vorbis-tools | [] | wastesedge | [] | wdiff | [] [] | wget | [] [] | xchat | [] [] [] [] | xkeyboard-config | [] | xpad | [] [] [] | +-------------------------------------------------+ ja ko ku ky lg lt lv mk mn ms mt nb ne nl nn no 52 24 2 2 1 3 0 2 3 21 0 15 1 97 5 1 nso or pa pl pt pt_BR rm ro ru rw sk sl sq sr sv ta +------------------------------------------------------+ GNUnet | | a2ps | () [] [] [] [] [] [] | aegis | () () | ant-phone | [] [] | anubis | [] [] [] | ap-utils | () | aspell | [] [] | bash | [] [] [] | batchelor | [] [] | bfd | | bibshelf | [] | binutils | [] [] | bison | [] [] [] [] [] | bison-runtime | [] [] [] [] | bluez-pin | [] [] [] [] [] [] [] [] [] | cflow | [] | clisp | [] | console-tools | [] | coreutils | [] [] [] [] | cpio | [] [] [] | cpplib | [] | cryptonit | [] [] | darkstat | [] [] [] [] [] [] | dialog | [] [] [] [] [] [] [] [] [] | diffutils | [] [] [] [] [] [] | doodle | [] [] | e2fsprogs | [] [] | enscript | [] [] [] [] [] | error | [] [] [] [] | fetchmail | [] [] [] | fileutils | [] [] [] [] [] | findutils | [] [] [] [] [] [] | flex | [] [] [] [] [] | fslint | [] [] [] [] | gas | | gawk | [] [] [] [] | gbiff | [] | gcal | [] | gcc | [] | gettext-examples | [] [] [] [] [] [] [] [] | gettext-runtime | [] [] [] [] [] [] [] [] | gettext-tools | [] [] [] [] [] [] [] | gimp-print | [] [] | gip | [] [] [] [] | gliv | [] [] [] [] | glunarclock | [] [] [] [] [] [] | gmult | [] [] [] [] | gnubiff | () | gnucash | () [] | gnucash-glossary | [] [] [] | gnuedu | | gnulib | [] [] [] [] [] | gnunet-gtk | [] | gnutls | [] [] | gpe-aerial | [] [] [] [] [] [] [] | gpe-beam | [] [] [] [] [] [] [] | gpe-calendar | [] | gpe-clock | [] [] [] [] [] [] [] [] | gpe-conf | [] [] [] [] [] [] [] | gpe-contacts | [] [] [] [] [] | gpe-edit | [] [] [] [] [] [] [] [] | gpe-filemanager | [] [] | gpe-go | [] [] [] [] [] [] | gpe-login | [] [] [] [] [] [] [] [] | gpe-ownerinfo | [] [] [] [] [] [] [] [] | gpe-package | [] [] | gpe-sketchbook | [] [] [] [] [] [] [] [] | gpe-su | [] [] [] [] [] [] [] [] | gpe-taskmanager | [] [] [] [] [] [] [] [] | gpe-timesheet | [] [] [] [] [] [] [] [] | gpe-today | [] [] [] [] [] [] [] [] | gpe-todo | [] [] [] [] | gphoto2 | [] [] [] [] [] | gprof | [] [] [] | gpsdrive | [] [] [] | gramadoir | [] [] | grep | [] [] [] [] [] [] [] [] | gretl | [] | gsasl | [] [] [] | gss | [] [] [] | gst-plugins | [] [] [] [] | gst-plugins-base | [] | gst-plugins-good | [] [] [] [] | gstreamer | [] [] [] | gtick | [] | gtkam | [] [] [] [] | gtkorphan | [] | gtkspell | [] [] [] [] [] [] [] [] | gutenprint | [] | hello | [] [] [] [] [] [] [] [] | id-utils | [] [] [] [] | impost | [] | indent | [] [] [] [] [] [] | iso_3166 | [] [] [] [] [] [] | iso_3166_2 | | iso_4217 | [] [] [] [] | iso_639 | [] [] [] [] | jpilot | | jtag | [] | jwhois | [] [] [] [] | kbd | [] [] [] | keytouch | [] | keytouch-editor | [] | keytouch-keyboa... | [] | latrine | [] [] | ld | [] | leafpad | [] [] [] [] [] [] | libc | [] [] [] [] [] | libexif | [] | libextractor | [] [] | libgpewidget | [] [] [] [] [] [] [] | libgpg-error | [] [] | libgphoto2 | [] | libgphoto2_port | [] [] [] | libgsasl | [] [] [] [] | libiconv | [] [] | libidn | [] [] () | lifelines | [] [] | lilypond | | lingoteach | [] | lynx | [] [] [] | m4 | [] [] [] [] [] | mailutils | [] [] [] [] | make | [] [] [] [] | man-db | [] [] | minicom | [] [] [] [] [] | mysecretdiary | [] [] [] [] | nano | [] [] [] | nano_1_0 | [] [] [] [] | opcodes | [] [] | parted | [] | pilot-qof | [] | psmisc | [] [] | pwdutils | [] [] | python | | qof | [] [] | radius | [] [] | recode | [] [] [] [] [] [] [] | rpm | [] [] [] [] | screem | | scrollkeeper | [] [] [] [] [] [] [] | sed | [] [] [] [] [] [] [] [] [] | sh-utils | [] [] [] | shared-mime-info | [] [] [] [] [] | sharutils | [] [] [] [] | shishi | [] | silky | [] | skencil | [] [] [] | sketch | [] [] [] | solfege | [] | soundtracker | [] [] | sp | | stardict | [] [] [] | system-tools-ba... | [] [] [] [] [] [] [] [] [] | tar | [] [] [] [] [] | texinfo | [] [] [] [] | textutils | [] [] [] | tin | () | tp-robot | [] | tuxpaint | [] [] [] [] [] | unicode-han-tra... | | unicode-transla... | | util-linux | [] [] [] [] | vorbis-tools | [] [] | wastesedge | | wdiff | [] [] [] [] [] [] | wget | [] [] [] [] | xchat | [] [] [] [] [] [] [] | xkeyboard-config | [] [] | xpad | [] [] [] | +------------------------------------------------------+ nso or pa pl pt pt_BR rm ro ru rw sk sl sq sr sv ta 0 2 3 58 30 54 5 73 72 4 40 46 11 50 128 2 tg th tk tr uk ven vi wa xh zh_CN zh_HK zh_TW zu +---------------------------------------------------+ GNUnet | [] | 2 a2ps | [] [] [] | 19 aegis | | 0 ant-phone | [] [] | 6 anubis | [] [] [] | 11 ap-utils | () [] | 4 aspell | [] [] [] | 15 bash | [] | 11 batchelor | [] [] | 9 bfd | | 1 bibshelf | [] | 7 binutils | [] [] [] | 9 bison | [] [] [] | 19 bison-runtime | [] [] [] | 15 bluez-pin | [] [] [] [] [] [] | 28 cflow | [] [] | 5 clisp | | 6 console-tools | [] [] | 5 coreutils | [] [] | 16 cpio | [] [] [] | 9 cpplib | [] [] [] [] | 11 cryptonit | | 5 darkstat | [] () () | 15 dialog | [] [] [] [] [] | 30 diffutils | [] [] [] [] | 28 doodle | [] | 6 e2fsprogs | [] [] | 10 enscript | [] [] [] | 16 error | [] [] [] [] | 18 fetchmail | [] [] | 12 fileutils | [] [] [] | 18 findutils | [] [] [] | 17 flex | [] [] | 15 fslint | [] | 9 gas | [] | 3 gawk | [] [] | 15 gbiff | [] | 5 gcal | [] | 5 gcc | [] [] [] | 6 gettext-examples | [] [] [] [] [] [] | 27 gettext-runtime | [] [] [] [] [] [] | 28 gettext-tools | [] [] [] [] [] | 19 gimp-print | [] [] | 12 gip | [] [] | 12 gliv | [] [] | 8 glunarclock | [] [] [] | 15 gmult | [] [] [] [] | 15 gnubiff | [] | 1 gnucash | () | 2 gnucash-glossary | [] [] | 9 gnuedu | [] | 2 gnulib | [] [] [] [] [] | 28 gnunet-gtk | | 1 gnutls | | 2 gpe-aerial | [] [] | 14 gpe-beam | [] [] | 14 gpe-calendar | [] | 3 gpe-clock | [] [] [] [] | 21 gpe-conf | [] [] | 14 gpe-contacts | [] [] | 10 gpe-edit | [] [] [] [] | 20 gpe-filemanager | [] | 6 gpe-go | [] [] | 15 gpe-login | [] [] [] [] [] | 21 gpe-ownerinfo | [] [] [] [] | 21 gpe-package | [] | 6 gpe-sketchbook | [] [] | 16 gpe-su | [] [] [] | 20 gpe-taskmanager | [] [] [] | 20 gpe-timesheet | [] [] [] [] | 18 gpe-today | [] [] [] [] [] | 21 gpe-todo | [] | 7 gphoto2 | [] [] [] [] | 20 gprof | [] [] | 11 gpsdrive | | 4 gramadoir | [] | 7 grep | [] [] [] [] | 34 gretl | | 4 gsasl | [] [] | 8 gss | [] | 5 gst-plugins | [] [] [] | 15 gst-plugins-base | [] [] [] | 9 gst-plugins-good | [] [] [] [] [] | 20 gstreamer | [] [] [] | 17 gtick | [] | 3 gtkam | [] | 13 gtkorphan | [] | 7 gtkspell | [] [] [] [] [] [] | 26 gutenprint | | 3 hello | [] [] [] [] [] | 37 id-utils | [] [] | 14 impost | [] | 4 indent | [] [] [] [] | 25 iso_3166 | [] [] [] [] | 16 iso_3166_2 | | 2 iso_4217 | [] [] | 14 iso_639 | [] | 14 jpilot | [] [] [] [] | 7 jtag | [] | 3 jwhois | [] [] [] | 13 kbd | [] [] | 12 keytouch | [] | 4 keytouch-editor | | 2 keytouch-keyboa... | [] | 3 latrine | [] [] | 8 ld | [] [] [] [] | 8 leafpad | [] [] [] [] | 23 libc | [] [] [] | 23 libexif | [] | 4 libextractor | [] | 5 libgpewidget | [] [] [] | 19 libgpg-error | [] | 4 libgphoto2 | [] | 8 libgphoto2_port | [] [] [] | 11 libgsasl | [] | 8 libiconv | [] | 7 libidn | [] [] | 10 lifelines | | 4 lilypond | | 2 lingoteach | [] | 6 lynx | [] [] [] | 15 m4 | [] [] [] | 18 mailutils | [] | 8 make | [] [] [] | 20 man-db | [] | 6 minicom | [] | 14 mysecretdiary | [] [] | 12 nano | [] [] | 17 nano_1_0 | [] [] [] | 18 opcodes | [] [] | 10 parted | [] [] [] | 10 pilot-qof | [] | 3 psmisc | [] | 10 pwdutils | [] | 3 python | | 0 qof | [] | 4 radius | [] | 6 recode | [] [] [] | 25 rpm | [] [] [] [] | 14 screem | [] | 2 scrollkeeper | [] [] [] [] | 26 sed | [] [] [] | 22 sh-utils | [] | 15 shared-mime-info | [] [] [] [] | 24 sharutils | [] [] [] | 23 shishi | | 1 silky | [] | 4 skencil | [] | 7 sketch | | 6 solfege | | 2 soundtracker | [] [] | 9 sp | [] | 3 stardict | [] [] [] [] | 11 system-tools-ba... | [] [] [] [] [] [] [] | 37 tar | [] [] [] [] | 20 texinfo | [] [] [] | 15 textutils | [] [] [] | 17 tin | | 1 tp-robot | [] [] [] | 10 tuxpaint | [] [] [] | 16 unicode-han-tra... | | 0 unicode-transla... | | 2 util-linux | [] [] [] | 20 vorbis-tools | [] [] | 11 wastesedge | | 1 wdiff | [] [] | 22 wget | [] [] [] | 19 xchat | [] [] [] [] | 29 xkeyboard-config | [] [] [] [] | 11 xpad | [] [] [] | 14 +---------------------------------------------------+ 77 teams tg th tk tr uk ven vi wa xh zh_CN zh_HK zh_TW zu 170 domains 0 1 1 77 39 0 136 10 1 48 5 54 0 2028 Some counters in the preceding matrix are higher than the number of visible blocks let us expect. This is because a few extra PO files are used for implementing regional variants of languages, or language dialects. For a PO file in the matrix above to be effective, the package to which it applies should also have been internationalized and distributed as such by its maintainer. There might be an observable lag between the mere existence a PO file and its wide availability in a distribution. If October 2006 seems to be old, you may fetch a more recent copy of this `ABOUT-NLS' file on most GNU archive sites. The most up-to-date matrix with full percentage details can be found at `http://www.iro.umontreal.ca/contrib/po/HTML/matrix.html'. 1.6 Using `gettext' in new packages =================================== If you are writing a freely available program and want to internationalize it you are welcome to use GNU `gettext' in your package. Of course you have to respect the GNU Library General Public License which covers the use of the GNU `gettext' library. This means in particular that even non-free programs can use `libintl' as a shared library, whereas only free software can use `libintl' as a static library or use modified versions of `libintl'. Once the sources are changed appropriately and the setup can handle the use of `gettext' the only thing missing are the translations. The Free Translation Project is also available for packages which are not developed inside the GNU project. Therefore the information given above applies also for every other Free Software Project. Contact `translation@iro.umontreal.ca' to make the `.pot' files available to the translation teams. cryptmount-5.2/README.OpenSSL0000644000175000017500000001116411402211766012672 00000000000000 cryptmount usage of the OpenSSL cryptographic library RW Penney, July 2007 Introduction ============ Since the earliest versions of cryptmount, the package has benefited enormously from the availability of the OpenSSL cryptographic library. This library has provided a secure means of storing filesystem access keys. Moreover, this has provided compatibility with the 'openssl' command-line tool, allowing cryptmount keys to be manipulated outside cryptmount. Since mid-2006, cryptmount has added support for access-keys protected via the GNU/libgcrypt library, and more recently has directly incorporated implementations of the Blowfish & SHA1 cryptographic algorithms. Despite the power offered by the OpenSSL library, the licencing position of cryptmount is made more complicated by using the OpenSSL library within an application released under the GNU General Public License (GPL2). Although the advice published at http://www.openssl.org/support/faq.html#LEGAL2 recognizes this as accepted "on many systems including the major Linux and BSD distributions", this position is open to disagreement. In order to clarify the licencing position of cryptmount, a decision has been taken to REMOVE SUPPORT FOR USING THE OpenSSL LIBRARY from cryptmount-3.0 and subsequent releases. Naturally, this decision has been taken with regret, while greatly respecting the considerable role the OpenSSL library has played in cryptmount's evolution. Migration plans =============== In order to minimize the impact of removing support for the OpenSSL library, additional functionality is being added elsewhere within cryptmount starting with release 2.1: * Support for OpenSSL file-formats via the libgcrypt library * A new '--reuse-key' option for translating between key-formats It is expected that the OpenSSL compatibility layer provided via the libgcrypt library will allow the majority of cryptmount users who are already using OpenSSL key-files to migrate transparently to using libgcrypt in place of the OpenSSL library. There are, however, some differences between the functionality offered by these two libraries that may cause difficulties for a small minority of users who have chosen certain cipher/digest options within OpenSSL. In cases where it is necessary to change from an existing OpenSSL key-file to another key-format supported by cryptmount without recreating the associated encrypted filesystem, the '--reuse-key' option can be used by the system-administrator to preserve the same access key, but within a different file-format. In outline, for an existing crypmount target called 'OLD_TARGET', this will involve the following steps: - Ensuring you have available a version of cryptmount (e.g. 2.1, 2.2) which supports all the keyformats used by your existing encrypted filesystems - Creating a new cryptmount target in the cmtab, using the same parameters as OLD_TARGET, but with a different target-name ('NEW_TARGET'), a new key-filename & different keyformat (e.g. 'libgcrypt') - Using 'cryptmount --reuse-key OLD_TARGET NEW_TARGET' to migrate the key from OLD_TARGET to NEW_TARGET - Confirming that 'cryptmount NEW_TARGET' allows the old filesystem to be mounted correctly - Removing the OLD_TARGET entry within the cmtab A third option involves using the command-line 'openssl' program to extract an existing access-key and then re-encrypt it, again using 'openssl', to use a cipher & message-digest (e.g. aes-256-cbc & sha1) that are suppored by cryptmount's libgcrypt compatibility layer. OpenSSL key-format support via libgcrypt ======================================== If cryptmount is configured with the '--with-libgcrypt' option, a compatibility layer is provided for reading keys stored within files created by the OpenSSL library and 'openssl' command-line application. This compatibility-layer can be associated with any cryptmount filesystem by using 'keyformat=openssl-compat' as part of the filesystem's entry within the cmtab (see 'man 5 cmtab'). The following cipher & digest algorithm options within OpenSSL are known to work transparently with this compatibility layer: aes128, aes-128-cbc, aes192, aes192-cbc, aes-192-ecb, aes256, aes-256-cbc bf, bf-cbc, blowfish cast, cast5 des md4, md5, sha1, rmd160 The following cipher & digest algorithm options within OpenSSL are known to cause problems with the compatibility layer: *-cfb (Ciphers operated in cipher-feedback mode do not appear to operate consistently.) rc2 rc2-* rc4 rc4-* (These ciphers are not supported by libgcrypt) md2 (This digest is not supported by libgcrypt) sha (This digest is not supported by libgcrypt) cryptmount-5.2/Makefile.in0000644000175000017500000007741712613124571012614 00000000000000# Makefile.in generated by automake 1.14.1 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2013 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ # automake script for 'cryptmount' # RW Penney, November 2005 VPATH = @srcdir@ am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)' am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ bin_PROGRAMS = cryptmount$(EXEEXT) subdir = . DIST_COMMON = INSTALL NEWS README AUTHORS ChangeLog \ $(srcdir)/Makefile.in $(srcdir)/Makefile.am \ $(top_srcdir)/configure $(am__configure_deps) \ $(srcdir)/config.h.in mkinstalldirs $(srcdir)/delegates.h.in \ $(srcdir)/doxygen.conf.in ABOUT-NLS COPYING compile \ config.guess config.rpath config.sub install-sh missing ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) am__CONFIG_DISTCLEAN_FILES = config.status config.cache config.log \ configure.lineno config.status.lineno mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs CONFIG_HEADER = config.h CONFIG_CLEAN_FILES = delegates.h doxygen.conf CONFIG_CLEAN_VPATH_FILES = am__installdirs = "$(DESTDIR)$(bindir)" PROGRAMS = $(bin_PROGRAMS) am_cryptmount_OBJECTS = cryptmount.$(OBJEXT) armour.$(OBJEXT) \ armour-builtin.$(OBJEXT) armour-gcry.$(OBJEXT) \ armour-luks.$(OBJEXT) blowfish.$(OBJEXT) dmutils.$(OBJEXT) \ fsutils.$(OBJEXT) looputils.$(OBJEXT) tables.$(OBJEXT) \ utils.$(OBJEXT) cmtesting.$(OBJEXT) cryptmount_OBJECTS = $(am_cryptmount_OBJECTS) am__DEPENDENCIES_1 = @BUILD_LUKSCOMPAT_TRUE@cryptmount_DEPENDENCIES = \ @BUILD_LUKSCOMPAT_TRUE@ $(am__DEPENDENCIES_1) AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = DEFAULT_INCLUDES = -I.@am__isrc@ depcomp = am__depfiles_maybe = COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) AM_V_CC = $(am__v_CC_@AM_V@) am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) am__v_CC_0 = @echo " CC " $@; am__v_CC_1 = CCLD = $(CC) LINK = $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_CCLD = $(am__v_CCLD_@AM_V@) am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) am__v_CCLD_0 = @echo " CCLD " $@; am__v_CCLD_1 = SOURCES = $(cryptmount_SOURCES) DIST_SOURCES = $(cryptmount_SOURCES) RECURSIVE_TARGETS = all-recursive check-recursive cscopelist-recursive \ ctags-recursive dvi-recursive html-recursive info-recursive \ install-data-recursive install-dvi-recursive \ install-exec-recursive install-html-recursive \ install-info-recursive install-pdf-recursive \ install-ps-recursive install-recursive installcheck-recursive \ installdirs-recursive pdf-recursive ps-recursive \ tags-recursive uninstall-recursive am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive \ distclean-recursive maintainer-clean-recursive am__recursive_targets = \ $(RECURSIVE_TARGETS) \ $(RECURSIVE_CLEAN_TARGETS) \ $(am__extra_recursive_targets) AM_RECURSIVE_TARGETS = $(am__recursive_targets:-recursive=) TAGS CTAGS \ cscope distdir dist dist-all distcheck am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) \ $(LISP)config.h.in # Read a list of newline-separated strings from the standard input, # and print each of them once, without duplicates. Input order is # *not* preserved. am__uniquify_input = $(AWK) '\ BEGIN { nonempty = 0; } \ { items[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in items) print i; }; } \ ' # Make sure the list of sources is unique. This is necessary because, # e.g., the same source file might be shared among _SOURCES variables # for different programs/libraries. am__define_uniq_tagged_files = \ list='$(am__tagged_files)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | $(am__uniquify_input)` ETAGS = etags CTAGS = ctags CSCOPE = cscope DIST_SUBDIRS = $(SUBDIRS) DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) distdir = $(PACKAGE)-$(VERSION) top_distdir = $(distdir) am__remove_distdir = \ if test -d "$(distdir)"; then \ find "$(distdir)" -type d ! -perm -200 -exec chmod u+w {} ';' \ && rm -rf "$(distdir)" \ || { sleep 5 && rm -rf "$(distdir)"; }; \ else :; fi am__post_remove_distdir = $(am__remove_distdir) am__relativize = \ dir0=`pwd`; \ sed_first='s,^\([^/]*\)/.*$$,\1,'; \ sed_rest='s,^[^/]*/*,,'; \ sed_last='s,^.*/\([^/]*\)$$,\1,'; \ sed_butlast='s,/*[^/]*$$,,'; \ while test -n "$$dir1"; do \ first=`echo "$$dir1" | sed -e "$$sed_first"`; \ if test "$$first" != "."; then \ if test "$$first" = ".."; then \ dir2=`echo "$$dir0" | sed -e "$$sed_last"`/"$$dir2"; \ dir0=`echo "$$dir0" | sed -e "$$sed_butlast"`; \ else \ first2=`echo "$$dir2" | sed -e "$$sed_first"`; \ if test "$$first2" = "$$first"; then \ dir2=`echo "$$dir2" | sed -e "$$sed_rest"`; \ else \ dir2="../$$dir2"; \ fi; \ dir0="$$dir0"/"$$first"; \ fi; \ fi; \ dir1=`echo "$$dir1" | sed -e "$$sed_rest"`; \ done; \ reldir="$$dir2" DIST_ARCHIVES = $(distdir).tar.gz GZIP_ENV = --best DIST_TARGETS = dist-gzip distuninstallcheck_listfiles = find . -type f -print am__distuninstallcheck_listfiles = $(distuninstallcheck_listfiles) \ | sed 's|^\./|$(prefix)/|' | grep -v '$(infodir)/dir$$' distcleancheck_listfiles = find . -type f -print ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CFLAGS = @CFLAGS@ CM_DEFAULT_CIPHER = @CM_DEFAULT_CIPHER@ CM_DEFAULT_SUPATH = @CM_DEFAULT_SUPATH@ CM_SYSCONF_DIR = @CM_SYSCONF_DIR@ CM_SYSRUN_DIR = @CM_SYSRUN_DIR@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DOXYGEN_DOCDIR = @DOXYGEN_DOCDIR@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ ERSATZ_MOUNT = @ERSATZ_MOUNT@ ERSATZ_UMOUNT = @ERSATZ_UMOUNT@ EXEEXT = @EXEEXT@ GETTEXT_MACRO_VERSION = @GETTEXT_MACRO_VERSION@ GMSGFMT = @GMSGFMT@ GMSGFMT_015 = @GMSGFMT_015@ GREP = @GREP@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ INTLLIBS = @INTLLIBS@ INTL_MACOSX_LIBS = @INTL_MACOSX_LIBS@ LDFLAGS = @LDFLAGS@ LIBICONV = @LIBICONV@ LIBINTL = @LIBINTL@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBS_GCRY = @LIBS_GCRY@ LIBS_LUKS = @LIBS_LUKS@ LTLIBICONV = @LTLIBICONV@ LTLIBINTL = @LTLIBINTL@ LTLIBOBJS = @LTLIBOBJS@ MAKEINFO = @MAKEINFO@ MKDIR_P = @MKDIR_P@ MSGFMT = @MSGFMT@ MSGFMT_015 = @MSGFMT_015@ MSGMERGE = @MSGMERGE@ OBJEXT = @OBJEXT@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_FSCK = @PATH_FSCK@ PATH_MKSWAP = @PATH_MKSWAP@ PATH_MOUNT = @PATH_MOUNT@ PATH_SEPARATOR = @PATH_SEPARATOR@ PATH_UMOUNT = @PATH_UMOUNT@ PKG_CONFIG = @PKG_CONFIG@ PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ POSUB = @POSUB@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ USE_NLS = @USE_NLS@ VERSION = @VERSION@ WITH_CSWAP = @WITH_CSWAP@ WITH_FSCK = @WITH_FSCK@ XGETTEXT = @XGETTEXT@ XGETTEXT_015 = @XGETTEXT_015@ XGETTEXT_EXTRA_OPTIONS = @XGETTEXT_EXTRA_OPTIONS@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_CC = @ac_ct_CC@ am__leading_dot = @am__leading_dot@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libcryptsetup_CFLAGS = @libcryptsetup_CFLAGS@ libcryptsetup_LIBS = @libcryptsetup_LIBS@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = $(datadir)/locale localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ use_doxygen = @use_doxygen@ AM_CPPFLAGS = -DCM_SYSCONF_DIR="\"$(CM_SYSCONF_DIR)\"" \ -DCM_SYSRUN_DIR="\"$(CM_SYSRUN_DIR)\"" \ -DLOCALEDIR=\"$(localedir)\" cryptmount_SOURCES = cryptmount.c cryptmount.h \ armour.c armour.h \ armour-builtin.c armour-gcry.c armour-luks.c \ blowfish.c blowfish.h \ dmutils.c dmutils.h \ fsutils.c fsutils.h \ looputils.c looputils.h \ tables.c tables.h \ utils.c utils.h \ cmtesting.c cmtesting.h cryptmount_NONHEADERS = $(shell echo "${cryptmount_SOURCES}" | sed 's%\<[^ ]*\.h\>%%g') @BUILD_LUKSCOMPAT_TRUE@cryptmount_LDADD = ${libcryptsetup_LIBS} EXTRA_DIST = config.rpath mkinstalldirs cmtab.example \ README.OpenSSL README.sshfs RELNOTES ToDo cryptmount.spec \ debian/changelog debian/compat debian/control \ debian/copyright debian/docs \ debian/rules debian/cryptmount.lintian-overrides \ debian/postinst debian/postrm debian/watch debian/source/format \ debian/upstream/signing-key.asc SUBDIRS = man po sysinit testing all: config.h $(MAKE) $(AM_MAKEFLAGS) all-recursive .SUFFIXES: .SUFFIXES: .c .o .obj am--refresh: Makefile @: $(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ echo ' cd $(srcdir) && $(AUTOMAKE) --gnu --ignore-deps'; \ $(am__cd) $(srcdir) && $(AUTOMAKE) --gnu --ignore-deps \ && exit 0; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu --ignore-deps Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu --ignore-deps Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ echo ' $(SHELL) ./config.status'; \ $(SHELL) ./config.status;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) $(SHELL) ./config.status --recheck $(top_srcdir)/configure: $(am__configure_deps) $(am__cd) $(srcdir) && $(AUTOCONF) $(ACLOCAL_M4): $(am__aclocal_m4_deps) $(am__cd) $(srcdir) && $(ACLOCAL) $(ACLOCAL_AMFLAGS) $(am__aclocal_m4_deps): config.h: stamp-h1 @test -f $@ || rm -f stamp-h1 @test -f $@ || $(MAKE) $(AM_MAKEFLAGS) stamp-h1 stamp-h1: $(srcdir)/config.h.in $(top_builddir)/config.status @rm -f stamp-h1 cd $(top_builddir) && $(SHELL) ./config.status config.h $(srcdir)/config.h.in: $(am__configure_deps) ($(am__cd) $(top_srcdir) && $(AUTOHEADER)) rm -f stamp-h1 touch $@ distclean-hdr: -rm -f config.h stamp-h1 delegates.h: $(top_builddir)/config.status $(srcdir)/delegates.h.in cd $(top_builddir) && $(SHELL) ./config.status $@ doxygen.conf: $(top_builddir)/config.status $(srcdir)/doxygen.conf.in cd $(top_builddir) && $(SHELL) ./config.status $@ install-binPROGRAMS: $(bin_PROGRAMS) @$(NORMAL_INSTALL) @list='$(bin_PROGRAMS)'; test -n "$(bindir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(bindir)'"; \ $(MKDIR_P) "$(DESTDIR)$(bindir)" || exit 1; \ fi; \ for p in $$list; do echo "$$p $$p"; done | \ sed 's/$(EXEEXT)$$//' | \ while read p p1; do if test -f $$p \ ; then echo "$$p"; echo "$$p"; else :; fi; \ done | \ sed -e 'p;s,.*/,,;n;h' \ -e 's|.*|.|' \ -e 'p;x;s,.*/,,;s/$(EXEEXT)$$//;$(transform);s/$$/$(EXEEXT)/' | \ sed 'N;N;N;s,\n, ,g' | \ $(AWK) 'BEGIN { files["."] = ""; dirs["."] = 1 } \ { d=$$3; if (dirs[d] != 1) { print "d", d; dirs[d] = 1 } \ if ($$2 == $$4) files[d] = files[d] " " $$1; \ else { print "f", $$3 "/" $$4, $$1; } } \ END { for (d in files) print "f", d, files[d] }' | \ while read type dir files; do \ if test "$$dir" = .; then dir=; else dir=/$$dir; fi; \ test -z "$$files" || { \ echo " $(INSTALL_PROGRAM_ENV) $(INSTALL_PROGRAM) $$files '$(DESTDIR)$(bindir)$$dir'"; \ $(INSTALL_PROGRAM_ENV) $(INSTALL_PROGRAM) $$files "$(DESTDIR)$(bindir)$$dir" || exit $$?; \ } \ ; done uninstall-binPROGRAMS: @$(NORMAL_UNINSTALL) @list='$(bin_PROGRAMS)'; test -n "$(bindir)" || list=; \ files=`for p in $$list; do echo "$$p"; done | \ sed -e 'h;s,^.*/,,;s/$(EXEEXT)$$//;$(transform)' \ -e 's/$$/$(EXEEXT)/' \ `; \ test -n "$$list" || exit 0; \ echo " ( cd '$(DESTDIR)$(bindir)' && rm -f" $$files ")"; \ cd "$(DESTDIR)$(bindir)" && rm -f $$files clean-binPROGRAMS: -test -z "$(bin_PROGRAMS)" || rm -f $(bin_PROGRAMS) cryptmount$(EXEEXT): $(cryptmount_OBJECTS) $(cryptmount_DEPENDENCIES) $(EXTRA_cryptmount_DEPENDENCIES) @rm -f cryptmount$(EXEEXT) $(AM_V_CCLD)$(LINK) $(cryptmount_OBJECTS) $(cryptmount_LDADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c .c.o: $(AM_V_CC)$(COMPILE) -c -o $@ $< .c.obj: $(AM_V_CC)$(COMPILE) -c -o $@ `$(CYGPATH_W) '$<'` # This directory's subdirectories are mostly independent; you can cd # into them and run 'make' without going through this Makefile. # To change the values of 'make' variables: instead of editing Makefiles, # (1) if the variable is set in 'config.status', edit 'config.status' # (which will cause the Makefiles to be regenerated when you run 'make'); # (2) otherwise, pass the desired values on the 'make' command line. $(am__recursive_targets): @fail=; \ if $(am__make_keepgoing); then \ failcom='fail=yes'; \ else \ failcom='exit 1'; \ fi; \ dot_seen=no; \ target=`echo $@ | sed s/-recursive//`; \ case "$@" in \ distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \ *) list='$(SUBDIRS)' ;; \ esac; \ for subdir in $$list; do \ echo "Making $$target in $$subdir"; \ if test "$$subdir" = "."; then \ dot_seen=yes; \ local_target="$$target-am"; \ else \ local_target="$$target"; \ fi; \ ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ || eval $$failcom; \ done; \ if test "$$dot_seen" = "no"; then \ $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \ fi; test -z "$$fail" ID: $(am__tagged_files) $(am__define_uniq_tagged_files); mkid -fID $$unique tags: tags-recursive TAGS: tags tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) set x; \ here=`pwd`; \ if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \ include_option=--etags-include; \ empty_fix=.; \ else \ include_option=--include; \ empty_fix=; \ fi; \ list='$(SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ test ! -f $$subdir/TAGS || \ set "$$@" "$$include_option=$$here/$$subdir/TAGS"; \ fi; \ done; \ $(am__define_uniq_tagged_files); \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: ctags-recursive CTAGS: ctags ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) $(am__define_uniq_tagged_files); \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" cscope: cscope.files test ! -s cscope.files \ || $(CSCOPE) -b -q $(AM_CSCOPEFLAGS) $(CSCOPEFLAGS) -i cscope.files $(CSCOPE_ARGS) clean-cscope: -rm -f cscope.files cscope.files: clean-cscope cscopelist cscopelist: cscopelist-recursive cscopelist-am: $(am__tagged_files) list='$(am__tagged_files)'; \ case "$(srcdir)" in \ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ *) sdir=$(subdir)/$(srcdir) ;; \ esac; \ for i in $$list; do \ if test -f "$$i"; then \ echo "$(subdir)/$$i"; \ else \ echo "$$sdir/$$i"; \ fi; \ done >> $(top_builddir)/cscope.files distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags -rm -f cscope.out cscope.in.out cscope.po.out cscope.files distdir: $(DISTFILES) $(am__remove_distdir) test -d "$(distdir)" || mkdir "$(distdir)" @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done @list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ $(am__make_dryrun) \ || test -d "$(distdir)/$$subdir" \ || $(MKDIR_P) "$(distdir)/$$subdir" \ || exit 1; \ dir1=$$subdir; dir2="$(distdir)/$$subdir"; \ $(am__relativize); \ new_distdir=$$reldir; \ dir1=$$subdir; dir2="$(top_distdir)"; \ $(am__relativize); \ new_top_distdir=$$reldir; \ echo " (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) top_distdir="$$new_top_distdir" distdir="$$new_distdir" \\"; \ echo " am__remove_distdir=: am__skip_length_check=: am__skip_mode_fix=: distdir)"; \ ($(am__cd) $$subdir && \ $(MAKE) $(AM_MAKEFLAGS) \ top_distdir="$$new_top_distdir" \ distdir="$$new_distdir" \ am__remove_distdir=: \ am__skip_length_check=: \ am__skip_mode_fix=: \ distdir) \ || exit 1; \ fi; \ done $(MAKE) $(AM_MAKEFLAGS) \ top_distdir="$(top_distdir)" distdir="$(distdir)" \ dist-hook -test -n "$(am__skip_mode_fix)" \ || find "$(distdir)" -type d ! -perm -755 \ -exec chmod u+rwx,go+rx {} \; -o \ ! -type d ! -perm -444 -links 1 -exec chmod a+r {} \; -o \ ! -type d ! -perm -400 -exec chmod a+r {} \; -o \ ! -type d ! -perm -444 -exec $(install_sh) -c -m a+r {} {} \; \ || chmod -R a+r "$(distdir)" dist-gzip: distdir tardir=$(distdir) && $(am__tar) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).tar.gz $(am__post_remove_distdir) dist-bzip2: distdir tardir=$(distdir) && $(am__tar) | BZIP2=$${BZIP2--9} bzip2 -c >$(distdir).tar.bz2 $(am__post_remove_distdir) dist-lzip: distdir tardir=$(distdir) && $(am__tar) | lzip -c $${LZIP_OPT--9} >$(distdir).tar.lz $(am__post_remove_distdir) dist-xz: distdir tardir=$(distdir) && $(am__tar) | XZ_OPT=$${XZ_OPT--e} xz -c >$(distdir).tar.xz $(am__post_remove_distdir) dist-tarZ: distdir @echo WARNING: "Support for shar distribution archives is" \ "deprecated." >&2 @echo WARNING: "It will be removed altogether in Automake 2.0" >&2 tardir=$(distdir) && $(am__tar) | compress -c >$(distdir).tar.Z $(am__post_remove_distdir) dist-shar: distdir @echo WARNING: "Support for distribution archives compressed with" \ "legacy program 'compress' is deprecated." >&2 @echo WARNING: "It will be removed altogether in Automake 2.0" >&2 shar $(distdir) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).shar.gz $(am__post_remove_distdir) dist-zip: distdir -rm -f $(distdir).zip zip -rq $(distdir).zip $(distdir) $(am__post_remove_distdir) dist dist-all: $(MAKE) $(AM_MAKEFLAGS) $(DIST_TARGETS) am__post_remove_distdir='@:' $(am__post_remove_distdir) # This target untars the dist file and tries a VPATH configuration. Then # it guarantees that the distribution is self-contained by making another # tarfile. distcheck: dist case '$(DIST_ARCHIVES)' in \ *.tar.gz*) \ GZIP=$(GZIP_ENV) gzip -dc $(distdir).tar.gz | $(am__untar) ;;\ *.tar.bz2*) \ bzip2 -dc $(distdir).tar.bz2 | $(am__untar) ;;\ *.tar.lz*) \ lzip -dc $(distdir).tar.lz | $(am__untar) ;;\ *.tar.xz*) \ xz -dc $(distdir).tar.xz | $(am__untar) ;;\ *.tar.Z*) \ uncompress -c $(distdir).tar.Z | $(am__untar) ;;\ *.shar.gz*) \ GZIP=$(GZIP_ENV) gzip -dc $(distdir).shar.gz | unshar ;;\ *.zip*) \ unzip $(distdir).zip ;;\ esac chmod -R a-w $(distdir) chmod u+w $(distdir) mkdir $(distdir)/_build $(distdir)/_inst chmod a-w $(distdir) test -d $(distdir)/_build || exit 0; \ dc_install_base=`$(am__cd) $(distdir)/_inst && pwd | sed -e 's,^[^:\\/]:[\\/],/,'` \ && dc_destdir="$${TMPDIR-/tmp}/am-dc-$$$$/" \ && am__cwd=`pwd` \ && $(am__cd) $(distdir)/_build \ && ../configure \ $(AM_DISTCHECK_CONFIGURE_FLAGS) \ $(DISTCHECK_CONFIGURE_FLAGS) \ --srcdir=.. --prefix="$$dc_install_base" \ && $(MAKE) $(AM_MAKEFLAGS) \ && $(MAKE) $(AM_MAKEFLAGS) dvi \ && $(MAKE) $(AM_MAKEFLAGS) check \ && $(MAKE) $(AM_MAKEFLAGS) install \ && $(MAKE) $(AM_MAKEFLAGS) installcheck \ && $(MAKE) $(AM_MAKEFLAGS) uninstall \ && $(MAKE) $(AM_MAKEFLAGS) distuninstallcheck_dir="$$dc_install_base" \ distuninstallcheck \ && chmod -R a-w "$$dc_install_base" \ && ({ \ (cd ../.. && umask 077 && mkdir "$$dc_destdir") \ && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" install \ && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" uninstall \ && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" \ distuninstallcheck_dir="$$dc_destdir" distuninstallcheck; \ } || { rm -rf "$$dc_destdir"; exit 1; }) \ && rm -rf "$$dc_destdir" \ && $(MAKE) $(AM_MAKEFLAGS) dist \ && rm -rf $(DIST_ARCHIVES) \ && $(MAKE) $(AM_MAKEFLAGS) distcleancheck \ && cd "$$am__cwd" \ || exit 1 $(am__post_remove_distdir) @(echo "$(distdir) archives ready for distribution: "; \ list='$(DIST_ARCHIVES)'; for i in $$list; do echo $$i; done) | \ sed -e 1h -e 1s/./=/g -e 1p -e 1x -e '$$p' -e '$$x' distuninstallcheck: @test -n '$(distuninstallcheck_dir)' || { \ echo 'ERROR: trying to run $@ with an empty' \ '$$(distuninstallcheck_dir)' >&2; \ exit 1; \ }; \ $(am__cd) '$(distuninstallcheck_dir)' || { \ echo 'ERROR: cannot chdir into $(distuninstallcheck_dir)' >&2; \ exit 1; \ }; \ test `$(am__distuninstallcheck_listfiles) | wc -l` -eq 0 \ || { echo "ERROR: files left after uninstall:" ; \ if test -n "$(DESTDIR)"; then \ echo " (check DESTDIR support)"; \ fi ; \ $(distuninstallcheck_listfiles) ; \ exit 1; } >&2 distcleancheck: distclean @if test '$(srcdir)' = . ; then \ echo "ERROR: distcleancheck can only run from a VPATH build" ; \ exit 1 ; \ fi @test `$(distcleancheck_listfiles) | wc -l` -eq 0 \ || { echo "ERROR: files left in build directory after distclean:" ; \ $(distcleancheck_listfiles) ; \ exit 1; } >&2 check-am: all-am check: check-recursive all-am: Makefile $(PROGRAMS) config.h installdirs: installdirs-recursive installdirs-am: for dir in "$(DESTDIR)$(bindir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done install: install-recursive install-exec: install-exec-recursive install-data: install-data-recursive uninstall: uninstall-recursive install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-recursive install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-recursive clean-am: clean-binPROGRAMS clean-generic clean-local mostlyclean-am distclean: distclean-recursive -rm -f $(am__CONFIG_DISTCLEAN_FILES) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-hdr distclean-tags dvi: dvi-recursive dvi-am: html: html-recursive html-am: info: info-recursive info-am: install-data-am: install-dvi: install-dvi-recursive install-dvi-am: install-exec-am: install-binPROGRAMS @$(NORMAL_INSTALL) $(MAKE) $(AM_MAKEFLAGS) install-exec-hook install-html: install-html-recursive install-html-am: install-info: install-info-recursive install-info-am: install-man: install-pdf: install-pdf-recursive install-pdf-am: install-ps: install-ps-recursive install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-recursive -rm -f $(am__CONFIG_DISTCLEAN_FILES) -rm -rf $(top_srcdir)/autom4te.cache -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-recursive mostlyclean-am: mostlyclean-compile mostlyclean-generic pdf: pdf-recursive pdf-am: ps: ps-recursive ps-am: uninstall-am: uninstall-binPROGRAMS .MAKE: $(am__recursive_targets) all install-am install-exec-am \ install-strip .PHONY: $(am__recursive_targets) CTAGS GTAGS TAGS all all-am \ am--refresh check check-am clean clean-binPROGRAMS \ clean-cscope clean-generic clean-local cscope cscopelist-am \ ctags ctags-am dist dist-all dist-bzip2 dist-gzip dist-hook \ dist-lzip dist-shar dist-tarZ dist-xz dist-zip distcheck \ distclean distclean-compile distclean-generic distclean-hdr \ distclean-tags distcleancheck distdir distuninstallcheck dvi \ dvi-am html html-am info info-am install install-am \ install-binPROGRAMS install-data install-data-am install-dvi \ install-dvi-am install-exec install-exec-am install-exec-hook \ install-html install-html-am install-info install-info-am \ install-man install-pdf install-pdf-am install-ps \ install-ps-am install-strip installcheck installcheck-am \ installdirs installdirs-am maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-compile \ mostlyclean-generic pdf pdf-am ps ps-am tags tags-am uninstall \ uninstall-am uninstall-binPROGRAMS install-exec-hook: install-etcdir chown root.root $(DESTDIR)$(bindir)/cryptmount$(EXEEXT) chmod u+srwx,go-w,go+r $(DESTDIR)$(bindir)/cryptmount$(EXEEXT) @if test -z "$(DESTDIR)" -o "$(DESTDIR)" = "/"; then \ modprobe -a loop dm-crypt || true; \ ( egrep -q '\' /proc/devices \ && egrep -q '\' /proc/devices ) || \ echo "Warning: kernel support for /dev/loop and /dev/mapper is needed by cryptmount"; \ fi .PHONY: install-etcdir install-etcdir: if test ! -d "${DESTDIR}${CM_SYSCONF_DIR}" ; then \ ${mkdir_p} "${DESTDIR}${CM_SYSCONF_DIR}" ; \ ${INSTALL_PROGRAM_ENV} ${INSTALL_DATA} cmtab.example "${DESTDIR}${CM_SYSCONF_DIR}" ; \ fi if test ! -f "${DESTDIR}${CM_SYSCONF_DIR}/cmtab" ; then \ echo -e "# ${CM_SYSCONF_DIR}/cmtab - encrypted filesystem information for cryptmount\n# try 'man 8 cryptmount' or 'man 5 cmtab' for more details\n" >> "${DESTDIR}${CM_SYSCONF_DIR}/cmtab"; \ fi install-setup: setupscript test -d "${DESTDIR}${sbindir}" || ${mkdir_p} "${DESTDIR}${sbindir}" ${INSTALL_PROGRAM_ENV} ${INSTALL_SCRIPT} setupscript "${DESTDIR}${sbindir}/cryptmount-setup" clean-local: -rm -f splint.log dist-hook: sed -e "s,^\(Version:\s*\)[0-9].*,\1${VERSION}," cryptmount.spec > cm_spec.new; cmp -q cryptmount.spec cm_spec.new || mv cm_spec.new cryptmount.spec; rm -f cm_spec.new pedantic: CFLAGS = -Wall -W -pedantic -g pedantic: ${bin_PROGRAMS} @HAVE_DOXYGEN_TRUE@doxydocs: doxygen.conf @HAVE_DOXYGEN_TRUE@ doxygen doxygen.conf .PHONY: splint splint: @echo -n "" > splint.log for src in ${cryptmount_NONHEADERS}; do \ echo "==== $${src} ====" >> splint.log; \ splint ${DEFS} ${DEFAULT_INCLUDES} ${INCLUDES} ${AM_CPFLAGS} ${CPPFLAGS} -D__signed__="" -posix-lib -checks $${src} >> splint.log 2>&1 ; \ echo -e "\n\n" >> splint.log || true; \ done # 'cmtest' target is for use with 'mudslinger' testing script: cmtest: CFLAGS = -Wall -g -DTESTING -DCM_SRCDIR=\"${abs_srcdir}\" cmtest: ${bin_PROGRAMS} ${MAKE} -C testing autokeys mudslinger .PHONY: depend depend: ${CC} -MM ${DEFS} ${DEFAULT_INCLUDES} ${INCLUDES} ${AM_CPFLAGS} ${CPPFLAGS} ${cryptmount_NONHEADERS} > .depend -include .depend # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: cryptmount-5.2/config.guess0000755000175000017500000012546611216245452013065 00000000000000#! /bin/sh # Attempt to guess a canonical system name. # Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, # 2000, 2001, 2002, 2003, 2004, 2005 Free Software Foundation, Inc. timestamp='2005-04-22' # This file is free software; you can redistribute it and/or modify it # under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU # General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. # # As a special exception to the GNU General Public License, if you # distribute this file as part of a program that contains a # configuration script generated by Autoconf, you may include it under # the same distribution terms that you use for the rest of that program. # Originally written by Per Bothner . # Please send patches to . Submit a context # diff and a properly formatted ChangeLog entry. # # This script attempts to guess a canonical system name similar to # config.sub. If it succeeds, it prints the system name on stdout, and # exits with 0. Otherwise, it exits with 1. # # The plan is that this can be called by configure scripts if you # don't specify an explicit build system type. me=`echo "$0" | sed -e 's,.*/,,'` usage="\ Usage: $0 [OPTION] Output the configuration name of the system \`$me' is run on. Operation modes: -h, --help print this help, then exit -t, --time-stamp print date of last modification, then exit -v, --version print version number, then exit Report bugs and patches to ." version="\ GNU config.guess ($timestamp) Originally written by Per Bothner. Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005 Free Software Foundation, Inc. This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE." help=" Try \`$me --help' for more information." # Parse command line while test $# -gt 0 ; do case $1 in --time-stamp | --time* | -t ) echo "$timestamp" ; exit 0 ;; --version | -v ) echo "$version" ; exit 0 ;; --help | --h* | -h ) echo "$usage"; exit 0 ;; -- ) # Stop option processing shift; break ;; - ) # Use stdin as input. break ;; -* ) echo "$me: invalid option $1$help" >&2 exit 1 ;; * ) break ;; esac done if test $# != 0; then echo "$me: too many arguments$help" >&2 exit 1 fi trap 'exit 1' 1 2 15 # CC_FOR_BUILD -- compiler used by this script. Note that the use of a # compiler to aid in system detection is discouraged as it requires # temporary files to be created and, as you can see below, it is a # headache to deal with in a portable fashion. # Historically, `CC_FOR_BUILD' used to be named `HOST_CC'. We still # use `HOST_CC' if defined, but it is deprecated. # Portable tmp directory creation inspired by the Autoconf team. set_cc_for_build=' trap "exitcode=\$?; (rm -f \$tmpfiles 2>/dev/null; rmdir \$tmp 2>/dev/null) && exit \$exitcode" 0 ; trap "rm -f \$tmpfiles 2>/dev/null; rmdir \$tmp 2>/dev/null; exit 1" 1 2 13 15 ; : ${TMPDIR=/tmp} ; { tmp=`(umask 077 && mktemp -d -q "$TMPDIR/cgXXXXXX") 2>/dev/null` && test -n "$tmp" && test -d "$tmp" ; } || { test -n "$RANDOM" && tmp=$TMPDIR/cg$$-$RANDOM && (umask 077 && mkdir $tmp) ; } || { tmp=$TMPDIR/cg-$$ && (umask 077 && mkdir $tmp) && echo "Warning: creating insecure temp directory" >&2 ; } || { echo "$me: cannot create a temporary directory in $TMPDIR" >&2 ; exit 1 ; } ; dummy=$tmp/dummy ; tmpfiles="$dummy.c $dummy.o $dummy.rel $dummy" ; case $CC_FOR_BUILD,$HOST_CC,$CC in ,,) echo "int x;" > $dummy.c ; for c in cc gcc c89 c99 ; do if ($c -c -o $dummy.o $dummy.c) >/dev/null 2>&1 ; then CC_FOR_BUILD="$c"; break ; fi ; done ; if test x"$CC_FOR_BUILD" = x ; then CC_FOR_BUILD=no_compiler_found ; fi ;; ,,*) CC_FOR_BUILD=$CC ;; ,*,*) CC_FOR_BUILD=$HOST_CC ;; esac ;' # This is needed to find uname on a Pyramid OSx when run in the BSD universe. # (ghazi@noc.rutgers.edu 1994-08-24) if (test -f /.attbin/uname) >/dev/null 2>&1 ; then PATH=$PATH:/.attbin ; export PATH fi UNAME_MACHINE=`(uname -m) 2>/dev/null` || UNAME_MACHINE=unknown UNAME_RELEASE=`(uname -r) 2>/dev/null` || UNAME_RELEASE=unknown UNAME_SYSTEM=`(uname -s) 2>/dev/null` || UNAME_SYSTEM=unknown UNAME_VERSION=`(uname -v) 2>/dev/null` || UNAME_VERSION=unknown # Note: order is significant - the case branches are not exclusive. case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in *:NetBSD:*:*) # NetBSD (nbsd) targets should (where applicable) match one or # more of the tupples: *-*-netbsdelf*, *-*-netbsdaout*, # *-*-netbsdecoff* and *-*-netbsd*. For targets that recently # switched to ELF, *-*-netbsd* would select the old # object file format. This provides both forward # compatibility and a consistent mechanism for selecting the # object file format. # # Note: NetBSD doesn't particularly care about the vendor # portion of the name. We always set it to "unknown". sysctl="sysctl -n hw.machine_arch" UNAME_MACHINE_ARCH=`(/sbin/$sysctl 2>/dev/null || \ /usr/sbin/$sysctl 2>/dev/null || echo unknown)` case "${UNAME_MACHINE_ARCH}" in armeb) machine=armeb-unknown ;; arm*) machine=arm-unknown ;; sh3el) machine=shl-unknown ;; sh3eb) machine=sh-unknown ;; *) machine=${UNAME_MACHINE_ARCH}-unknown ;; esac # The Operating System including object format, if it has switched # to ELF recently, or will in the future. case "${UNAME_MACHINE_ARCH}" in arm*|i386|m68k|ns32k|sh3*|sparc|vax) eval $set_cc_for_build if echo __ELF__ | $CC_FOR_BUILD -E - 2>/dev/null \ | grep __ELF__ >/dev/null then # Once all utilities can be ECOFF (netbsdecoff) or a.out (netbsdaout). # Return netbsd for either. FIX? os=netbsd else os=netbsdelf fi ;; *) os=netbsd ;; esac # The OS release # Debian GNU/NetBSD machines have a different userland, and # thus, need a distinct triplet. However, they do not need # kernel version information, so it can be replaced with a # suitable tag, in the style of linux-gnu. case "${UNAME_VERSION}" in Debian*) release='-gnu' ;; *) release=`echo ${UNAME_RELEASE}|sed -e 's/[-_].*/\./'` ;; esac # Since CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM: # contains redundant information, the shorter form: # CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM is used. echo "${machine}-${os}${release}" exit 0 ;; amd64:OpenBSD:*:*) echo x86_64-unknown-openbsd${UNAME_RELEASE} exit 0 ;; amiga:OpenBSD:*:*) echo m68k-unknown-openbsd${UNAME_RELEASE} exit 0 ;; cats:OpenBSD:*:*) echo arm-unknown-openbsd${UNAME_RELEASE} exit 0 ;; hp300:OpenBSD:*:*) echo m68k-unknown-openbsd${UNAME_RELEASE} exit 0 ;; luna88k:OpenBSD:*:*) echo m88k-unknown-openbsd${UNAME_RELEASE} exit 0 ;; mac68k:OpenBSD:*:*) echo m68k-unknown-openbsd${UNAME_RELEASE} exit 0 ;; macppc:OpenBSD:*:*) echo powerpc-unknown-openbsd${UNAME_RELEASE} exit 0 ;; mvme68k:OpenBSD:*:*) echo m68k-unknown-openbsd${UNAME_RELEASE} exit 0 ;; mvme88k:OpenBSD:*:*) echo m88k-unknown-openbsd${UNAME_RELEASE} exit 0 ;; mvmeppc:OpenBSD:*:*) echo powerpc-unknown-openbsd${UNAME_RELEASE} exit 0 ;; sgi:OpenBSD:*:*) echo mips64-unknown-openbsd${UNAME_RELEASE} exit 0 ;; sun3:OpenBSD:*:*) echo m68k-unknown-openbsd${UNAME_RELEASE} exit 0 ;; *:OpenBSD:*:*) echo ${UNAME_MACHINE}-unknown-openbsd${UNAME_RELEASE} exit 0 ;; *:ekkoBSD:*:*) echo ${UNAME_MACHINE}-unknown-ekkobsd${UNAME_RELEASE} exit 0 ;; macppc:MirBSD:*:*) echo powerppc-unknown-mirbsd${UNAME_RELEASE} exit 0 ;; *:MirBSD:*:*) echo ${UNAME_MACHINE}-unknown-mirbsd${UNAME_RELEASE} exit 0 ;; alpha:OSF1:*:*) case $UNAME_RELEASE in *4.0) UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $3}'` ;; *5.*) UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $4}'` ;; esac # According to Compaq, /usr/sbin/psrinfo has been available on # OSF/1 and Tru64 systems produced since 1995. I hope that # covers most systems running today. This code pipes the CPU # types through head -n 1, so we only detect the type of CPU 0. ALPHA_CPU_TYPE=`/usr/sbin/psrinfo -v | sed -n -e 's/^ The alpha \(.*\) processor.*$/\1/p' | head -n 1` case "$ALPHA_CPU_TYPE" in "EV4 (21064)") UNAME_MACHINE="alpha" ;; "EV4.5 (21064)") UNAME_MACHINE="alpha" ;; "LCA4 (21066/21068)") UNAME_MACHINE="alpha" ;; "EV5 (21164)") UNAME_MACHINE="alphaev5" ;; "EV5.6 (21164A)") UNAME_MACHINE="alphaev56" ;; "EV5.6 (21164PC)") UNAME_MACHINE="alphapca56" ;; "EV5.7 (21164PC)") UNAME_MACHINE="alphapca57" ;; "EV6 (21264)") UNAME_MACHINE="alphaev6" ;; "EV6.7 (21264A)") UNAME_MACHINE="alphaev67" ;; "EV6.8CB (21264C)") UNAME_MACHINE="alphaev68" ;; "EV6.8AL (21264B)") UNAME_MACHINE="alphaev68" ;; "EV6.8CX (21264D)") UNAME_MACHINE="alphaev68" ;; "EV6.9A (21264/EV69A)") UNAME_MACHINE="alphaev69" ;; "EV7 (21364)") UNAME_MACHINE="alphaev7" ;; "EV7.9 (21364A)") UNAME_MACHINE="alphaev79" ;; esac # A Pn.n version is a patched version. # A Vn.n version is a released version. # A Tn.n version is a released field test version. # A Xn.n version is an unreleased experimental baselevel. # 1.2 uses "1.2" for uname -r. echo ${UNAME_MACHINE}-dec-osf`echo ${UNAME_RELEASE} | sed -e 's/^[PVTX]//' | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'` exit 0 ;; Alpha\ *:Windows_NT*:*) # How do we know it's Interix rather than the generic POSIX subsystem? # Should we change UNAME_MACHINE based on the output of uname instead # of the specific Alpha model? echo alpha-pc-interix exit 0 ;; 21064:Windows_NT:50:3) echo alpha-dec-winnt3.5 exit 0 ;; Amiga*:UNIX_System_V:4.0:*) echo m68k-unknown-sysv4 exit 0;; *:[Aa]miga[Oo][Ss]:*:*) echo ${UNAME_MACHINE}-unknown-amigaos exit 0 ;; *:[Mm]orph[Oo][Ss]:*:*) echo ${UNAME_MACHINE}-unknown-morphos exit 0 ;; *:OS/390:*:*) echo i370-ibm-openedition exit 0 ;; *:z/VM:*:*) echo s390-ibm-zvmoe exit 0 ;; *:OS400:*:*) echo powerpc-ibm-os400 exit 0 ;; arm:RISC*:1.[012]*:*|arm:riscix:1.[012]*:*) echo arm-acorn-riscix${UNAME_RELEASE} exit 0;; SR2?01:HI-UX/MPP:*:* | SR8000:HI-UX/MPP:*:*) echo hppa1.1-hitachi-hiuxmpp exit 0;; Pyramid*:OSx*:*:* | MIS*:OSx*:*:* | MIS*:SMP_DC-OSx*:*:*) # akee@wpdis03.wpafb.af.mil (Earle F. Ake) contributed MIS and NILE. if test "`(/bin/universe) 2>/dev/null`" = att ; then echo pyramid-pyramid-sysv3 else echo pyramid-pyramid-bsd fi exit 0 ;; NILE*:*:*:dcosx) echo pyramid-pyramid-svr4 exit 0 ;; DRS?6000:unix:4.0:6*) echo sparc-icl-nx6 exit 0 ;; DRS?6000:UNIX_SV:4.2*:7* | DRS?6000:isis:4.2*:7*) case `/usr/bin/uname -p` in sparc) echo sparc-icl-nx7 && exit 0 ;; esac ;; sun4H:SunOS:5.*:*) echo sparc-hal-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` exit 0 ;; sun4*:SunOS:5.*:* | tadpole*:SunOS:5.*:*) echo sparc-sun-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` exit 0 ;; i86pc:SunOS:5.*:*) echo i386-pc-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` exit 0 ;; sun4*:SunOS:6*:*) # According to config.sub, this is the proper way to canonicalize # SunOS6. Hard to guess exactly what SunOS6 will be like, but # it's likely to be more like Solaris than SunOS4. echo sparc-sun-solaris3`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` exit 0 ;; sun4*:SunOS:*:*) case "`/usr/bin/arch -k`" in Series*|S4*) UNAME_RELEASE=`uname -v` ;; esac # Japanese Language versions have a version number like `4.1.3-JL'. echo sparc-sun-sunos`echo ${UNAME_RELEASE}|sed -e 's/-/_/'` exit 0 ;; sun3*:SunOS:*:*) echo m68k-sun-sunos${UNAME_RELEASE} exit 0 ;; sun*:*:4.2BSD:*) UNAME_RELEASE=`(sed 1q /etc/motd | awk '{print substr($5,1,3)}') 2>/dev/null` test "x${UNAME_RELEASE}" = "x" && UNAME_RELEASE=3 case "`/bin/arch`" in sun3) echo m68k-sun-sunos${UNAME_RELEASE} ;; sun4) echo sparc-sun-sunos${UNAME_RELEASE} ;; esac exit 0 ;; aushp:SunOS:*:*) echo sparc-auspex-sunos${UNAME_RELEASE} exit 0 ;; # The situation for MiNT is a little confusing. The machine name # can be virtually everything (everything which is not # "atarist" or "atariste" at least should have a processor # > m68000). The system name ranges from "MiNT" over "FreeMiNT" # to the lowercase version "mint" (or "freemint"). Finally # the system name "TOS" denotes a system which is actually not # MiNT. But MiNT is downward compatible to TOS, so this should # be no problem. atarist[e]:*MiNT:*:* | atarist[e]:*mint:*:* | atarist[e]:*TOS:*:*) echo m68k-atari-mint${UNAME_RELEASE} exit 0 ;; atari*:*MiNT:*:* | atari*:*mint:*:* | atarist[e]:*TOS:*:*) echo m68k-atari-mint${UNAME_RELEASE} exit 0 ;; *falcon*:*MiNT:*:* | *falcon*:*mint:*:* | *falcon*:*TOS:*:*) echo m68k-atari-mint${UNAME_RELEASE} exit 0 ;; milan*:*MiNT:*:* | milan*:*mint:*:* | *milan*:*TOS:*:*) echo m68k-milan-mint${UNAME_RELEASE} exit 0 ;; hades*:*MiNT:*:* | hades*:*mint:*:* | *hades*:*TOS:*:*) echo m68k-hades-mint${UNAME_RELEASE} exit 0 ;; *:*MiNT:*:* | *:*mint:*:* | *:*TOS:*:*) echo m68k-unknown-mint${UNAME_RELEASE} exit 0 ;; m68k:machten:*:*) echo m68k-apple-machten${UNAME_RELEASE} exit 0 ;; powerpc:machten:*:*) echo powerpc-apple-machten${UNAME_RELEASE} exit 0 ;; RISC*:Mach:*:*) echo mips-dec-mach_bsd4.3 exit 0 ;; RISC*:ULTRIX:*:*) echo mips-dec-ultrix${UNAME_RELEASE} exit 0 ;; VAX*:ULTRIX*:*:*) echo vax-dec-ultrix${UNAME_RELEASE} exit 0 ;; 2020:CLIX:*:* | 2430:CLIX:*:*) echo clipper-intergraph-clix${UNAME_RELEASE} exit 0 ;; mips:*:*:UMIPS | mips:*:*:RISCos) eval $set_cc_for_build sed 's/^ //' << EOF >$dummy.c #ifdef __cplusplus #include /* for printf() prototype */ int main (int argc, char *argv[]) { #else int main (argc, argv) int argc; char *argv[]; { #endif #if defined (host_mips) && defined (MIPSEB) #if defined (SYSTYPE_SYSV) printf ("mips-mips-riscos%ssysv\n", argv[1]); exit (0); #endif #if defined (SYSTYPE_SVR4) printf ("mips-mips-riscos%ssvr4\n", argv[1]); exit (0); #endif #if defined (SYSTYPE_BSD43) || defined(SYSTYPE_BSD) printf ("mips-mips-riscos%sbsd\n", argv[1]); exit (0); #endif #endif exit (-1); } EOF $CC_FOR_BUILD -o $dummy $dummy.c \ && $dummy `echo "${UNAME_RELEASE}" | sed -n 's/\([0-9]*\).*/\1/p'` \ && exit 0 echo mips-mips-riscos${UNAME_RELEASE} exit 0 ;; Motorola:PowerMAX_OS:*:*) echo powerpc-motorola-powermax exit 0 ;; Motorola:*:4.3:PL8-*) echo powerpc-harris-powermax exit 0 ;; Night_Hawk:*:*:PowerMAX_OS | Synergy:PowerMAX_OS:*:*) echo powerpc-harris-powermax exit 0 ;; Night_Hawk:Power_UNIX:*:*) echo powerpc-harris-powerunix exit 0 ;; m88k:CX/UX:7*:*) echo m88k-harris-cxux7 exit 0 ;; m88k:*:4*:R4*) echo m88k-motorola-sysv4 exit 0 ;; m88k:*:3*:R3*) echo m88k-motorola-sysv3 exit 0 ;; AViiON:dgux:*:*) # DG/UX returns AViiON for all architectures UNAME_PROCESSOR=`/usr/bin/uname -p` if [ $UNAME_PROCESSOR = mc88100 ] || [ $UNAME_PROCESSOR = mc88110 ] then if [ ${TARGET_BINARY_INTERFACE}x = m88kdguxelfx ] || \ [ ${TARGET_BINARY_INTERFACE}x = x ] then echo m88k-dg-dgux${UNAME_RELEASE} else echo m88k-dg-dguxbcs${UNAME_RELEASE} fi else echo i586-dg-dgux${UNAME_RELEASE} fi exit 0 ;; M88*:DolphinOS:*:*) # DolphinOS (SVR3) echo m88k-dolphin-sysv3 exit 0 ;; M88*:*:R3*:*) # Delta 88k system running SVR3 echo m88k-motorola-sysv3 exit 0 ;; XD88*:*:*:*) # Tektronix XD88 system running UTekV (SVR3) echo m88k-tektronix-sysv3 exit 0 ;; Tek43[0-9][0-9]:UTek:*:*) # Tektronix 4300 system running UTek (BSD) echo m68k-tektronix-bsd exit 0 ;; *:IRIX*:*:*) echo mips-sgi-irix`echo ${UNAME_RELEASE}|sed -e 's/-/_/g'` exit 0 ;; ????????:AIX?:[12].1:2) # AIX 2.2.1 or AIX 2.1.1 is RT/PC AIX. echo romp-ibm-aix # uname -m gives an 8 hex-code CPU id exit 0 ;; # Note that: echo "'`uname -s`'" gives 'AIX ' i*86:AIX:*:*) echo i386-ibm-aix exit 0 ;; ia64:AIX:*:*) if [ -x /usr/bin/oslevel ] ; then IBM_REV=`/usr/bin/oslevel` else IBM_REV=${UNAME_VERSION}.${UNAME_RELEASE} fi echo ${UNAME_MACHINE}-ibm-aix${IBM_REV} exit 0 ;; *:AIX:2:3) if grep bos325 /usr/include/stdio.h >/dev/null 2>&1; then eval $set_cc_for_build sed 's/^ //' << EOF >$dummy.c #include main() { if (!__power_pc()) exit(1); puts("powerpc-ibm-aix3.2.5"); exit(0); } EOF $CC_FOR_BUILD -o $dummy $dummy.c && $dummy && exit 0 echo rs6000-ibm-aix3.2.5 elif grep bos324 /usr/include/stdio.h >/dev/null 2>&1; then echo rs6000-ibm-aix3.2.4 else echo rs6000-ibm-aix3.2 fi exit 0 ;; *:AIX:*:[45]) IBM_CPU_ID=`/usr/sbin/lsdev -C -c processor -S available | sed 1q | awk '{ print $1 }'` if /usr/sbin/lsattr -El ${IBM_CPU_ID} | grep ' POWER' >/dev/null 2>&1; then IBM_ARCH=rs6000 else IBM_ARCH=powerpc fi if [ -x /usr/bin/oslevel ] ; then IBM_REV=`/usr/bin/oslevel` else IBM_REV=${UNAME_VERSION}.${UNAME_RELEASE} fi echo ${IBM_ARCH}-ibm-aix${IBM_REV} exit 0 ;; *:AIX:*:*) echo rs6000-ibm-aix exit 0 ;; ibmrt:4.4BSD:*|romp-ibm:BSD:*) echo romp-ibm-bsd4.4 exit 0 ;; ibmrt:*BSD:*|romp-ibm:BSD:*) # covers RT/PC BSD and echo romp-ibm-bsd${UNAME_RELEASE} # 4.3 with uname added to exit 0 ;; # report: romp-ibm BSD 4.3 *:BOSX:*:*) echo rs6000-bull-bosx exit 0 ;; DPX/2?00:B.O.S.:*:*) echo m68k-bull-sysv3 exit 0 ;; 9000/[34]??:4.3bsd:1.*:*) echo m68k-hp-bsd exit 0 ;; hp300:4.4BSD:*:* | 9000/[34]??:4.3bsd:2.*:*) echo m68k-hp-bsd4.4 exit 0 ;; 9000/[34678]??:HP-UX:*:*) HPUX_REV=`echo ${UNAME_RELEASE}|sed -e 's/[^.]*.[0B]*//'` case "${UNAME_MACHINE}" in 9000/31? ) HP_ARCH=m68000 ;; 9000/[34]?? ) HP_ARCH=m68k ;; 9000/[678][0-9][0-9]) if [ -x /usr/bin/getconf ]; then sc_cpu_version=`/usr/bin/getconf SC_CPU_VERSION 2>/dev/null` sc_kernel_bits=`/usr/bin/getconf SC_KERNEL_BITS 2>/dev/null` case "${sc_cpu_version}" in 523) HP_ARCH="hppa1.0" ;; # CPU_PA_RISC1_0 528) HP_ARCH="hppa1.1" ;; # CPU_PA_RISC1_1 532) # CPU_PA_RISC2_0 case "${sc_kernel_bits}" in 32) HP_ARCH="hppa2.0n" ;; 64) HP_ARCH="hppa2.0w" ;; '') HP_ARCH="hppa2.0" ;; # HP-UX 10.20 esac ;; esac fi if [ "${HP_ARCH}" = "" ]; then eval $set_cc_for_build sed 's/^ //' << EOF >$dummy.c #define _HPUX_SOURCE #include #include int main () { #if defined(_SC_KERNEL_BITS) long bits = sysconf(_SC_KERNEL_BITS); #endif long cpu = sysconf (_SC_CPU_VERSION); switch (cpu) { case CPU_PA_RISC1_0: puts ("hppa1.0"); break; case CPU_PA_RISC1_1: puts ("hppa1.1"); break; case CPU_PA_RISC2_0: #if defined(_SC_KERNEL_BITS) switch (bits) { case 64: puts ("hppa2.0w"); break; case 32: puts ("hppa2.0n"); break; default: puts ("hppa2.0"); break; } break; #else /* !defined(_SC_KERNEL_BITS) */ puts ("hppa2.0"); break; #endif default: puts ("hppa1.0"); break; } exit (0); } EOF (CCOPTS= $CC_FOR_BUILD -o $dummy $dummy.c 2>/dev/null) && HP_ARCH=`$dummy` test -z "$HP_ARCH" && HP_ARCH=hppa fi ;; esac if [ ${HP_ARCH} = "hppa2.0w" ] then # avoid double evaluation of $set_cc_for_build test -n "$CC_FOR_BUILD" || eval $set_cc_for_build if echo __LP64__ | (CCOPTS= $CC_FOR_BUILD -E -) | grep __LP64__ >/dev/null then HP_ARCH="hppa2.0w" else HP_ARCH="hppa64" fi fi echo ${HP_ARCH}-hp-hpux${HPUX_REV} exit 0 ;; ia64:HP-UX:*:*) HPUX_REV=`echo ${UNAME_RELEASE}|sed -e 's/[^.]*.[0B]*//'` echo ia64-hp-hpux${HPUX_REV} exit 0 ;; 3050*:HI-UX:*:*) eval $set_cc_for_build sed 's/^ //' << EOF >$dummy.c #include int main () { long cpu = sysconf (_SC_CPU_VERSION); /* The order matters, because CPU_IS_HP_MC68K erroneously returns true for CPU_PA_RISC1_0. CPU_IS_PA_RISC returns correct results, however. */ if (CPU_IS_PA_RISC (cpu)) { switch (cpu) { case CPU_PA_RISC1_0: puts ("hppa1.0-hitachi-hiuxwe2"); break; case CPU_PA_RISC1_1: puts ("hppa1.1-hitachi-hiuxwe2"); break; case CPU_PA_RISC2_0: puts ("hppa2.0-hitachi-hiuxwe2"); break; default: puts ("hppa-hitachi-hiuxwe2"); break; } } else if (CPU_IS_HP_MC68K (cpu)) puts ("m68k-hitachi-hiuxwe2"); else puts ("unknown-hitachi-hiuxwe2"); exit (0); } EOF $CC_FOR_BUILD -o $dummy $dummy.c && $dummy && exit 0 echo unknown-hitachi-hiuxwe2 exit 0 ;; 9000/7??:4.3bsd:*:* | 9000/8?[79]:4.3bsd:*:* ) echo hppa1.1-hp-bsd exit 0 ;; 9000/8??:4.3bsd:*:*) echo hppa1.0-hp-bsd exit 0 ;; *9??*:MPE/iX:*:* | *3000*:MPE/iX:*:*) echo hppa1.0-hp-mpeix exit 0 ;; hp7??:OSF1:*:* | hp8?[79]:OSF1:*:* ) echo hppa1.1-hp-osf exit 0 ;; hp8??:OSF1:*:*) echo hppa1.0-hp-osf exit 0 ;; i*86:OSF1:*:*) if [ -x /usr/sbin/sysversion ] ; then echo ${UNAME_MACHINE}-unknown-osf1mk else echo ${UNAME_MACHINE}-unknown-osf1 fi exit 0 ;; parisc*:Lites*:*:*) echo hppa1.1-hp-lites exit 0 ;; C1*:ConvexOS:*:* | convex:ConvexOS:C1*:*) echo c1-convex-bsd exit 0 ;; C2*:ConvexOS:*:* | convex:ConvexOS:C2*:*) if getsysinfo -f scalar_acc then echo c32-convex-bsd else echo c2-convex-bsd fi exit 0 ;; C34*:ConvexOS:*:* | convex:ConvexOS:C34*:*) echo c34-convex-bsd exit 0 ;; C38*:ConvexOS:*:* | convex:ConvexOS:C38*:*) echo c38-convex-bsd exit 0 ;; C4*:ConvexOS:*:* | convex:ConvexOS:C4*:*) echo c4-convex-bsd exit 0 ;; CRAY*Y-MP:*:*:*) echo ymp-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' exit 0 ;; CRAY*[A-Z]90:*:*:*) echo ${UNAME_MACHINE}-cray-unicos${UNAME_RELEASE} \ | sed -e 's/CRAY.*\([A-Z]90\)/\1/' \ -e y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/ \ -e 's/\.[^.]*$/.X/' exit 0 ;; CRAY*TS:*:*:*) echo t90-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' exit 0 ;; CRAY*T3E:*:*:*) echo alphaev5-cray-unicosmk${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' exit 0 ;; CRAY*SV1:*:*:*) echo sv1-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' exit 0 ;; *:UNICOS/mp:*:*) echo craynv-cray-unicosmp${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' exit 0 ;; F30[01]:UNIX_System_V:*:* | F700:UNIX_System_V:*:*) FUJITSU_PROC=`uname -m | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'` FUJITSU_SYS=`uname -p | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/\///'` FUJITSU_REL=`echo ${UNAME_RELEASE} | sed -e 's/ /_/'` echo "${FUJITSU_PROC}-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}" exit 0 ;; 5000:UNIX_System_V:4.*:*) FUJITSU_SYS=`uname -p | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/\///'` FUJITSU_REL=`echo ${UNAME_RELEASE} | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/ /_/'` echo "sparc-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}" exit 0 ;; i*86:BSD/386:*:* | i*86:BSD/OS:*:* | *:Ascend\ Embedded/OS:*:*) echo ${UNAME_MACHINE}-pc-bsdi${UNAME_RELEASE} exit 0 ;; sparc*:BSD/OS:*:*) echo sparc-unknown-bsdi${UNAME_RELEASE} exit 0 ;; *:BSD/OS:*:*) echo ${UNAME_MACHINE}-unknown-bsdi${UNAME_RELEASE} exit 0 ;; *:FreeBSD:*:*) echo ${UNAME_MACHINE}-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` exit 0 ;; i*:CYGWIN*:*) echo ${UNAME_MACHINE}-pc-cygwin exit 0 ;; i*:MINGW*:*) echo ${UNAME_MACHINE}-pc-mingw32 exit 0 ;; i*:PW*:*) echo ${UNAME_MACHINE}-pc-pw32 exit 0 ;; x86:Interix*:[34]*) echo i586-pc-interix${UNAME_RELEASE}|sed -e 's/\..*//' exit 0 ;; [345]86:Windows_95:* | [345]86:Windows_98:* | [345]86:Windows_NT:*) echo i${UNAME_MACHINE}-pc-mks exit 0 ;; i*:Windows_NT*:* | Pentium*:Windows_NT*:*) # How do we know it's Interix rather than the generic POSIX subsystem? # It also conflicts with pre-2.0 versions of AT&T UWIN. Should we # UNAME_MACHINE based on the output of uname instead of i386? echo i586-pc-interix exit 0 ;; i*:UWIN*:*) echo ${UNAME_MACHINE}-pc-uwin exit 0 ;; amd64:CYGWIN*:*:*) echo x86_64-unknown-cygwin exit 0 ;; p*:CYGWIN*:*) echo powerpcle-unknown-cygwin exit 0 ;; prep*:SunOS:5.*:*) echo powerpcle-unknown-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` exit 0 ;; *:GNU:*:*) # the GNU system echo `echo ${UNAME_MACHINE}|sed -e 's,[-/].*$,,'`-unknown-gnu`echo ${UNAME_RELEASE}|sed -e 's,/.*$,,'` exit 0 ;; *:GNU/*:*:*) # other systems with GNU libc and userland echo ${UNAME_MACHINE}-unknown-`echo ${UNAME_SYSTEM} | sed 's,^[^/]*/,,' | tr '[A-Z]' '[a-z]'``echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'`-gnu exit 0 ;; i*86:Minix:*:*) echo ${UNAME_MACHINE}-pc-minix exit 0 ;; arm*:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-gnu exit 0 ;; cris:Linux:*:*) echo cris-axis-linux-gnu exit 0 ;; crisv32:Linux:*:*) echo crisv32-axis-linux-gnu exit 0 ;; frv:Linux:*:*) echo frv-unknown-linux-gnu exit 0 ;; ia64:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-gnu exit 0 ;; m32r*:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-gnu exit 0 ;; m68*:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-gnu exit 0 ;; mips:Linux:*:*) eval $set_cc_for_build sed 's/^ //' << EOF >$dummy.c #undef CPU #undef mips #undef mipsel #if defined(__MIPSEL__) || defined(__MIPSEL) || defined(_MIPSEL) || defined(MIPSEL) CPU=mipsel #else #if defined(__MIPSEB__) || defined(__MIPSEB) || defined(_MIPSEB) || defined(MIPSEB) CPU=mips #else CPU= #endif #endif EOF eval `$CC_FOR_BUILD -E $dummy.c 2>/dev/null | grep ^CPU=` test x"${CPU}" != x && echo "${CPU}-unknown-linux-gnu" && exit 0 ;; mips64:Linux:*:*) eval $set_cc_for_build sed 's/^ //' << EOF >$dummy.c #undef CPU #undef mips64 #undef mips64el #if defined(__MIPSEL__) || defined(__MIPSEL) || defined(_MIPSEL) || defined(MIPSEL) CPU=mips64el #else #if defined(__MIPSEB__) || defined(__MIPSEB) || defined(_MIPSEB) || defined(MIPSEB) CPU=mips64 #else CPU= #endif #endif EOF eval `$CC_FOR_BUILD -E $dummy.c 2>/dev/null | grep ^CPU=` test x"${CPU}" != x && echo "${CPU}-unknown-linux-gnu" && exit 0 ;; ppc:Linux:*:*) echo powerpc-unknown-linux-gnu exit 0 ;; ppc64:Linux:*:*) echo powerpc64-unknown-linux-gnu exit 0 ;; alpha:Linux:*:*) case `sed -n '/^cpu model/s/^.*: \(.*\)/\1/p' < /proc/cpuinfo` in EV5) UNAME_MACHINE=alphaev5 ;; EV56) UNAME_MACHINE=alphaev56 ;; PCA56) UNAME_MACHINE=alphapca56 ;; PCA57) UNAME_MACHINE=alphapca56 ;; EV6) UNAME_MACHINE=alphaev6 ;; EV67) UNAME_MACHINE=alphaev67 ;; EV68*) UNAME_MACHINE=alphaev68 ;; esac objdump --private-headers /bin/sh | grep ld.so.1 >/dev/null if test "$?" = 0 ; then LIBC="libc1" ; else LIBC="" ; fi echo ${UNAME_MACHINE}-unknown-linux-gnu${LIBC} exit 0 ;; parisc:Linux:*:* | hppa:Linux:*:*) # Look for CPU level case `grep '^cpu[^a-z]*:' /proc/cpuinfo 2>/dev/null | cut -d' ' -f2` in PA7*) echo hppa1.1-unknown-linux-gnu ;; PA8*) echo hppa2.0-unknown-linux-gnu ;; *) echo hppa-unknown-linux-gnu ;; esac exit 0 ;; parisc64:Linux:*:* | hppa64:Linux:*:*) echo hppa64-unknown-linux-gnu exit 0 ;; s390:Linux:*:* | s390x:Linux:*:*) echo ${UNAME_MACHINE}-ibm-linux exit 0 ;; sh64*:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-gnu exit 0 ;; sh*:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-gnu exit 0 ;; sparc:Linux:*:* | sparc64:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-gnu exit 0 ;; x86_64:Linux:*:*) echo x86_64-unknown-linux-gnu exit 0 ;; i*86:Linux:*:*) # The BFD linker knows what the default object file format is, so # first see if it will tell us. cd to the root directory to prevent # problems with other programs or directories called `ld' in the path. # Set LC_ALL=C to ensure ld outputs messages in English. ld_supported_targets=`cd /; LC_ALL=C ld --help 2>&1 \ | sed -ne '/supported targets:/!d s/[ ][ ]*/ /g s/.*supported targets: *// s/ .*// p'` case "$ld_supported_targets" in elf32-i386) TENTATIVE="${UNAME_MACHINE}-pc-linux-gnu" ;; a.out-i386-linux) echo "${UNAME_MACHINE}-pc-linux-gnuaout" exit 0 ;; coff-i386) echo "${UNAME_MACHINE}-pc-linux-gnucoff" exit 0 ;; "") # Either a pre-BFD a.out linker (linux-gnuoldld) or # one that does not give us useful --help. echo "${UNAME_MACHINE}-pc-linux-gnuoldld" exit 0 ;; esac # Determine whether the default compiler is a.out or elf eval $set_cc_for_build sed 's/^ //' << EOF >$dummy.c #include #ifdef __ELF__ # ifdef __GLIBC__ # if __GLIBC__ >= 2 LIBC=gnu # else LIBC=gnulibc1 # endif # else LIBC=gnulibc1 # endif #else #ifdef __INTEL_COMPILER LIBC=gnu #else LIBC=gnuaout #endif #endif #ifdef __dietlibc__ LIBC=dietlibc #endif EOF eval `$CC_FOR_BUILD -E $dummy.c 2>/dev/null | grep ^LIBC=` test x"${LIBC}" != x && echo "${UNAME_MACHINE}-pc-linux-${LIBC}" && exit 0 test x"${TENTATIVE}" != x && echo "${TENTATIVE}" && exit 0 ;; i*86:DYNIX/ptx:4*:*) # ptx 4.0 does uname -s correctly, with DYNIX/ptx in there. # earlier versions are messed up and put the nodename in both # sysname and nodename. echo i386-sequent-sysv4 exit 0 ;; i*86:UNIX_SV:4.2MP:2.*) # Unixware is an offshoot of SVR4, but it has its own version # number series starting with 2... # I am not positive that other SVR4 systems won't match this, # I just have to hope. -- rms. # Use sysv4.2uw... so that sysv4* matches it. echo ${UNAME_MACHINE}-pc-sysv4.2uw${UNAME_VERSION} exit 0 ;; i*86:OS/2:*:*) # If we were able to find `uname', then EMX Unix compatibility # is probably installed. echo ${UNAME_MACHINE}-pc-os2-emx exit 0 ;; i*86:XTS-300:*:STOP) echo ${UNAME_MACHINE}-unknown-stop exit 0 ;; i*86:atheos:*:*) echo ${UNAME_MACHINE}-unknown-atheos exit 0 ;; i*86:syllable:*:*) echo ${UNAME_MACHINE}-pc-syllable exit 0 ;; i*86:LynxOS:2.*:* | i*86:LynxOS:3.[01]*:* | i*86:LynxOS:4.0*:*) echo i386-unknown-lynxos${UNAME_RELEASE} exit 0 ;; i*86:*DOS:*:*) echo ${UNAME_MACHINE}-pc-msdosdjgpp exit 0 ;; i*86:*:4.*:* | i*86:SYSTEM_V:4.*:*) UNAME_REL=`echo ${UNAME_RELEASE} | sed 's/\/MP$//'` if grep Novell /usr/include/link.h >/dev/null 2>/dev/null; then echo ${UNAME_MACHINE}-univel-sysv${UNAME_REL} else echo ${UNAME_MACHINE}-pc-sysv${UNAME_REL} fi exit 0 ;; i*86:*:5:[78]*) case `/bin/uname -X | grep "^Machine"` in *486*) UNAME_MACHINE=i486 ;; *Pentium) UNAME_MACHINE=i586 ;; *Pent*|*Celeron) UNAME_MACHINE=i686 ;; esac echo ${UNAME_MACHINE}-unknown-sysv${UNAME_RELEASE}${UNAME_SYSTEM}${UNAME_VERSION} exit 0 ;; i*86:*:3.2:*) if test -f /usr/options/cb.name; then UNAME_REL=`sed -n 's/.*Version //p' /dev/null >/dev/null ; then UNAME_REL=`(/bin/uname -X|grep Release|sed -e 's/.*= //')` (/bin/uname -X|grep i80486 >/dev/null) && UNAME_MACHINE=i486 (/bin/uname -X|grep '^Machine.*Pentium' >/dev/null) \ && UNAME_MACHINE=i586 (/bin/uname -X|grep '^Machine.*Pent *II' >/dev/null) \ && UNAME_MACHINE=i686 (/bin/uname -X|grep '^Machine.*Pentium Pro' >/dev/null) \ && UNAME_MACHINE=i686 echo ${UNAME_MACHINE}-pc-sco$UNAME_REL else echo ${UNAME_MACHINE}-pc-sysv32 fi exit 0 ;; pc:*:*:*) # Left here for compatibility: # uname -m prints for DJGPP always 'pc', but it prints nothing about # the processor, so we play safe by assuming i386. echo i386-pc-msdosdjgpp exit 0 ;; Intel:Mach:3*:*) echo i386-pc-mach3 exit 0 ;; paragon:*:*:*) echo i860-intel-osf1 exit 0 ;; i860:*:4.*:*) # i860-SVR4 if grep Stardent /usr/include/sys/uadmin.h >/dev/null 2>&1 ; then echo i860-stardent-sysv${UNAME_RELEASE} # Stardent Vistra i860-SVR4 else # Add other i860-SVR4 vendors below as they are discovered. echo i860-unknown-sysv${UNAME_RELEASE} # Unknown i860-SVR4 fi exit 0 ;; mini*:CTIX:SYS*5:*) # "miniframe" echo m68010-convergent-sysv exit 0 ;; mc68k:UNIX:SYSTEM5:3.51m) echo m68k-convergent-sysv exit 0 ;; M680?0:D-NIX:5.3:*) echo m68k-diab-dnix exit 0 ;; M68*:*:R3V[5678]*:*) test -r /sysV68 && echo 'm68k-motorola-sysv' && exit 0 ;; 3[345]??:*:4.0:3.0 | 3[34]??A:*:4.0:3.0 | 3[34]??,*:*:4.0:3.0 | 3[34]??/*:*:4.0:3.0 | 4400:*:4.0:3.0 | 4850:*:4.0:3.0 | SKA40:*:4.0:3.0 | SDS2:*:4.0:3.0 | SHG2:*:4.0:3.0 | S7501*:*:4.0:3.0) OS_REL='' test -r /etc/.relid \ && OS_REL=.`sed -n 's/[^ ]* [^ ]* \([0-9][0-9]\).*/\1/p' < /etc/.relid` /bin/uname -p 2>/dev/null | grep 86 >/dev/null \ && echo i486-ncr-sysv4.3${OS_REL} && exit 0 /bin/uname -p 2>/dev/null | /bin/grep entium >/dev/null \ && echo i586-ncr-sysv4.3${OS_REL} && exit 0 ;; 3[34]??:*:4.0:* | 3[34]??,*:*:4.0:*) /bin/uname -p 2>/dev/null | grep 86 >/dev/null \ && echo i486-ncr-sysv4 && exit 0 ;; m68*:LynxOS:2.*:* | m68*:LynxOS:3.0*:*) echo m68k-unknown-lynxos${UNAME_RELEASE} exit 0 ;; mc68030:UNIX_System_V:4.*:*) echo m68k-atari-sysv4 exit 0 ;; TSUNAMI:LynxOS:2.*:*) echo sparc-unknown-lynxos${UNAME_RELEASE} exit 0 ;; rs6000:LynxOS:2.*:*) echo rs6000-unknown-lynxos${UNAME_RELEASE} exit 0 ;; PowerPC:LynxOS:2.*:* | PowerPC:LynxOS:3.[01]*:* | PowerPC:LynxOS:4.0*:*) echo powerpc-unknown-lynxos${UNAME_RELEASE} exit 0 ;; SM[BE]S:UNIX_SV:*:*) echo mips-dde-sysv${UNAME_RELEASE} exit 0 ;; RM*:ReliantUNIX-*:*:*) echo mips-sni-sysv4 exit 0 ;; RM*:SINIX-*:*:*) echo mips-sni-sysv4 exit 0 ;; *:SINIX-*:*:*) if uname -p 2>/dev/null >/dev/null ; then UNAME_MACHINE=`(uname -p) 2>/dev/null` echo ${UNAME_MACHINE}-sni-sysv4 else echo ns32k-sni-sysv fi exit 0 ;; PENTIUM:*:4.0*:*) # Unisys `ClearPath HMP IX 4000' SVR4/MP effort # says echo i586-unisys-sysv4 exit 0 ;; *:UNIX_System_V:4*:FTX*) # From Gerald Hewes . # How about differentiating between stratus architectures? -djm echo hppa1.1-stratus-sysv4 exit 0 ;; *:*:*:FTX*) # From seanf@swdc.stratus.com. echo i860-stratus-sysv4 exit 0 ;; i*86:VOS:*:*) # From Paul.Green@stratus.com. echo ${UNAME_MACHINE}-stratus-vos exit 0 ;; *:VOS:*:*) # From Paul.Green@stratus.com. echo hppa1.1-stratus-vos exit 0 ;; mc68*:A/UX:*:*) echo m68k-apple-aux${UNAME_RELEASE} exit 0 ;; news*:NEWS-OS:6*:*) echo mips-sony-newsos6 exit 0 ;; R[34]000:*System_V*:*:* | R4000:UNIX_SYSV:*:* | R*000:UNIX_SV:*:*) if [ -d /usr/nec ]; then echo mips-nec-sysv${UNAME_RELEASE} else echo mips-unknown-sysv${UNAME_RELEASE} fi exit 0 ;; BeBox:BeOS:*:*) # BeOS running on hardware made by Be, PPC only. echo powerpc-be-beos exit 0 ;; BeMac:BeOS:*:*) # BeOS running on Mac or Mac clone, PPC only. echo powerpc-apple-beos exit 0 ;; BePC:BeOS:*:*) # BeOS running on Intel PC compatible. echo i586-pc-beos exit 0 ;; SX-4:SUPER-UX:*:*) echo sx4-nec-superux${UNAME_RELEASE} exit 0 ;; SX-5:SUPER-UX:*:*) echo sx5-nec-superux${UNAME_RELEASE} exit 0 ;; SX-6:SUPER-UX:*:*) echo sx6-nec-superux${UNAME_RELEASE} exit 0 ;; Power*:Rhapsody:*:*) echo powerpc-apple-rhapsody${UNAME_RELEASE} exit 0 ;; *:Rhapsody:*:*) echo ${UNAME_MACHINE}-apple-rhapsody${UNAME_RELEASE} exit 0 ;; *:Darwin:*:*) UNAME_PROCESSOR=`uname -p` || UNAME_PROCESSOR=unknown case $UNAME_PROCESSOR in *86) UNAME_PROCESSOR=i686 ;; unknown) UNAME_PROCESSOR=powerpc ;; esac echo ${UNAME_PROCESSOR}-apple-darwin${UNAME_RELEASE} exit 0 ;; *:procnto*:*:* | *:QNX:[0123456789]*:*) UNAME_PROCESSOR=`uname -p` if test "$UNAME_PROCESSOR" = "x86"; then UNAME_PROCESSOR=i386 UNAME_MACHINE=pc fi echo ${UNAME_PROCESSOR}-${UNAME_MACHINE}-nto-qnx${UNAME_RELEASE} exit 0 ;; *:QNX:*:4*) echo i386-pc-qnx exit 0 ;; NSE-?:NONSTOP_KERNEL:*:*) echo nse-tandem-nsk${UNAME_RELEASE} exit 0 ;; NSR-?:NONSTOP_KERNEL:*:*) echo nsr-tandem-nsk${UNAME_RELEASE} exit 0 ;; *:NonStop-UX:*:*) echo mips-compaq-nonstopux exit 0 ;; BS2000:POSIX*:*:*) echo bs2000-siemens-sysv exit 0 ;; DS/*:UNIX_System_V:*:*) echo ${UNAME_MACHINE}-${UNAME_SYSTEM}-${UNAME_RELEASE} exit 0 ;; *:Plan9:*:*) # "uname -m" is not consistent, so use $cputype instead. 386 # is converted to i386 for consistency with other x86 # operating systems. if test "$cputype" = "386"; then UNAME_MACHINE=i386 else UNAME_MACHINE="$cputype" fi echo ${UNAME_MACHINE}-unknown-plan9 exit 0 ;; *:TOPS-10:*:*) echo pdp10-unknown-tops10 exit 0 ;; *:TENEX:*:*) echo pdp10-unknown-tenex exit 0 ;; KS10:TOPS-20:*:* | KL10:TOPS-20:*:* | TYPE4:TOPS-20:*:*) echo pdp10-dec-tops20 exit 0 ;; XKL-1:TOPS-20:*:* | TYPE5:TOPS-20:*:*) echo pdp10-xkl-tops20 exit 0 ;; *:TOPS-20:*:*) echo pdp10-unknown-tops20 exit 0 ;; *:ITS:*:*) echo pdp10-unknown-its exit 0 ;; SEI:*:*:SEIUX) echo mips-sei-seiux${UNAME_RELEASE} exit 0 ;; *:DragonFly:*:*) echo ${UNAME_MACHINE}-unknown-dragonfly`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` exit 0 ;; *:*VMS:*:*) UNAME_MACHINE=`(uname -p) 2>/dev/null` case "${UNAME_MACHINE}" in A*) echo alpha-dec-vms && exit 0 ;; I*) echo ia64-dec-vms && exit 0 ;; V*) echo vax-dec-vms && exit 0 ;; esac ;; *:XENIX:*:SysV) echo i386-pc-xenix exit 0 ;; esac #echo '(No uname command or uname output not recognized.)' 1>&2 #echo "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" 1>&2 eval $set_cc_for_build cat >$dummy.c < # include #endif main () { #if defined (sony) #if defined (MIPSEB) /* BFD wants "bsd" instead of "newsos". Perhaps BFD should be changed, I don't know.... */ printf ("mips-sony-bsd\n"); exit (0); #else #include printf ("m68k-sony-newsos%s\n", #ifdef NEWSOS4 "4" #else "" #endif ); exit (0); #endif #endif #if defined (__arm) && defined (__acorn) && defined (__unix) printf ("arm-acorn-riscix"); exit (0); #endif #if defined (hp300) && !defined (hpux) printf ("m68k-hp-bsd\n"); exit (0); #endif #if defined (NeXT) #if !defined (__ARCHITECTURE__) #define __ARCHITECTURE__ "m68k" #endif int version; version=`(hostinfo | sed -n 's/.*NeXT Mach \([0-9]*\).*/\1/p') 2>/dev/null`; if (version < 4) printf ("%s-next-nextstep%d\n", __ARCHITECTURE__, version); else printf ("%s-next-openstep%d\n", __ARCHITECTURE__, version); exit (0); #endif #if defined (MULTIMAX) || defined (n16) #if defined (UMAXV) printf ("ns32k-encore-sysv\n"); exit (0); #else #if defined (CMU) printf ("ns32k-encore-mach\n"); exit (0); #else printf ("ns32k-encore-bsd\n"); exit (0); #endif #endif #endif #if defined (__386BSD__) printf ("i386-pc-bsd\n"); exit (0); #endif #if defined (sequent) #if defined (i386) printf ("i386-sequent-dynix\n"); exit (0); #endif #if defined (ns32000) printf ("ns32k-sequent-dynix\n"); exit (0); #endif #endif #if defined (_SEQUENT_) struct utsname un; uname(&un); if (strncmp(un.version, "V2", 2) == 0) { printf ("i386-sequent-ptx2\n"); exit (0); } if (strncmp(un.version, "V1", 2) == 0) { /* XXX is V1 correct? */ printf ("i386-sequent-ptx1\n"); exit (0); } printf ("i386-sequent-ptx\n"); exit (0); #endif #if defined (vax) # if !defined (ultrix) # include # if defined (BSD) # if BSD == 43 printf ("vax-dec-bsd4.3\n"); exit (0); # else # if BSD == 199006 printf ("vax-dec-bsd4.3reno\n"); exit (0); # else printf ("vax-dec-bsd\n"); exit (0); # endif # endif # else printf ("vax-dec-bsd\n"); exit (0); # endif # else printf ("vax-dec-ultrix\n"); exit (0); # endif #endif #if defined (alliant) && defined (i860) printf ("i860-alliant-bsd\n"); exit (0); #endif exit (1); } EOF $CC_FOR_BUILD -o $dummy $dummy.c 2>/dev/null && $dummy && exit 0 # Apollos put the system type in the environment. test -d /usr/apollo && { echo ${ISP}-apollo-${SYSTYPE}; exit 0; } # Convex versions that predate uname can use getsysinfo(1) if [ -x /usr/convex/getsysinfo ] then case `getsysinfo -f cpu_type` in c1*) echo c1-convex-bsd exit 0 ;; c2*) if getsysinfo -f scalar_acc then echo c32-convex-bsd else echo c2-convex-bsd fi exit 0 ;; c34*) echo c34-convex-bsd exit 0 ;; c38*) echo c38-convex-bsd exit 0 ;; c4*) echo c4-convex-bsd exit 0 ;; esac fi cat >&2 < in order to provide the needed information to handle your system. config.guess timestamp = $timestamp uname -m = `(uname -m) 2>/dev/null || echo unknown` uname -r = `(uname -r) 2>/dev/null || echo unknown` uname -s = `(uname -s) 2>/dev/null || echo unknown` uname -v = `(uname -v) 2>/dev/null || echo unknown` /usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null` /bin/uname -X = `(/bin/uname -X) 2>/dev/null` hostinfo = `(hostinfo) 2>/dev/null` /bin/universe = `(/bin/universe) 2>/dev/null` /usr/bin/arch -k = `(/usr/bin/arch -k) 2>/dev/null` /bin/arch = `(/bin/arch) 2>/dev/null` /usr/bin/oslevel = `(/usr/bin/oslevel) 2>/dev/null` /usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null` UNAME_MACHINE = ${UNAME_MACHINE} UNAME_RELEASE = ${UNAME_RELEASE} UNAME_SYSTEM = ${UNAME_SYSTEM} UNAME_VERSION = ${UNAME_VERSION} EOF exit 1 # Local variables: # eval: (add-hook 'write-file-hooks 'time-stamp) # time-stamp-start: "timestamp='" # time-stamp-format: "%:y-%02m-%02d" # time-stamp-end: "'" # End: cryptmount-5.2/armour-builtin.c0000644000175000017500000003473212612754537013667 00000000000000/* * Methods for encryption/security mechanisms for cryptmount * (C)Copyright 2007-2015, RW Penney */ /* This file is part of cryptmount cryptmount is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. cryptmount is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. */ #include #include #include #include #include #include #include "armour.h" #include "blowfish.h" #include "cryptmount.h" #include "utils.h" #ifdef TESTING # include "cmtesting.h" #endif /*! \addtogroup keymgrs * @{ */ typedef struct { unsigned fversion; } blti_overrides_t; /* * ==== Built-in sha1/blowfish key-management routines ==== */ /* * Keyfile format is: * char magic[7]="cm-blti"; * uchar version; * uint16{LSB-first} keylength; * uint32{LSB-first} hash-iterations (version>=1); * char salt[kmblti_saltlen]; * [64-bit block][64-bit block][...]; * uint64{LSB-first} xor-checksum of key */ static const char kmblti_magstr[]="cm-blti"; static const uint8_t kmblti_version = (uint8_t)1; static const size_t kmblti_maglen = 7; /* = strlen(kmblti_magstr) */ enum { kmblti_saltlen = 10, kmblti_default_iterations = 1 << 14 }; static int kmblti_checkversion(uint8_t fversion) { if (fversion > kmblti_version) { fprintf(stderr, "Bad keyfile version [%d]\n", (int)fversion); return ERR_BADFILE; } return ERR_NOERROR; } static cm_bf_ctxt_t *kmblti_initcipher_v0(const uint8_t *salt, const char *pass, size_t passlen, uint32_t iv[2]) /** Initialize cipher key (for file-format version-0) */ { cm_bf_ctxt_t *ctxt; cm_sha1_ctxt_t *md; uint8_t *ckey = NULL; size_t ckeysz; int i; /* Generate cipher key by sha1-hashing password: */ md = cm_sha1_init(); for (i=16; i--; ) { cm_sha1_block(md, (const uint8_t*)pass, passlen); cm_sha1_block(md, salt, (size_t)kmblti_saltlen); } iv[0] = md->H[0]; iv[1] = md->H[3]; cm_sha1_block(md, salt, (size_t)kmblti_saltlen); cm_sha1_final(md, &ckey, &ckeysz); cm_sha1_free(md); /* Initialize Blowfish cipher with hashed password: */ ctxt = cm_bf_init(ckey, ckeysz); sec_free((void*)ckey); return ctxt; } static cm_bf_ctxt_t *kmblti_initcipher_v1(const uint8_t *salt, const char *pass, size_t passlen, uint32_t iterations, uint32_t iv[2]) /** Initialize cipher key (for file-format version-1) */ { cm_bf_ctxt_t *ctxt; uint8_t *ckey = NULL; const size_t ckeysz = 56; cm_pwd_fortify(pass, iterations, salt, (size_t)kmblti_saltlen, &ckey, ckeysz); iv[0] = pack_uint32(ckey + 48); iv[1] = pack_uint32(ckey + 52); /* Initialize Blowfish cipher with hashed password: */ ctxt = cm_bf_init(ckey, ckeysz - 8); sec_free((void*)ckey); return ctxt; } static int kmblti_init_algs(void) { /* Nothing needed */ return 0; } static int kmblti_free_algs(void) { /* Nothing needed */ return 0; } static int kmblti_bind(bound_tgtdefn_t *bound, FILE *fp_key) { keyinfo_t *keyinfo = &bound->tgt->key; const char *fmtptr; char buff[32]; int compat = 1; /* Be prepared to act as default key-manager */ if (keyinfo->format != NULL) { fmtptr = keyinfo->format; compat = cm_startswith(&fmtptr, "builtin"); if (*fmtptr == ':') { /* Extract file-format version from suffix: */ blti_overrides_t *bltior; bltior = (blti_overrides_t*)malloc(sizeof(blti_overrides_t)); bltior->fversion = atoi(fmtptr + 1); bound->km_data = (void*)bltior; } else if (*fmtptr != '\0') compat = 0; } else { if (fp_key != NULL) { /* Check header of existing key-file: */ buff[0] = '\0'; compat = (cm_fread((void*)buff, kmblti_maglen, fp_key) == 0 && strncmp(buff, kmblti_magstr, kmblti_maglen) == 0); } } if (compat) { if (keyinfo->digestalg == NULL) { keyinfo->digestalg = cm_strdup("sha1"); } if (keyinfo->cipheralg == NULL) { keyinfo->cipheralg = cm_strdup("blowfish-cbc"); } } return compat; } static unsigned kmblti_get_properties(const bound_tgtdefn_t *boundtgt) { return (KM_PROP_HASPASSWD | KM_PROP_NEEDSKEYFILE); } static int kmblti_get_key(bound_tgtdefn_t *boundtgt, const km_pw_context_t *pw_ctxt, uint8_t **key, int *keylen, FILE *fp_key) /** Extract key from sha1/blowfish encrypted file */ { const keyinfo_t *keyinfo = &boundtgt->tgt->key; cm_bf_ctxt_t *ctxt; enum { BUFFSZ = 512 }; uint8_t *hbuff = NULL, fversion, salt[kmblti_saltlen], *buff = NULL, *bptr; uint32_t iv[2], cv[2], pl[2], iterations = kmblti_default_iterations; char *passwd = NULL; uint32_t chksum, chksum0; int cnt, rd_errs=0, eflag=ERR_NOERROR; *key = NULL; *keylen = 0; eflag = km_get_passwd(boundtgt->tgt->ident, pw_ctxt, &passwd, 0, 0); if (eflag != ERR_NOERROR) goto bail_out; /* Read key header: */ hbuff = (uint8_t*)malloc((size_t)(kmblti_maglen + 4)); hbuff[0] = '\0'; rd_errs += cm_fread((void*)hbuff, kmblti_maglen, fp_key); if (strncmp((const char*)hbuff, kmblti_magstr, kmblti_maglen) != 0) { fprintf(stderr, "Bad keyfile format (builtin)\n"); eflag = ERR_BADFILE; goto bail_out; } rd_errs += cm_fread((void*)&fversion, (size_t)1, fp_key); eflag = kmblti_checkversion(fversion); if (eflag != ERR_NOERROR) goto bail_out; rd_errs += cm_fread((void*)hbuff, (size_t)2, fp_key); *keylen = pack_uint16(hbuff); /* Read iteration-count from keyfile: */ if (fversion == 1) { rd_errs += cm_fread((void*)hbuff, (size_t)4, fp_key); iterations = pack_uint32(hbuff); } /* Read salt from keyfile: */ rd_errs += cm_fread((void*)salt, sizeof(salt), fp_key); /* Read encrypted key from keyfile: */ switch (fversion) { case 0: ctxt = kmblti_initcipher_v0(salt, passwd, strlen(passwd), iv); break; case 1: /* Fall-through: */ default: ctxt = kmblti_initcipher_v1(salt, passwd, strlen(passwd), iterations, iv); break; } cnt = km_aug_keysz((unsigned)*keylen, 8u) / 8; buff = (uint8_t*)sec_realloc(buff, (size_t)(cnt * 8)); rd_errs += cm_fread((void*)buff, (size_t)(8 * cnt), fp_key); bptr = buff; while (cnt--) { cv[0] = pack_uint32(bptr+4); cv[1] = pack_uint32(bptr); /* Apply cipher block-chaining: */ pl[0] = cv[0]; pl[1] = cv[1]; cm_bf_decipher(ctxt, pl, pl+1); pl[0] ^= iv[0]; pl[1] ^= iv[1]; iv[0] = cv[0]; iv[1] = cv[1]; bptr[7] = (uint8_t)((pl[0] >> 24) & 0xff); bptr[6] = (uint8_t)((pl[0] >> 16) & 0xff); bptr[5] = (uint8_t)((pl[0] >> 8) & 0xff); bptr[4] = (uint8_t)(pl[0] & 0xff); bptr[3] = (uint8_t)((pl[1] >> 24) & 0xff); bptr[2] = (uint8_t)((pl[1] >> 16) & 0xff); bptr[1] = (uint8_t)((pl[1] >> 8) & 0xff); bptr[0] = (uint8_t)(pl[1] & 0xff); bptr += 8; } cm_bf_free(ctxt); /* Verify checksum: */ if (!km_aug_verify(buff, (unsigned)*keylen, &chksum0, &chksum)) { switch (pw_ctxt->debug_level) { case 0: fprintf(stderr, _("Password mismatch when extracting key\n")); break; case 1: /* fall through... */ default: fprintf(stderr, "Checksum mismatch in keyfile (builtin, %x != %x)\n", (unsigned)chksum, (unsigned)chksum0); break; } eflag = ERR_BADDECRYPT; } if (keyinfo->maxlen > 0 && *keylen > keyinfo->maxlen) { *keylen = keyinfo->maxlen; } *key = (uint8_t*)sec_realloc((void*)*key, (size_t)*keylen); memcpy(*key, buff, (size_t)*keylen); if (rd_errs > 0 || ferror(fp_key) != 0) { fprintf(stderr, _("Key-extraction failed for \"%s\"\n"), keyinfo->filename); eflag = ERR_BADFILE; } bail_out: if (buff != NULL) sec_free((void*)buff); if (passwd != NULL) sec_free((void*)passwd); if (hbuff != NULL) free((void*)hbuff); return eflag; } static int kmblti_put_key(bound_tgtdefn_t *boundtgt, const km_pw_context_t *pw_ctxt, const uint8_t *key, const int keylen, FILE *fp_key) /** Store key in sha1/blowfish encrypted file */ { cm_bf_ctxt_t *ctxt; uint8_t fversion, salt[kmblti_saltlen], hbuff[4], *buff=NULL, *bptr; uint32_t iv[2], cv[2], iterations = kmblti_default_iterations; char *passwd=NULL; size_t buffsz; blti_overrides_t *bltior=NULL; int cnt, wr_errs=0, eflag=ERR_NOERROR; eflag = km_get_passwd(boundtgt->tgt->ident, pw_ctxt, &passwd, 1, 1); if (eflag != ERR_NOERROR) goto bail_out; fversion = kmblti_version; if (boundtgt->km_data != NULL) { bltior = (blti_overrides_t*)boundtgt->km_data; fversion = bltior->fversion; } eflag = kmblti_checkversion(fversion); if (eflag != ERR_NOERROR) goto bail_out; /* Write key header: */ wr_errs += cm_fwrite((const void*)kmblti_magstr, kmblti_maglen, fp_key); wr_errs += cm_fwrite((const void*)&fversion, (size_t)1, fp_key); unpack_uint16(hbuff, (uint16_t)keylen); wr_errs += cm_fwrite((const void*)hbuff, (size_t)2, fp_key); /* Write iteration-count: */ if (fversion == 1) { unpack_uint32(hbuff, iterations); wr_errs += cm_fwrite((const void*)hbuff, (size_t)4, fp_key); } /* Generate salt & record in key-file: */ cm_generate_key(salt, sizeof(salt)); wr_errs += cm_fwrite((const void*)salt, sizeof(salt), fp_key); /* Augment key with simple checksum: */ buff = km_aug_key(key, (unsigned)keylen, 8u, &buffsz); /* Write encrypted key into keyfile: */ switch (fversion) { case 0: ctxt = kmblti_initcipher_v0(salt, passwd, strlen(passwd), iv); case 1: /* Fall-through: */ default: ctxt = kmblti_initcipher_v1(salt, passwd, strlen(passwd), iterations, iv); break; } cnt = buffsz / 8; bptr = buff; while (cnt--) { cv[0] = (((uint32_t)bptr[7]) << 24) | (((uint32_t)bptr[6]) << 16) | (((uint32_t)bptr[5]) << 8) | ((uint32_t)bptr[4]); cv[1] = (((uint32_t)bptr[3]) << 24) | (((uint32_t)bptr[2]) << 16) | (((uint32_t)bptr[1]) << 8) | ((uint32_t)bptr[0]); /* Apply cipher block-chaining: */ cv[0] ^= iv[0]; cv[1] ^= iv[1]; cm_bf_encipher(ctxt, cv, cv+1); iv[0] = cv[0]; iv[1] = cv[1]; bptr[7] = (uint8_t)((cv[0] >> 24) & 0xff); bptr[6] = (uint8_t)((cv[0] >> 16) & 0xff); bptr[5] = (uint8_t)((cv[0] >> 8) & 0xff); bptr[4] = (uint8_t)(cv[0] & 0xff); bptr[3] = (uint8_t)((cv[1] >> 24) & 0xff); bptr[2] = (uint8_t)((cv[1] >> 16) & 0xff); bptr[1] = (uint8_t)((cv[1] >> 8) & 0xff); bptr[0] = (uint8_t)(cv[1] & 0xff); bptr += 8; } wr_errs += cm_fwrite((const void*)buff, buffsz, fp_key); cm_bf_free(ctxt); if (wr_errs > 0 || ferror(fp_key) != 0) { fprintf(stderr, _("Failed to create new key file\n")); eflag = ERR_BADFILE; goto bail_out; } bail_out: if (buff != NULL) sec_free((void*)buff); if (passwd != NULL) sec_free((void*)passwd); return eflag; } /* * ==== Pure password based key-manager ==== */ static int kmpswd_init_algs(void) { /* Nothing needed */ return 0; } static int kmpswd_free_algs(void) { /* Nothing needed */ return 0; } static int kmpswd_bind(bound_tgtdefn_t *bound, FILE *fp_key) { keyinfo_t *keyinfo = &bound->tgt->key; int compat = 0; if (keyinfo->format != NULL) { compat = (strcmp(keyinfo->format, "password") == 0); } if (compat) { if (keyinfo->digestalg == NULL) { keyinfo->digestalg = cm_strdup("sha1"); } } return compat; } static unsigned kmpswd_get_properties(const bound_tgtdefn_t *boundtgt) { return (KM_PROP_HASPASSWD | KM_PROP_FIXEDLOC | KM_PROP_FORMATTED); } static int kmpswd_get_key(bound_tgtdefn_t *boundtgt, const km_pw_context_t *pw_ctxt, uint8_t **key, int *keylen, FILE *fp_key) { const keyinfo_t *keyinfo = &boundtgt->tgt->key; char *passwd=NULL; int eflag=ERR_NOERROR; const unsigned iterations = 1 << 14; eflag = km_get_passwd(boundtgt->tgt->ident, pw_ctxt, &passwd, 0, 0); if (eflag != ERR_NOERROR) goto bail_out; *keylen = (keyinfo->maxlen >= 0 ? keyinfo->maxlen : 16); cm_pwd_fortify(passwd, iterations, NULL, 16, key, (size_t)*keylen); /* { size_t pos; fprintf(stderr,"pass-key: 0x"); for (pos=0; pos<*keylen; ++pos) fprintf(stderr,"%02x",(unsigned)(*key)[pos]); fprintf(stderr,"\n"); } */ bail_out: if (passwd != NULL) sec_free((void*)passwd); return eflag; } static int kmpswd_put_key(bound_tgtdefn_t *boundtgt, const km_pw_context_t *pw_ctxt, const uint8_t *key, const int keylen, FILE *fp_key) { /* This operation isn't valid for a pure-password key */ return ERR_NOTSUPPORTED; } keymanager_t keymgr_pswd = { "password", 0, kmpswd_init_algs, kmpswd_free_algs, kmpswd_bind, kmpswd_get_properties, kmpswd_get_key, kmpswd_put_key, NULL #ifdef TESTING , NULL, NULL, 0 #endif }; keymanager_t keymgr_blti = { "builtin", 0, kmblti_init_algs, kmblti_free_algs, kmblti_bind, kmblti_get_properties, kmblti_get_key, kmblti_put_key, &keymgr_pswd #ifdef TESTING , NULL, NULL, CM_HASLEGACY #endif }; keymanager_t *kmblti_gethandle(void) { return &keymgr_blti; } /** @} */ /* * (C)Copyright 2007-2015, RW Penney */ cryptmount-5.2/armour-gcry.c0000644000175000017500000006476712613124531013162 00000000000000/* * Methods for encryption/security mechanisms for cryptmount * (C)Copyright 2005-2015, RW Penney */ /* This file is part of cryptmount cryptmount is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. cryptmount is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. */ #include #include #include #include #include #include "armour.h" #include "cryptmount.h" #include "utils.h" #ifdef TESTING # include "cmtesting.h" #endif /*! \addtogroup keymgrs * @{ */ /* * ==== libgcrypt key-management routines ==== */ #if HAVE_LIBGCRYPT # include /* * Keyfile format is: * char magic[7]="cm-gcry"; * char version; * uint16{LSB-first} cipher_blocklength, keylength; * char salt[kmgcry_saltlen]; * [block][block][block]; * (last block ends with uint32 xor-checksum of key * (post-padded with zeros to next 4-byte boundary), * post-padded with zeros to next cipher_blocklength boundary); */ const char kmgcry_magstr[]="cm-gcry", kmgcryossl_magstr[]="Salted__"; const char kmgcry_version = (char)0; static const size_t kmgcry_maglen = 7, /* = strlen(kmgcry_magstr) */ kmgcryossl_maglen = 8; enum { kmgcry_saltlen = 12, kmgcryossl_saltlen = 8 }; static struct kmgcry_mode { const char *name; unsigned mode; } kmgcry_modes[] = { { "ecb", GCRY_CIPHER_MODE_ECB }, { "cfb", GCRY_CIPHER_MODE_CFB }, { "cbc", GCRY_CIPHER_MODE_CBC }, { "ofb", GCRY_CIPHER_MODE_OFB }, { "cfb", GCRY_CIPHER_MODE_CFB }, { NULL, GCRY_CIPHER_MODE_NONE } }; static void kmgcry_tx_algnames(const keyinfo_t *keyinfo, char **algstr, char **modestr, char **dgststr) /* Parse/translate algorithm string into cipher/mode/digest fields */ { char *buff=NULL, *pos; struct map_t { const char *src, *dst; } /* map OpenSSL name to libgcrypt name */ *mapent; struct map_t ctable[] = { { "aes-128", "aes" }, { "aes128", "aes" }, { "aes-192", "aes192" }, { "aes-256", "aes256" }, { "bf", "blowfish" }, { "cast", "cast5" }, { "des3", "3des" }, { NULL, NULL } }; struct map_t htable[] = { { "rmd160", "ripemd160" }, { NULL, NULL } }; const char *default_cipher="blowfish", *default_mode="cbc", *default_hash="md5"; *algstr = NULL; *modestr = NULL; *dgststr = NULL; if (keyinfo->cipheralg != NULL && keyinfo->cipheralg[0] != '\0') { buff = cm_strdup(keyinfo->cipheralg); /* Extract cipher-mode from trailing -[^-]* of cipher-name: */ pos = strrchr(buff, '-'); if (pos != NULL) { *modestr = cm_strdup(pos + 1); *pos = '\0'; } /* Translate cipher-name to canonical libgcrypt name: */ for (mapent=ctable; mapent->src!=NULL; ++mapent) { if (cm_strcasecmp(buff, mapent->src) == 0) { *algstr = cm_strdup(mapent->dst); break; } } if (*algstr == NULL) { *algstr = buff; buff = NULL; } } if (*algstr == NULL) *algstr = cm_strdup(default_cipher); if (*modestr == NULL) *modestr = cm_strdup(default_mode); if (keyinfo->digestalg != NULL && keyinfo->digestalg[0] != '\0') { /* Translate digest-name to canonical libgcrypt name: */ for (mapent=htable; mapent->src!=NULL; ++mapent) { if (cm_strcasecmp(mapent->src, keyinfo->digestalg) == 0) { *dgststr = cm_strdup(mapent->dst); break; } } if (*dgststr == NULL) *dgststr = cm_strdup(keyinfo->digestalg); } if (*dgststr == NULL) *dgststr = cm_strdup(default_hash); if (buff != NULL) free((void*)buff); } static int kmgcry_get_algos(const keyinfo_t *keyinfo, int *cipher, int *ciphermode, int *digest) /* Get libgcrypt algorithms for encoding key */ { char *algstr=NULL, *mdstr=NULL, *dgststr=NULL; struct kmgcry_mode *cmd; int eflag=ERR_NOERROR; kmgcry_tx_algnames(keyinfo, &algstr, &mdstr, &dgststr); *cipher = gcry_cipher_map_name(algstr); if (*cipher == 0) { fprintf(stderr, _("Couldn't find libgcrypt cipher \"%s\"\n"), algstr); eflag = ERR_BADALGORITHM; goto bail_out; } for (cmd=kmgcry_modes; cmd->name!=NULL; ++cmd) { if (cm_strcasecmp(cmd->name,mdstr) == 0) break; } *ciphermode = cmd->mode; *digest = gcry_md_map_name(dgststr); if (*digest == 0) { fprintf(stderr, _("Couldn't find libgcrypt digest \"%s\"\n"), dgststr); eflag = ERR_BADALGORITHM; goto bail_out; } bail_out: if (algstr != NULL) free((void*)algstr); if (mdstr != NULL) free((void*)mdstr); if (dgststr != NULL) free((void*)dgststr); return eflag; } # ifdef TESTING static int kmgcry_test_getalgos() { keyinfo_t keyinfo; int cipher=0, mode=0, digest=0, cnt; struct cmap { const char *cname, *dname; const int cipher, mode, digest; } *mapptr; struct cmap map[] = { { "aes-128-cfb", "ripemd160", GCRY_CIPHER_AES, GCRY_CIPHER_MODE_CFB, GCRY_MD_RMD160 }, { "aes192-ECB", "md4", GCRY_CIPHER_AES192, GCRY_CIPHER_MODE_ECB, GCRY_MD_MD4 }, { "bf-cbc", "rmd160", GCRY_CIPHER_BLOWFISH, GCRY_CIPHER_MODE_CBC, GCRY_MD_RMD160 }, { "CAST5-CFB", "ripemd160", GCRY_CIPHER_CAST5, GCRY_CIPHER_MODE_CFB, GCRY_MD_RMD160 }, { "DES-ofb", "md5", GCRY_CIPHER_DES, GCRY_CIPHER_MODE_OFB, GCRY_MD_MD5 }, { "twofish", "sha1", GCRY_CIPHER_TWOFISH, GCRY_CIPHER_MODE_CBC, GCRY_MD_SHA1 }, { NULL, NULL, -1, -1, -1 } }; CM_TEST_START("libgcrypt algorithm-identification"); keyinfo.cipheralg = NULL; keyinfo.digestalg = NULL; CM_ASSERT_EQUAL(ERR_NOERROR, kmgcry_get_algos(&keyinfo, &cipher, &mode, &digest)); CM_ASSERT_DIFFERENT(0, cipher); CM_ASSERT_DIFFERENT(0, mode); CM_ASSERT_DIFFERENT(0, digest); keyinfo.cipheralg = ""; keyinfo.digestalg = ""; CM_ASSERT_EQUAL(ERR_NOERROR, kmgcry_get_algos(&keyinfo, &cipher, &mode, &digest)); for (mapptr=map,cnt=0; mapptr->cipher!=-1; ++mapptr,++cnt) { keyinfo.cipheralg = (char*)mapptr->cname; keyinfo.digestalg = (char*)mapptr->dname; CM_ASSERT_EQUAL(ERR_NOERROR, kmgcry_get_algos(&keyinfo, &cipher, &mode, &digest)); CM_ASSERT_EQUAL(mapptr->cipher, cipher); CM_ASSERT_EQUAL(mapptr->mode, mode); CM_ASSERT_EQUAL(mapptr->digest, digest); } CM_ASSERT_DIFFERENT(0, cnt); CM_TEST_OK(); } # endif /* TESTING */ typedef void kmgcry_keybuilder_t(gcry_md_hd_t md, int digest, const size_t mdlen, const uint8_t *salt, const uint8_t *pass, const size_t passlen, uint8_t *ckey, const size_t ckeysz, uint8_t *civ, const size_t civsz); static void kmgcry_keybuilder(gcry_md_hd_t md_hand, int digest, const size_t mdlen, const uint8_t *salt, const uint8_t *pass, const size_t passlen, uint8_t *ckey, const size_t ckeysz, uint8_t *civ, const size_t civsz) /*! Generate cipher key & IV from password & salt (default variant) */ { size_t kpos, ivpos, pos; uint8_t *buff; kpos = ivpos = 0; do { /* Fold-together password & salt using message-digest: */ gcry_md_reset(md_hand); gcry_md_write(md_hand, (const void*)salt, (size_t)kmgcry_saltlen); gcry_md_write(md_hand, (const void*)pass, passlen); if (kpos > 0) { gcry_md_write(md_hand, (const void*)ckey, kpos); } if (ivpos > 0) { gcry_md_write(md_hand, (const void*)civ, ivpos); } buff = gcry_md_read(md_hand, digest); /* Transfer message digest into cipher key & initialization vector: */ pos = 0; while (kpos < ckeysz && pos < mdlen) { ckey[kpos++] = buff[pos++]; } while (ivpos < civsz && pos < mdlen) { civ[ivpos++] = buff[pos++]; } } while (kpos < ckeysz || ivpos < civsz); } static void kmgcryossl_keybuilder(gcry_md_hd_t md_hand, int digest, const size_t mdlen, const uint8_t *salt, const uint8_t *pass, const size_t passlen, uint8_t *ckey, const size_t ckeysz, uint8_t *civ, const size_t civsz) /*! Generate cipher key & IV from password & salt (a la OpenSSL) */ { size_t kpos, ivpos, pos; uint8_t *buff, *prev=NULL; unsigned cnt=0; prev = (uint8_t*)sec_realloc(prev, mdlen); kpos = ivpos = 0; do { /* Fold-together password & salt using message-digest: */ gcry_md_reset(md_hand); if (cnt > 0) { gcry_md_write(md_hand, (const void*)prev, mdlen); } gcry_md_write(md_hand, (const void*)pass, passlen); gcry_md_write(md_hand, (const void*)salt, kmgcryossl_saltlen); buff = gcry_md_read(md_hand, digest); /* Transfer message digest into cipher key & initialization vector: */ pos = 0; while (kpos < ckeysz && pos < mdlen) { ckey[kpos++] = buff[pos++]; } while (ivpos < civsz && pos < mdlen) { civ[ivpos++] = buff[pos++]; } /* Keep copy of digest to add to next fold: */ memcpy((void*)prev, (const void*)buff, mdlen); ++cnt; } while (kpos < ckeysz || ivpos < civsz); sec_free(prev); } static int kmgcry_initcipher(int cipher, int ciphermode, int digest, const uint8_t *salt, kmgcry_keybuilder_t keybuilder, const char *pass, size_t passlen, gcry_cipher_hd_t *hd) /*! Initialize block cipher from given password, salt & hashing scheme */ { gcry_md_hd_t md_hand; size_t ckeysz, cblksz, mdlen; uint8_t *ckey=NULL, *civ=NULL; int eflag=ERR_BADALGORITHM; if (gcry_cipher_open(hd, cipher, ciphermode, 0) != 0) { fprintf(stderr, "Cannot open libgcrypt cipher[%d,%d]\n", cipher, ciphermode); goto bail_out; } (void)gcry_cipher_algo_info(cipher, GCRYCTL_GET_KEYLEN, NULL, &ckeysz); ckey = (uint8_t*)sec_realloc(ckey, ckeysz); (void)gcry_cipher_algo_info(cipher, GCRYCTL_GET_BLKLEN, NULL, &cblksz); civ = (uint8_t*)sec_realloc(civ, cblksz); /* generate cipher key & iv by hashing password: */ if (keybuilder == NULL) keybuilder = kmgcry_keybuilder; if (gcry_md_open(&md_hand, digest, 0) != 0) { fprintf(stderr, "Cannot open libgcrypt digest[%d]\n", digest); goto bail_out; } mdlen = gcry_md_get_algo_dlen(digest); keybuilder(md_hand, digest, mdlen, salt, (const uint8_t*)pass, passlen, ckey, ckeysz, civ, cblksz); gcry_md_close(md_hand); /* setup cipher initial state: */ if (gcry_cipher_setkey(*hd, (void*)ckey, ckeysz) != 0 || gcry_cipher_setiv(*hd, (void*)civ, cblksz) != 0) { fprintf(stderr, "Failed to setup libgcrypt cipher iv[%d,%d]\n", (int)ckeysz, (int)cblksz); goto bail_out; } sec_free(ckey); sec_free(civ); eflag = ERR_NOERROR; bail_out: return eflag; } static int kmgcry_init_algs() { if (!gcry_control(GCRYCTL_INITIALIZATION_FINISHED_P)) { (void)gcry_check_version(NULL); /* Initializes library as side-effect */ (void)gcry_control(GCRYCTL_INITIALIZATION_FINISHED, 0); } return 0; } static int kmgcry_free_algs() { /* Nothing needed */ return 0; } static int kmgcry_bind(bound_tgtdefn_t *bound, FILE *fp_key) { keyinfo_t *keyinfo = &bound->tgt->key; char buff[32]; int compat = 0; if (keyinfo->format != NULL) { compat = (strcmp(keyinfo->format, "libgcrypt") == 0); } else { if (fp_key != NULL) { /* Check header of existing key-file: */ compat = (cm_fread((void*)buff, kmgcry_maglen, fp_key) == 0 && strncmp(buff, kmgcry_magstr, kmgcry_maglen) == 0); } } if (compat) { if (keyinfo->digestalg == NULL) { keyinfo->digestalg = cm_strdup("md5"); } if (keyinfo->cipheralg == NULL) { keyinfo->cipheralg = cm_strdup("blowfish"); } } return compat; } static int kmgcryossl_bind(bound_tgtdefn_t *bound, FILE *fp_key) /*! OpenSSL-compatibility version of kmgcy_bind */ { keyinfo_t *keyinfo = &bound->tgt->key; char buff[32]; int compat = 0; if (keyinfo->format != NULL) { compat |= (strcmp(keyinfo->format, "openssl-compat") == 0); compat |= (strcmp(keyinfo->format, "openssl") == 0); } else { if (fp_key != NULL) { /* Check header of existing key-file: */ compat = (cm_fread((void*)buff, kmgcryossl_maglen, fp_key) == 0 && strncmp(buff, kmgcryossl_magstr, kmgcryossl_maglen) == 0); } } if (compat) { if (keyinfo->digestalg == NULL) { keyinfo->digestalg = cm_strdup("md5"); } if (keyinfo->cipheralg == NULL) { keyinfo->cipheralg = cm_strdup("blowfish"); } } return compat; } static unsigned kmgcry_get_properties(const bound_tgtdefn_t *boundtgt) { return (KM_PROP_HASPASSWD | KM_PROP_NEEDSKEYFILE); } static int kmgcry_get_key(bound_tgtdefn_t *boundtgt, const km_pw_context_t *pw_ctxt, uint8_t **key, int *keylen, FILE *fp_key) /*! Extract key from libgcrypt-encrypted file */ { const keyinfo_t *keyinfo = &boundtgt->tgt->key; gcry_cipher_hd_t chd; char *passwd=NULL; uint8_t *hbuff = NULL, salt[kmgcry_saltlen], *buff = NULL, *bptr; size_t cblksz; uint32_t chksum, chksum0; int cnt, rd_errs=0, cipher, ciphermode, digest, eflag=ERR_NOERROR; *key = NULL; *keylen = 0; hbuff = (uint8_t*)sec_realloc(hbuff, (kmgcry_maglen + 4)); eflag = kmgcry_get_algos(keyinfo, &cipher, &ciphermode, &digest); if (eflag != ERR_NOERROR) goto bail_out; gcry_cipher_algo_info(cipher, GCRYCTL_GET_BLKLEN, NULL, &cblksz); eflag = km_get_passwd(boundtgt->tgt->ident, pw_ctxt, &passwd, 0, 0); if (eflag != ERR_NOERROR) goto bail_out; /* Read key header: */ rd_errs += cm_fread((void*)hbuff, kmgcry_maglen, fp_key); if (strncmp((const char*)hbuff, kmgcry_magstr, kmgcry_maglen) != 0) { fprintf(stderr, _("Bad keyfile format (libgcrypt)\n")); eflag = ERR_BADFILE; goto bail_out; } rd_errs += cm_fread((void*)hbuff, (size_t)1, fp_key); if (hbuff[0] != '\0') { fprintf(stderr, "Bad keyfile version [%d]\n", (int)buff[0]); eflag = ERR_BADFILE; goto bail_out; } rd_errs += cm_fread((void*)hbuff, (size_t)4, fp_key); if (pack_uint16(hbuff) != cblksz) { fprintf(stderr, "Mismatched cipher block size\n"); eflag = ERR_BADFILE; goto bail_out; } *keylen = pack_uint16(hbuff + 2); /* Read salt from keyfile: */ rd_errs += cm_fread((void*)salt, sizeof(salt), fp_key); /* Read encrypted key from keyfile: */ eflag = kmgcry_initcipher(cipher, ciphermode, digest, salt, NULL, passwd, strlen(passwd), &chd); if (eflag != ERR_NOERROR) goto bail_out; cnt = km_aug_keysz((unsigned)*keylen, (unsigned)cblksz) / cblksz; buff = (uint8_t*)sec_realloc(buff, cnt * cblksz); bptr = buff; while (cnt--) { rd_errs += cm_fread((void*)bptr, cblksz, fp_key); gcry_cipher_decrypt(chd, (void*)bptr, cblksz, NULL, 0); bptr += cblksz; } gcry_cipher_close(chd); /* Verify checksum: */ if (!km_aug_verify(buff, (unsigned)*keylen, &chksum0, &chksum)) { switch (pw_ctxt->debug_level) { case 0: fprintf(stderr, _("Password mismatch when extracting key\n")); break; case 1: /* fall through... */ default: fprintf(stderr, _("Checksum mismatch in keyfile (gcry, %x != %x)\n"), (unsigned)chksum, (unsigned)chksum0); break; } eflag = ERR_BADDECRYPT; } if (keyinfo->maxlen > 0 && *keylen > keyinfo->maxlen) { *keylen = keyinfo->maxlen; } *key = (uint8_t*)sec_realloc((void*)*key, (size_t)*keylen); memcpy(*key, buff, (size_t)*keylen); if (rd_errs > 0 || ferror(fp_key) != 0) { fprintf(stderr, _("Key-extraction failed for \"%s\"\n"), keyinfo->filename); eflag = ERR_BADFILE; } bail_out: if (buff != NULL) sec_free((void*)buff); if (passwd != NULL) sec_free((void*)passwd); if (hbuff != NULL) sec_free((void*)hbuff); return eflag; } static int kmgcry_put_key(bound_tgtdefn_t *boundtgt, const km_pw_context_t *pw_ctxt, const uint8_t *key, const int keylen, FILE *fp_key) /*! Store key in libgcrypt-encrypted file */ { const keyinfo_t *keyinfo = &boundtgt->tgt->key; gcry_cipher_hd_t chd; char *passwd=NULL; uint8_t hbuff[4], salt[kmgcry_saltlen], *buff=NULL, *bptr; size_t buffsz, cblksz; int cnt, wr_errs = 0, cipher, ciphermode, digest, eflag=ERR_NOERROR; eflag = kmgcry_get_algos(keyinfo, &cipher, &ciphermode, &digest); if (eflag != ERR_NOERROR) goto bail_out; gcry_cipher_algo_info(cipher, GCRYCTL_GET_BLKLEN, NULL, &cblksz); eflag = km_get_passwd(boundtgt->tgt->ident, pw_ctxt, &passwd, 1, 1); if (eflag != ERR_NOERROR) goto bail_out; /* Write key header: */ wr_errs += cm_fwrite((const void*)kmgcry_magstr, kmgcry_maglen, fp_key); wr_errs += cm_fwrite((const void*)&kmgcry_version, (size_t)1, fp_key); unpack_uint16(hbuff, (uint16_t)cblksz); unpack_uint16(hbuff + 2, (uint16_t)keylen); wr_errs += cm_fwrite((const void*)hbuff, (size_t)4, fp_key); /* Generate salt & record in keyfile: */ cm_generate_key(salt, sizeof(salt)); wr_errs += cm_fwrite((const void*)salt, sizeof(salt), fp_key); /* Augment key with simple checksum: */ buff = km_aug_key(key, (unsigned)keylen, (unsigned)cblksz, &buffsz); /* Write encrypted key into keyfile: */ eflag = kmgcry_initcipher(cipher, ciphermode, digest, salt, NULL, passwd, strlen(passwd), &chd); if (eflag != ERR_NOERROR) goto bail_out; cnt = buffsz / cblksz; bptr = buff; while (cnt--) { gcry_cipher_encrypt(chd, (void*)bptr, cblksz, NULL, 0); wr_errs += cm_fwrite((const void*)bptr, cblksz, fp_key); bptr += cblksz; } gcry_cipher_close(chd); if (wr_errs > 0 || ferror(fp_key) != 0) { fprintf(stderr, _("Failed to create new key file\n")); eflag = ERR_BADFILE; goto bail_out; } bail_out: if (buff != NULL) sec_free((void*)buff); if (passwd != NULL) sec_free((void*)passwd); return eflag; } #if USE_GCRYOSSL static int kmgcryossl_get_key(bound_tgtdefn_t *boundtgt, const km_pw_context_t *pw_ctxt, uint8_t **key, int *keylen, FILE *fp_key) /*! Extract key from OpenSSL-compatible file via libgcrypt */ { const keyinfo_t *keyinfo = &boundtgt->tgt->key; gcry_cipher_hd_t chd; char *passwd=NULL; uint8_t *hbuff=NULL, salt[kmgcryossl_saltlen], *buff=NULL; size_t cblksz, buffsz=0, pos, ofs, idx; int kbad=0, cipher, ciphermode, digest, rd_errs=0, eflag=ERR_NOERROR; *key = NULL; *keylen = 0; hbuff = (uint8_t*)sec_realloc(hbuff, kmgcryossl_maglen); eflag = kmgcry_get_algos(keyinfo, &cipher, &ciphermode, &digest); if (eflag != ERR_NOERROR) goto bail_out; gcry_cipher_algo_info(cipher, GCRYCTL_GET_BLKLEN, NULL, &cblksz); eflag = km_get_passwd(boundtgt->tgt->ident, pw_ctxt, &passwd, 0, 0); if (eflag != ERR_NOERROR) goto bail_out; /* Read key header: */ rd_errs += cm_fread((void*)hbuff, kmgcryossl_maglen, fp_key); if (strncmp((const char*)hbuff, kmgcryossl_magstr, kmgcryossl_maglen) != 0) { fprintf(stderr, _("Bad keyfile format (openssl-compat)\n")); eflag = ERR_BADFILE; goto bail_out; } /* Read salt from keyfile: */ rd_errs += cm_fread((void*)salt, sizeof(salt), fp_key); /* read encrypted key from keyfile: */ eflag = kmgcry_initcipher(cipher, ciphermode, digest, salt, kmgcryossl_keybuilder, passwd, strlen(passwd), &chd); if (eflag != ERR_NOERROR) goto bail_out; pos = 0; while (!feof(fp_key)) { if ((pos + cblksz) > buffsz) { buffsz = (buffsz * 2) + 4 * cblksz; buff = (uint8_t*)sec_realloc(buff, buffsz); } if (cm_fread((void*)(buff + pos), cblksz, fp_key) != 0) break; gcry_cipher_decrypt(chd, (void*)(buff + pos), cblksz, NULL, 0); pos += cblksz; } gcry_cipher_close(chd); /* Remove & check end-marker from key-data: */ ofs = 0; idx = 0; kbad = 0; if (pos > 0) ofs = buff[pos - 1]; else kbad |= 1; if (ofs > cblksz) kbad |= 1; while (idx < ofs && !kbad) { kbad |= (buff[--pos] != ofs); ++idx; } if (kbad) { switch (pw_ctxt->debug_level) { case 0: fprintf(stderr, _("Password mismatch when extracting key\n")); break; case 1: /* fall through... */ default: fprintf(stderr, _("Checksum mismatch in keyfile (openssl-compat, ofs=%u,idx=%u)\n"), (unsigned)ofs, (unsigned)idx); break; } eflag = ERR_BADDECRYPT; } *keylen = pos; if (keyinfo->maxlen > 0 && *keylen > keyinfo->maxlen) { *keylen = keyinfo->maxlen; } *key = (uint8_t*)sec_realloc((void*)*key, (size_t)*keylen); memcpy(*key, buff, (size_t)*keylen); if (rd_errs > 0 || ferror(fp_key) != 0) { fprintf(stderr, _("Key-extraction failed for \"%s\"\n"), keyinfo->filename); eflag = ERR_BADFILE; } bail_out: if (buff != NULL) sec_free((void*)buff); if (passwd != NULL) sec_free((void*)passwd); if (hbuff != NULL) sec_free((void*)hbuff); return eflag; } static int kmgcryossl_put_key(bound_tgtdefn_t *boundtgt, const km_pw_context_t *pw_ctxt, const uint8_t *key, const int keylen, FILE *fp_key) /*! Store key in OpenSSL-compatible file via libgcrypt */ { const keyinfo_t *keyinfo = &boundtgt->tgt->key; gcry_cipher_hd_t chd; char *passwd = NULL; uint8_t salt[kmgcryossl_saltlen], *buff = NULL; size_t buffsz, cblksz, pos; int wr_errs=0, cipher, ciphermode, digest, eflag=ERR_NOERROR; eflag = kmgcry_get_algos(keyinfo, &cipher, &ciphermode, &digest); if (eflag != ERR_NOERROR) goto bail_out; gcry_cipher_algo_info(cipher, GCRYCTL_GET_BLKLEN, NULL, &cblksz); eflag = km_get_passwd(boundtgt->tgt->ident, pw_ctxt, &passwd, 1, 1); if (eflag != ERR_NOERROR) goto bail_out; /* Write key header: */ wr_errs += cm_fwrite((const void*)kmgcryossl_magstr, kmgcryossl_maglen, fp_key); /* Generate salt & record in keyfile: */ cm_generate_key(salt, sizeof(salt)); wr_errs += cm_fwrite((const void*)salt, sizeof(salt), fp_key); /* Pad key-data with end-marker: */ buffsz = cblksz * ((keylen + cblksz) / cblksz); buff = (uint8_t*)sec_realloc(buff, buffsz); memcpy((void*)buff, (const void*)key, (size_t)keylen); for (pos=keylen; pos 0 || ferror(fp_key) != 0) { fprintf(stderr, _("Failed to create new key file\n")); eflag = ERR_BADFILE; goto bail_out; } bail_out: if (buff != NULL) sec_free((void*)buff); if (passwd != NULL) sec_free((void*)passwd); return eflag; } #endif /* USE_GCRYOSSL */ # ifdef TESTING static int kmgcry_test_hash() { gcry_md_hd_t mdcontext; int algo; uint8_t *mdval = NULL; size_t mdlen, i; unsigned q; const char *str = "noisy\n"; const char *hash = "7c1c9261fa774475ec1c0d887eaf00c19b0eb218"; CM_TEST_START("libgcrypt hashing"); gcry_md_open(&mdcontext, GCRY_MD_SHA1, 0); gcry_md_write(mdcontext, (const void*)str, strlen(str)); gcry_md_final(mdcontext); algo = gcry_md_get_algo(mdcontext); mdlen = gcry_md_get_algo_dlen(algo); mdval = gcry_md_read(mdcontext, algo); CM_ASSERT_DIFFERENT(NULL, mdval); CM_ASSERT_EQUAL(strlen(hash)/2, mdlen); for (i=0; i #include #include #include #include #include #include #if HAVE_NANOSLEEP # include #endif #if HAVE_LIBUDEV # include #endif #if defined(HAVE_LIBDEVMAP) # include #else # error libdevmapper headers are needed to build cryptmount #endif #include "cryptmount.h" #include "dmutils.h" struct udev_queue_loc { const char *path; int is_file; } udev_queue_locations[] = { { "/run/udev/queue.bin", 1 }, /* Debian-7.0 has queue beneath /run */ { "/dev/.udev/queue.bin", 1 }, /* Recent udev has file in /dev/.udev */ { "/dev/.udev/queue", 0 } /* Older udev has directory of events */ }; int udev_queue_size(const char *path); int udev_active_dir(const char *path, time_t starttime, double timeout); struct dm_task *devmap_prepare(int type, const char *ident) /*! Prepare device-mapper task structure */ { struct dm_task *dmt=NULL; dmt = dm_task_create(type); if (dmt != NULL) { if (!dm_task_set_name(dmt, ident)) { dm_task_destroy(dmt); dmt = NULL; } } return dmt; } int devmap_path(char **buff, const char *ident) /* create device-mapper full pathname from target description */ { size_t pfxlen, sfxlen; pfxlen = strlen(dm_dir()); sfxlen = strlen(ident); *buff = (char*)realloc((void*)(*buff), (pfxlen + sfxlen + 2)); snprintf(*buff, (pfxlen + sfxlen + 2), "%s/%s", dm_dir(), ident); return (int)(pfxlen + sfxlen + 1); } int devmap_create(const char *ident, uint64_t blk0, uint64_t blklen, const char *tgttype, const char *params) /* create new device-mapper target & associated device node: */ { struct dm_task *dmt=NULL; struct dm_info dmi; char *devpath=NULL; struct stat sbuff; mode_t mode; dev_t dev; /* create device-mapper target: */ if ((dmt = devmap_prepare(DM_DEVICE_CREATE, ident)) == NULL) { fprintf(stderr, "failed to initialize device-mapper task\n"); return ERR_DMSETUP; } if (!dm_task_add_target(dmt, blk0, blklen, tgttype, params)) { fprintf(stderr, "failed to add device-mapper target \"%s\" { %s }\n", tgttype, params); return ERR_DMSETUP; } if (!dm_task_run(dmt)) { fprintf(stderr, "device-mapper task failed\n"); return ERR_DMSETUP; } if (!dm_task_get_info(dmt, &dmi)) { fprintf(stderr, "device-mapper info not available\n"); return ERR_DMSETUP; } dm_task_destroy(dmt); /* create device node (below /dev?): */ mode = S_IFBLK | S_IRUSR | S_IWUSR; dev = makedev(dmi.major, dmi.minor); devmap_path(&devpath, ident); if (stat(devpath, &sbuff) != 0 && mknod(devpath, mode, dev) != 0) { fprintf(stderr, "device \"%s\" (%u,%u) creation failed\n", devpath, dmi.major, dmi.minor); return ERR_BADDEVICE; } if (devpath != NULL) free((void*)devpath); return ERR_NOERROR; } int devmap_dependencies(const char *ident, unsigned *count, dev_t **devids) { struct dm_task *dmt=NULL; struct dm_deps *deps; unsigned i; int eflag=ERR_NOERROR; if ((dmt = devmap_prepare(DM_DEVICE_DEPS, ident)) == NULL) { fprintf(stderr, "failed to initialize device-mapper task\n"); eflag = ERR_DMSETUP; goto bail_out; } if (!dm_task_run(dmt)) { fprintf(stderr, "device-mapper task failed\n"); eflag = ERR_DMSETUP; goto bail_out; } if ((deps = dm_task_get_deps(dmt)) == NULL) { eflag = ERR_DMSETUP; goto bail_out; } /* copy device info into fresh array: */ *count = deps->count; *devids = (dev_t*)malloc((size_t)(deps->count * sizeof(dev_t))); for (i=0; icount; ++i) (*devids)[i] = (dev_t)deps->device[i]; bail_out: if (dmt != NULL) dm_task_destroy(dmt); return eflag; } int devmap_remove(const char *ident) /* remove device-mapper target and associated device */ { struct dm_task *dmt=NULL; struct dm_info dmi; struct stat sbuff; char *devpath=NULL; int eflag = ERR_NOERROR; /* check device-mapper target is configured & get info: */ if (!is_configured(ident, &dmi)) { eflag = ERR_BADDEVICE; goto bail_out; } /* remove device node (below /dev?): */ devmap_path(&devpath, ident); if (stat(devpath, &sbuff) != 0) { fprintf(stderr, "unable to stat() device node\n"); eflag = ERR_DMSETUP; goto bail_out; } if ((uint32_t)major(sbuff.st_rdev) == dmi.major && (uint32_t)minor(sbuff.st_rdev) == dmi.minor) { unlink(devpath); } else { fprintf(stderr,"device \"%s\" doesn't match device-mapper info (%d,%d)\n", devpath, dmi.major, dmi.minor); eflag = ERR_BADDEVICE; goto bail_out; } /* remove device-mapper target: */ if ((dmt = devmap_prepare(DM_DEVICE_REMOVE, ident)) == NULL) { fprintf(stderr, "failed to initialize device-mapper task\n"); eflag = ERR_DMSETUP; goto bail_out; } if (!dm_task_run(dmt)) { fprintf(stderr, "device-mapper task failed\n"); eflag = ERR_DMSETUP; goto bail_out; } bail_out: if (dmt != NULL) dm_task_destroy(dmt); if (devpath != NULL) free((void*)devpath); return eflag; } int is_configured(const char *ident, struct dm_info *dminfo) /* check if device-mapper target has been setup & (optionally) get info */ { struct dm_task *dmt=NULL; struct dm_info *dmi, dmi_local; int config=1; dmi = (dminfo != NULL ? dminfo : &dmi_local); /* create device-mapper target: */ if (ident == NULL || (dmt = devmap_prepare(DM_DEVICE_INFO, ident)) == NULL || !dm_task_run(dmt) || !dm_task_get_info(dmt, dmi)) { config = 0; } if (dmt != NULL) dm_task_destroy(dmt); return config; } int udev_settle() /*! Allow time for udev events to be processed */ { struct udev_queue_loc *udev_mode; double totdelay = 0.0, inc; time_t starttime; struct stat sbuff; #if HAVE_NANOSLEEP struct timespec delay; #endif int settling; const double timeout = 10.0; #if HAVE_LIBUDEV struct udev *udev_ctx; struct udev_queue *udev_qu; #endif /* This routine mitigates apparent race-conditions * between udev events which may temporarily take ownership of * and rename newly created devices, thereby causing * other processes to fail if they try to destroy * or reconfigure those devices at the same time. * Whether this is the responsibilty of kernel-level functions * to resolve, or for user applications to mitigate, * is open to debate. */ time(&starttime); #if HAVE_LIBUDEV udev_ctx = udev_new(); udev_selinux_init(udev_ctx); udev_qu = udev_queue_new(udev_ctx); #endif /* Try to find location and type of udev event queue: */ udev_mode = udev_queue_locations; while (udev_mode->is_file) { if (stat(udev_mode->path, &sbuff) == 0) break; ++udev_mode; } #if HAVE_NANOSLEEP delay.tv_sec = 0.0; delay.tv_nsec = 100e6; inc = delay.tv_sec + delay.tv_nsec * 1e-9; #else inc = 1.0; #endif /* Keep waiting until there are no more queued udev events: */ do { #if HAVE_NANOSLEEP nanosleep(&delay, NULL); #else sleep((unsigned)floor(inc + 0.5)); #endif totdelay += inc; #if HAVE_LIBUDEV settling = !udev_queue_get_queue_is_empty(udev_qu); #else settling = 0; if (udev_mode->is_file) { /* Current versions of udev place events in a single file: */ settling |= (udev_queue_size(udev_mode->path) > 0); } else { /* Older versions of udev use a directory of event files: */ settling |= udev_active_dir(udev_mode->path, starttime, timeout); } #endif /* HAVE_LIBUDEV */ } while (settling && totdelay < timeout); #if HAVE_LIBUDEV udev_queue_unref(udev_qu); udev_selinux_exit(udev_ctx); udev_unref(udev_ctx); #endif return settling; } int udev_queue_size(const char *path) /*! Count number of unprocessed udev events in queue.bin file */ { FILE *fp; unsigned long long seqnum; unsigned short skiplen; int nqueued = 0; fp = fopen(path, "rb"); if (fp == NULL) return 0; if (fread((void*)&seqnum, sizeof(seqnum), (size_t)1, fp) != 1) return 0; for (;;) { skiplen = 0; if (fread((void*)&seqnum, sizeof(seqnum), (size_t)1, fp) != 1 || fread((void*)&skiplen, sizeof(skiplen), (size_t)1, fp) != 1) break; if (skiplen > 0) { void *buff = malloc((size_t)skiplen); nqueued += (fread(buff, (size_t)skiplen, (size_t)1, fp) == 1); free(buff); } else { --nqueued; } } fclose(fp); return nqueued; } /*! * Check whether the udev queue directory (e.g. /dev/.udev/queue) * has been recently modified. * This is only relevant to older versions of udev (e.g. 0.105). */ int udev_active_dir(const char *path, time_t starttime, double timeout) { struct stat sbuff; int settling = 0; /* If the event directory exists, then we either have active events, or possibly it is a remnant from an old udev process. */ if (stat(path, &sbuff) == 0) { settling |= ((starttime - sbuff.st_mtime) < 100 * timeout); } return settling; } /* * (C)Copyright 2005-2015, RW Penney */ cryptmount-5.2/cmtab.example0000644000175000017500000000244212400360510013161 00000000000000# Sample configuration file for cryptmount # the following target uses a raw file to contain the encrypted fs # (e.g. created by "dd if=/dev/zero of=/home/crypt.fs bs=1M count=128) # cryptmount will automatically configure a vacant loopback device on mounting crypt_basic { dev=/home/crypt.fs dir=/mnt/crypt fstype=ext2 mountoptions=defaults cipher=aes keyfile=/home/secretiveuser/crypt.key keyformat=builtin } # the following target uses part of a raw disk partition as the encrypted fs: # (sectors 512-16895 are used here. Remove the 'startsector' and 'numsector' # parameters to use the whole partition.) crypt_hdb63 { dev=/dev/hdb63 startsector=512 numsectors=16384 dir=/mnt/crypt63 fstype=ext3 mountoptions=defaults \ cipher=serpent # filesystem encryption # information about file used to store decryption key: keyfile=/usr/local/etc/cryptmount/crypt_hdb63.key keyformat=openssl keyhash=md5 keycipher=bf-cbc } # the following target uses part of a raw disk partition to create # an encrypted swap (paging) area. crypto_swap { dev=/dev/hdb63 startsector=16896 numsectors=1024 fstype=swap flags=mkswap cipher=twofish keyfile=/dev/random keymaxlen=16 keyformat=raw bootaction=swap } cryptmount-5.2/aclocal.m40000644000175000017500000040471212613124570012376 00000000000000# generated automatically by aclocal 1.14.1 -*- Autoconf -*- # Copyright (C) 1996-2013 Free Software Foundation, Inc. # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. m4_ifndef([AC_CONFIG_MACRO_DIRS], [m4_defun([_AM_CONFIG_MACRO_DIRS], [])m4_defun([AC_CONFIG_MACRO_DIRS], [_AM_CONFIG_MACRO_DIRS($@)])]) m4_ifndef([AC_AUTOCONF_VERSION], [m4_copy([m4_PACKAGE_VERSION], [AC_AUTOCONF_VERSION])])dnl m4_if(m4_defn([AC_AUTOCONF_VERSION]), [2.69],, [m4_warning([this file was generated for autoconf 2.69. You have another version of autoconf. It may work, but is not guaranteed to. If you have problems, you may need to regenerate the build system entirely. To do so, use the procedure documented by the package, typically 'autoreconf'.])]) # gettext.m4 serial 66 (gettext-0.18.2) dnl Copyright (C) 1995-2014 Free Software Foundation, Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, dnl with or without modifications, as long as this notice is preserved. dnl dnl This file can can be used in projects which are not available under dnl the GNU General Public License or the GNU Library General Public dnl License but which still want to provide support for the GNU gettext dnl functionality. dnl Please note that the actual code of the GNU gettext library is covered dnl by the GNU Library General Public License, and the rest of the GNU dnl gettext package package is covered by the GNU General Public License. dnl They are *not* in the public domain. dnl Authors: dnl Ulrich Drepper , 1995-2000. dnl Bruno Haible , 2000-2006, 2008-2010. dnl Macro to add for using GNU gettext. dnl Usage: AM_GNU_GETTEXT([INTLSYMBOL], [NEEDSYMBOL], [INTLDIR]). dnl INTLSYMBOL can be one of 'external', 'no-libtool', 'use-libtool'. The dnl default (if it is not specified or empty) is 'no-libtool'. dnl INTLSYMBOL should be 'external' for packages with no intl directory, dnl and 'no-libtool' or 'use-libtool' for packages with an intl directory. dnl If INTLSYMBOL is 'use-libtool', then a libtool library dnl $(top_builddir)/intl/libintl.la will be created (shared and/or static, dnl depending on --{enable,disable}-{shared,static} and on the presence of dnl AM-DISABLE-SHARED). If INTLSYMBOL is 'no-libtool', a static library dnl $(top_builddir)/intl/libintl.a will be created. dnl If NEEDSYMBOL is specified and is 'need-ngettext', then GNU gettext dnl implementations (in libc or libintl) without the ngettext() function dnl will be ignored. If NEEDSYMBOL is specified and is dnl 'need-formatstring-macros', then GNU gettext implementations that don't dnl support the ISO C 99 formatstring macros will be ignored. dnl INTLDIR is used to find the intl libraries. If empty, dnl the value '$(top_builddir)/intl/' is used. dnl dnl The result of the configuration is one of three cases: dnl 1) GNU gettext, as included in the intl subdirectory, will be compiled dnl and used. dnl Catalog format: GNU --> install in $(datadir) dnl Catalog extension: .mo after installation, .gmo in source tree dnl 2) GNU gettext has been found in the system's C library. dnl Catalog format: GNU --> install in $(datadir) dnl Catalog extension: .mo after installation, .gmo in source tree dnl 3) No internationalization, always use English msgid. dnl Catalog format: none dnl Catalog extension: none dnl If INTLSYMBOL is 'external', only cases 2 and 3 can occur. dnl The use of .gmo is historical (it was needed to avoid overwriting the dnl GNU format catalogs when building on a platform with an X/Open gettext), dnl but we keep it in order not to force irrelevant filename changes on the dnl maintainers. dnl AC_DEFUN([AM_GNU_GETTEXT], [ dnl Argument checking. ifelse([$1], [], , [ifelse([$1], [external], , [ifelse([$1], [no-libtool], , [ifelse([$1], [use-libtool], , [errprint([ERROR: invalid first argument to AM_GNU_GETTEXT ])])])])]) ifelse(ifelse([$1], [], [old])[]ifelse([$1], [no-libtool], [old]), [old], [AC_DIAGNOSE([obsolete], [Use of AM_GNU_GETTEXT without [external] argument is deprecated.])]) ifelse([$2], [], , [ifelse([$2], [need-ngettext], , [ifelse([$2], [need-formatstring-macros], , [errprint([ERROR: invalid second argument to AM_GNU_GETTEXT ])])])]) define([gt_included_intl], ifelse([$1], [external], ifdef([AM_GNU_GETTEXT_][INTL_SUBDIR], [yes], [no]), [yes])) define([gt_libtool_suffix_prefix], ifelse([$1], [use-libtool], [l], [])) gt_NEEDS_INIT AM_GNU_GETTEXT_NEED([$2]) AC_REQUIRE([AM_PO_SUBDIRS])dnl ifelse(gt_included_intl, yes, [ AC_REQUIRE([AM_INTL_SUBDIR])dnl ]) dnl Prerequisites of AC_LIB_LINKFLAGS_BODY. AC_REQUIRE([AC_LIB_PREPARE_PREFIX]) AC_REQUIRE([AC_LIB_RPATH]) dnl Sometimes libintl requires libiconv, so first search for libiconv. dnl Ideally we would do this search only after the dnl if test "$USE_NLS" = "yes"; then dnl if { eval "gt_val=\$$gt_func_gnugettext_libc"; test "$gt_val" != "yes"; }; then dnl tests. But if configure.in invokes AM_ICONV after AM_GNU_GETTEXT dnl the configure script would need to contain the same shell code dnl again, outside any 'if'. There are two solutions: dnl - Invoke AM_ICONV_LINKFLAGS_BODY here, outside any 'if'. dnl - Control the expansions in more detail using AC_PROVIDE_IFELSE. dnl Since AC_PROVIDE_IFELSE is only in autoconf >= 2.52 and not dnl documented, we avoid it. ifelse(gt_included_intl, yes, , [ AC_REQUIRE([AM_ICONV_LINKFLAGS_BODY]) ]) dnl Sometimes, on Mac OS X, libintl requires linking with CoreFoundation. gt_INTL_MACOSX dnl Set USE_NLS. AC_REQUIRE([AM_NLS]) ifelse(gt_included_intl, yes, [ BUILD_INCLUDED_LIBINTL=no USE_INCLUDED_LIBINTL=no ]) LIBINTL= LTLIBINTL= POSUB= dnl Add a version number to the cache macros. case " $gt_needs " in *" need-formatstring-macros "*) gt_api_version=3 ;; *" need-ngettext "*) gt_api_version=2 ;; *) gt_api_version=1 ;; esac gt_func_gnugettext_libc="gt_cv_func_gnugettext${gt_api_version}_libc" gt_func_gnugettext_libintl="gt_cv_func_gnugettext${gt_api_version}_libintl" dnl If we use NLS figure out what method if test "$USE_NLS" = "yes"; then gt_use_preinstalled_gnugettext=no ifelse(gt_included_intl, yes, [ AC_MSG_CHECKING([whether included gettext is requested]) AC_ARG_WITH([included-gettext], [ --with-included-gettext use the GNU gettext library included here], nls_cv_force_use_gnu_gettext=$withval, nls_cv_force_use_gnu_gettext=no) AC_MSG_RESULT([$nls_cv_force_use_gnu_gettext]) nls_cv_use_gnu_gettext="$nls_cv_force_use_gnu_gettext" if test "$nls_cv_force_use_gnu_gettext" != "yes"; then ]) dnl User does not insist on using GNU NLS library. Figure out what dnl to use. If GNU gettext is available we use this. Else we have dnl to fall back to GNU NLS library. if test $gt_api_version -ge 3; then gt_revision_test_code=' #ifndef __GNU_GETTEXT_SUPPORTED_REVISION #define __GNU_GETTEXT_SUPPORTED_REVISION(major) ((major) == 0 ? 0 : -1) #endif changequote(,)dnl typedef int array [2 * (__GNU_GETTEXT_SUPPORTED_REVISION(0) >= 1) - 1]; changequote([,])dnl ' else gt_revision_test_code= fi if test $gt_api_version -ge 2; then gt_expression_test_code=' + * ngettext ("", "", 0)' else gt_expression_test_code= fi AC_CACHE_CHECK([for GNU gettext in libc], [$gt_func_gnugettext_libc], [AC_LINK_IFELSE( [AC_LANG_PROGRAM( [[ #include $gt_revision_test_code extern int _nl_msg_cat_cntr; extern int *_nl_domain_bindings; ]], [[ bindtextdomain ("", ""); return * gettext ("")$gt_expression_test_code + _nl_msg_cat_cntr + *_nl_domain_bindings ]])], [eval "$gt_func_gnugettext_libc=yes"], [eval "$gt_func_gnugettext_libc=no"])]) if { eval "gt_val=\$$gt_func_gnugettext_libc"; test "$gt_val" != "yes"; }; then dnl Sometimes libintl requires libiconv, so first search for libiconv. ifelse(gt_included_intl, yes, , [ AM_ICONV_LINK ]) dnl Search for libintl and define LIBINTL, LTLIBINTL and INCINTL dnl accordingly. Don't use AC_LIB_LINKFLAGS_BODY([intl],[iconv]) dnl because that would add "-liconv" to LIBINTL and LTLIBINTL dnl even if libiconv doesn't exist. AC_LIB_LINKFLAGS_BODY([intl]) AC_CACHE_CHECK([for GNU gettext in libintl], [$gt_func_gnugettext_libintl], [gt_save_CPPFLAGS="$CPPFLAGS" CPPFLAGS="$CPPFLAGS $INCINTL" gt_save_LIBS="$LIBS" LIBS="$LIBS $LIBINTL" dnl Now see whether libintl exists and does not depend on libiconv. AC_LINK_IFELSE( [AC_LANG_PROGRAM( [[ #include $gt_revision_test_code extern int _nl_msg_cat_cntr; extern #ifdef __cplusplus "C" #endif const char *_nl_expand_alias (const char *); ]], [[ bindtextdomain ("", ""); return * gettext ("")$gt_expression_test_code + _nl_msg_cat_cntr + *_nl_expand_alias ("") ]])], [eval "$gt_func_gnugettext_libintl=yes"], [eval "$gt_func_gnugettext_libintl=no"]) dnl Now see whether libintl exists and depends on libiconv. if { eval "gt_val=\$$gt_func_gnugettext_libintl"; test "$gt_val" != yes; } && test -n "$LIBICONV"; then LIBS="$LIBS $LIBICONV" AC_LINK_IFELSE( [AC_LANG_PROGRAM( [[ #include $gt_revision_test_code extern int _nl_msg_cat_cntr; extern #ifdef __cplusplus "C" #endif const char *_nl_expand_alias (const char *); ]], [[ bindtextdomain ("", ""); return * gettext ("")$gt_expression_test_code + _nl_msg_cat_cntr + *_nl_expand_alias ("") ]])], [LIBINTL="$LIBINTL $LIBICONV" LTLIBINTL="$LTLIBINTL $LTLIBICONV" eval "$gt_func_gnugettext_libintl=yes" ]) fi CPPFLAGS="$gt_save_CPPFLAGS" LIBS="$gt_save_LIBS"]) fi dnl If an already present or preinstalled GNU gettext() is found, dnl use it. But if this macro is used in GNU gettext, and GNU dnl gettext is already preinstalled in libintl, we update this dnl libintl. (Cf. the install rule in intl/Makefile.in.) if { eval "gt_val=\$$gt_func_gnugettext_libc"; test "$gt_val" = "yes"; } \ || { { eval "gt_val=\$$gt_func_gnugettext_libintl"; test "$gt_val" = "yes"; } \ && test "$PACKAGE" != gettext-runtime \ && test "$PACKAGE" != gettext-tools; }; then gt_use_preinstalled_gnugettext=yes else dnl Reset the values set by searching for libintl. LIBINTL= LTLIBINTL= INCINTL= fi ifelse(gt_included_intl, yes, [ if test "$gt_use_preinstalled_gnugettext" != "yes"; then dnl GNU gettext is not found in the C library. dnl Fall back on included GNU gettext library. nls_cv_use_gnu_gettext=yes fi fi if test "$nls_cv_use_gnu_gettext" = "yes"; then dnl Mark actions used to generate GNU NLS library. BUILD_INCLUDED_LIBINTL=yes USE_INCLUDED_LIBINTL=yes LIBINTL="ifelse([$3],[],\${top_builddir}/intl,[$3])/libintl.[]gt_libtool_suffix_prefix[]a $LIBICONV $LIBTHREAD" LTLIBINTL="ifelse([$3],[],\${top_builddir}/intl,[$3])/libintl.[]gt_libtool_suffix_prefix[]a $LTLIBICONV $LTLIBTHREAD" LIBS=`echo " $LIBS " | sed -e 's/ -lintl / /' -e 's/^ //' -e 's/ $//'` fi CATOBJEXT= if test "$gt_use_preinstalled_gnugettext" = "yes" \ || test "$nls_cv_use_gnu_gettext" = "yes"; then dnl Mark actions to use GNU gettext tools. CATOBJEXT=.gmo fi ]) if test -n "$INTL_MACOSX_LIBS"; then if test "$gt_use_preinstalled_gnugettext" = "yes" \ || test "$nls_cv_use_gnu_gettext" = "yes"; then dnl Some extra flags are needed during linking. LIBINTL="$LIBINTL $INTL_MACOSX_LIBS" LTLIBINTL="$LTLIBINTL $INTL_MACOSX_LIBS" fi fi if test "$gt_use_preinstalled_gnugettext" = "yes" \ || test "$nls_cv_use_gnu_gettext" = "yes"; then AC_DEFINE([ENABLE_NLS], [1], [Define to 1 if translation of program messages to the user's native language is requested.]) else USE_NLS=no fi fi AC_MSG_CHECKING([whether to use NLS]) AC_MSG_RESULT([$USE_NLS]) if test "$USE_NLS" = "yes"; then AC_MSG_CHECKING([where the gettext function comes from]) if test "$gt_use_preinstalled_gnugettext" = "yes"; then if { eval "gt_val=\$$gt_func_gnugettext_libintl"; test "$gt_val" = "yes"; }; then gt_source="external libintl" else gt_source="libc" fi else gt_source="included intl directory" fi AC_MSG_RESULT([$gt_source]) fi if test "$USE_NLS" = "yes"; then if test "$gt_use_preinstalled_gnugettext" = "yes"; then if { eval "gt_val=\$$gt_func_gnugettext_libintl"; test "$gt_val" = "yes"; }; then AC_MSG_CHECKING([how to link with libintl]) AC_MSG_RESULT([$LIBINTL]) AC_LIB_APPENDTOVAR([CPPFLAGS], [$INCINTL]) fi dnl For backward compatibility. Some packages may be using this. AC_DEFINE([HAVE_GETTEXT], [1], [Define if the GNU gettext() function is already present or preinstalled.]) AC_DEFINE([HAVE_DCGETTEXT], [1], [Define if the GNU dcgettext() function is already present or preinstalled.]) fi dnl We need to process the po/ directory. POSUB=po fi ifelse(gt_included_intl, yes, [ dnl If this is used in GNU gettext we have to set BUILD_INCLUDED_LIBINTL dnl to 'yes' because some of the testsuite requires it. if test "$PACKAGE" = gettext-runtime || test "$PACKAGE" = gettext-tools; then BUILD_INCLUDED_LIBINTL=yes fi dnl Make all variables we use known to autoconf. AC_SUBST([BUILD_INCLUDED_LIBINTL]) AC_SUBST([USE_INCLUDED_LIBINTL]) AC_SUBST([CATOBJEXT]) dnl For backward compatibility. Some configure.ins may be using this. nls_cv_header_intl= nls_cv_header_libgt= dnl For backward compatibility. Some Makefiles may be using this. DATADIRNAME=share AC_SUBST([DATADIRNAME]) dnl For backward compatibility. Some Makefiles may be using this. INSTOBJEXT=.mo AC_SUBST([INSTOBJEXT]) dnl For backward compatibility. Some Makefiles may be using this. GENCAT=gencat AC_SUBST([GENCAT]) dnl For backward compatibility. Some Makefiles may be using this. INTLOBJS= if test "$USE_INCLUDED_LIBINTL" = yes; then INTLOBJS="\$(GETTOBJS)" fi AC_SUBST([INTLOBJS]) dnl Enable libtool support if the surrounding package wishes it. INTL_LIBTOOL_SUFFIX_PREFIX=gt_libtool_suffix_prefix AC_SUBST([INTL_LIBTOOL_SUFFIX_PREFIX]) ]) dnl For backward compatibility. Some Makefiles may be using this. INTLLIBS="$LIBINTL" AC_SUBST([INTLLIBS]) dnl Make all documented variables known to autoconf. AC_SUBST([LIBINTL]) AC_SUBST([LTLIBINTL]) AC_SUBST([POSUB]) ]) dnl gt_NEEDS_INIT ensures that the gt_needs variable is initialized. m4_define([gt_NEEDS_INIT], [ m4_divert_text([DEFAULTS], [gt_needs=]) m4_define([gt_NEEDS_INIT], []) ]) dnl Usage: AM_GNU_GETTEXT_NEED([NEEDSYMBOL]) AC_DEFUN([AM_GNU_GETTEXT_NEED], [ m4_divert_text([INIT_PREPARE], [gt_needs="$gt_needs $1"]) ]) dnl Usage: AM_GNU_GETTEXT_VERSION([gettext-version]) AC_DEFUN([AM_GNU_GETTEXT_VERSION], []) # iconv.m4 serial 18 (gettext-0.18.2) dnl Copyright (C) 2000-2002, 2007-2014 Free Software Foundation, Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, dnl with or without modifications, as long as this notice is preserved. dnl From Bruno Haible. AC_DEFUN([AM_ICONV_LINKFLAGS_BODY], [ dnl Prerequisites of AC_LIB_LINKFLAGS_BODY. AC_REQUIRE([AC_LIB_PREPARE_PREFIX]) AC_REQUIRE([AC_LIB_RPATH]) dnl Search for libiconv and define LIBICONV, LTLIBICONV and INCICONV dnl accordingly. AC_LIB_LINKFLAGS_BODY([iconv]) ]) AC_DEFUN([AM_ICONV_LINK], [ dnl Some systems have iconv in libc, some have it in libiconv (OSF/1 and dnl those with the standalone portable GNU libiconv installed). AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles dnl Search for libiconv and define LIBICONV, LTLIBICONV and INCICONV dnl accordingly. AC_REQUIRE([AM_ICONV_LINKFLAGS_BODY]) dnl Add $INCICONV to CPPFLAGS before performing the following checks, dnl because if the user has installed libiconv and not disabled its use dnl via --without-libiconv-prefix, he wants to use it. The first dnl AC_LINK_IFELSE will then fail, the second AC_LINK_IFELSE will succeed. am_save_CPPFLAGS="$CPPFLAGS" AC_LIB_APPENDTOVAR([CPPFLAGS], [$INCICONV]) AC_CACHE_CHECK([for iconv], [am_cv_func_iconv], [ am_cv_func_iconv="no, consider installing GNU libiconv" am_cv_lib_iconv=no AC_LINK_IFELSE( [AC_LANG_PROGRAM( [[ #include #include ]], [[iconv_t cd = iconv_open("",""); iconv(cd,NULL,NULL,NULL,NULL); iconv_close(cd);]])], [am_cv_func_iconv=yes]) if test "$am_cv_func_iconv" != yes; then am_save_LIBS="$LIBS" LIBS="$LIBS $LIBICONV" AC_LINK_IFELSE( [AC_LANG_PROGRAM( [[ #include #include ]], [[iconv_t cd = iconv_open("",""); iconv(cd,NULL,NULL,NULL,NULL); iconv_close(cd);]])], [am_cv_lib_iconv=yes] [am_cv_func_iconv=yes]) LIBS="$am_save_LIBS" fi ]) if test "$am_cv_func_iconv" = yes; then AC_CACHE_CHECK([for working iconv], [am_cv_func_iconv_works], [ dnl This tests against bugs in AIX 5.1, AIX 6.1..7.1, HP-UX 11.11, dnl Solaris 10. am_save_LIBS="$LIBS" if test $am_cv_lib_iconv = yes; then LIBS="$LIBS $LIBICONV" fi AC_RUN_IFELSE( [AC_LANG_SOURCE([[ #include #include int main () { int result = 0; /* Test against AIX 5.1 bug: Failures are not distinguishable from successful returns. */ { iconv_t cd_utf8_to_88591 = iconv_open ("ISO8859-1", "UTF-8"); if (cd_utf8_to_88591 != (iconv_t)(-1)) { static const char input[] = "\342\202\254"; /* EURO SIGN */ char buf[10]; const char *inptr = input; size_t inbytesleft = strlen (input); char *outptr = buf; size_t outbytesleft = sizeof (buf); size_t res = iconv (cd_utf8_to_88591, (char **) &inptr, &inbytesleft, &outptr, &outbytesleft); if (res == 0) result |= 1; iconv_close (cd_utf8_to_88591); } } /* Test against Solaris 10 bug: Failures are not distinguishable from successful returns. */ { iconv_t cd_ascii_to_88591 = iconv_open ("ISO8859-1", "646"); if (cd_ascii_to_88591 != (iconv_t)(-1)) { static const char input[] = "\263"; char buf[10]; const char *inptr = input; size_t inbytesleft = strlen (input); char *outptr = buf; size_t outbytesleft = sizeof (buf); size_t res = iconv (cd_ascii_to_88591, (char **) &inptr, &inbytesleft, &outptr, &outbytesleft); if (res == 0) result |= 2; iconv_close (cd_ascii_to_88591); } } /* Test against AIX 6.1..7.1 bug: Buffer overrun. */ { iconv_t cd_88591_to_utf8 = iconv_open ("UTF-8", "ISO-8859-1"); if (cd_88591_to_utf8 != (iconv_t)(-1)) { static const char input[] = "\304"; static char buf[2] = { (char)0xDE, (char)0xAD }; const char *inptr = input; size_t inbytesleft = 1; char *outptr = buf; size_t outbytesleft = 1; size_t res = iconv (cd_88591_to_utf8, (char **) &inptr, &inbytesleft, &outptr, &outbytesleft); if (res != (size_t)(-1) || outptr - buf > 1 || buf[1] != (char)0xAD) result |= 4; iconv_close (cd_88591_to_utf8); } } #if 0 /* This bug could be worked around by the caller. */ /* Test against HP-UX 11.11 bug: Positive return value instead of 0. */ { iconv_t cd_88591_to_utf8 = iconv_open ("utf8", "iso88591"); if (cd_88591_to_utf8 != (iconv_t)(-1)) { static const char input[] = "\304rger mit b\366sen B\374bchen ohne Augenma\337"; char buf[50]; const char *inptr = input; size_t inbytesleft = strlen (input); char *outptr = buf; size_t outbytesleft = sizeof (buf); size_t res = iconv (cd_88591_to_utf8, (char **) &inptr, &inbytesleft, &outptr, &outbytesleft); if ((int)res > 0) result |= 8; iconv_close (cd_88591_to_utf8); } } #endif /* Test against HP-UX 11.11 bug: No converter from EUC-JP to UTF-8 is provided. */ if (/* Try standardized names. */ iconv_open ("UTF-8", "EUC-JP") == (iconv_t)(-1) /* Try IRIX, OSF/1 names. */ && iconv_open ("UTF-8", "eucJP") == (iconv_t)(-1) /* Try AIX names. */ && iconv_open ("UTF-8", "IBM-eucJP") == (iconv_t)(-1) /* Try HP-UX names. */ && iconv_open ("utf8", "eucJP") == (iconv_t)(-1)) result |= 16; return result; }]])], [am_cv_func_iconv_works=yes], [am_cv_func_iconv_works=no], [ changequote(,)dnl case "$host_os" in aix* | hpux*) am_cv_func_iconv_works="guessing no" ;; *) am_cv_func_iconv_works="guessing yes" ;; esac changequote([,])dnl ]) LIBS="$am_save_LIBS" ]) case "$am_cv_func_iconv_works" in *no) am_func_iconv=no am_cv_lib_iconv=no ;; *) am_func_iconv=yes ;; esac else am_func_iconv=no am_cv_lib_iconv=no fi if test "$am_func_iconv" = yes; then AC_DEFINE([HAVE_ICONV], [1], [Define if you have the iconv() function and it works.]) fi if test "$am_cv_lib_iconv" = yes; then AC_MSG_CHECKING([how to link with libiconv]) AC_MSG_RESULT([$LIBICONV]) else dnl If $LIBICONV didn't lead to a usable library, we don't need $INCICONV dnl either. CPPFLAGS="$am_save_CPPFLAGS" LIBICONV= LTLIBICONV= fi AC_SUBST([LIBICONV]) AC_SUBST([LTLIBICONV]) ]) dnl Define AM_ICONV using AC_DEFUN_ONCE for Autoconf >= 2.64, in order to dnl avoid warnings like dnl "warning: AC_REQUIRE: `AM_ICONV' was expanded before it was required". dnl This is tricky because of the way 'aclocal' is implemented: dnl - It requires defining an auxiliary macro whose name ends in AC_DEFUN. dnl Otherwise aclocal's initial scan pass would miss the macro definition. dnl - It requires a line break inside the AC_DEFUN_ONCE and AC_DEFUN expansions. dnl Otherwise aclocal would emit many "Use of uninitialized value $1" dnl warnings. m4_define([gl_iconv_AC_DEFUN], m4_version_prereq([2.64], [[AC_DEFUN_ONCE( [$1], [$2])]], [m4_ifdef([gl_00GNULIB], [[AC_DEFUN_ONCE( [$1], [$2])]], [[AC_DEFUN( [$1], [$2])]])])) gl_iconv_AC_DEFUN([AM_ICONV], [ AM_ICONV_LINK if test "$am_cv_func_iconv" = yes; then AC_MSG_CHECKING([for iconv declaration]) AC_CACHE_VAL([am_cv_proto_iconv], [ AC_COMPILE_IFELSE( [AC_LANG_PROGRAM( [[ #include #include extern #ifdef __cplusplus "C" #endif #if defined(__STDC__) || defined(_MSC_VER) || defined(__cplusplus) size_t iconv (iconv_t cd, char * *inbuf, size_t *inbytesleft, char * *outbuf, size_t *outbytesleft); #else size_t iconv(); #endif ]], [[]])], [am_cv_proto_iconv_arg1=""], [am_cv_proto_iconv_arg1="const"]) am_cv_proto_iconv="extern size_t iconv (iconv_t cd, $am_cv_proto_iconv_arg1 char * *inbuf, size_t *inbytesleft, char * *outbuf, size_t *outbytesleft);"]) am_cv_proto_iconv=`echo "[$]am_cv_proto_iconv" | tr -s ' ' | sed -e 's/( /(/'` AC_MSG_RESULT([ $am_cv_proto_iconv]) AC_DEFINE_UNQUOTED([ICONV_CONST], [$am_cv_proto_iconv_arg1], [Define as const if the declaration of iconv() needs const.]) dnl Also substitute ICONV_CONST in the gnulib generated . m4_ifdef([gl_ICONV_H_DEFAULTS], [AC_REQUIRE([gl_ICONV_H_DEFAULTS]) if test -n "$am_cv_proto_iconv_arg1"; then ICONV_CONST="const" fi ]) fi ]) # intlmacosx.m4 serial 5 (gettext-0.18.2) dnl Copyright (C) 2004-2014 Free Software Foundation, Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, dnl with or without modifications, as long as this notice is preserved. dnl dnl This file can can be used in projects which are not available under dnl the GNU General Public License or the GNU Library General Public dnl License but which still want to provide support for the GNU gettext dnl functionality. dnl Please note that the actual code of the GNU gettext library is covered dnl by the GNU Library General Public License, and the rest of the GNU dnl gettext package package is covered by the GNU General Public License. dnl They are *not* in the public domain. dnl Checks for special options needed on Mac OS X. dnl Defines INTL_MACOSX_LIBS. AC_DEFUN([gt_INTL_MACOSX], [ dnl Check for API introduced in Mac OS X 10.2. AC_CACHE_CHECK([for CFPreferencesCopyAppValue], [gt_cv_func_CFPreferencesCopyAppValue], [gt_save_LIBS="$LIBS" LIBS="$LIBS -Wl,-framework -Wl,CoreFoundation" AC_LINK_IFELSE( [AC_LANG_PROGRAM( [[#include ]], [[CFPreferencesCopyAppValue(NULL, NULL)]])], [gt_cv_func_CFPreferencesCopyAppValue=yes], [gt_cv_func_CFPreferencesCopyAppValue=no]) LIBS="$gt_save_LIBS"]) if test $gt_cv_func_CFPreferencesCopyAppValue = yes; then AC_DEFINE([HAVE_CFPREFERENCESCOPYAPPVALUE], [1], [Define to 1 if you have the Mac OS X function CFPreferencesCopyAppValue in the CoreFoundation framework.]) fi dnl Check for API introduced in Mac OS X 10.3. AC_CACHE_CHECK([for CFLocaleCopyCurrent], [gt_cv_func_CFLocaleCopyCurrent], [gt_save_LIBS="$LIBS" LIBS="$LIBS -Wl,-framework -Wl,CoreFoundation" AC_LINK_IFELSE( [AC_LANG_PROGRAM( [[#include ]], [[CFLocaleCopyCurrent();]])], [gt_cv_func_CFLocaleCopyCurrent=yes], [gt_cv_func_CFLocaleCopyCurrent=no]) LIBS="$gt_save_LIBS"]) if test $gt_cv_func_CFLocaleCopyCurrent = yes; then AC_DEFINE([HAVE_CFLOCALECOPYCURRENT], [1], [Define to 1 if you have the Mac OS X function CFLocaleCopyCurrent in the CoreFoundation framework.]) fi INTL_MACOSX_LIBS= if test $gt_cv_func_CFPreferencesCopyAppValue = yes || test $gt_cv_func_CFLocaleCopyCurrent = yes; then INTL_MACOSX_LIBS="-Wl,-framework -Wl,CoreFoundation" fi AC_SUBST([INTL_MACOSX_LIBS]) ]) # lib-ld.m4 serial 6 dnl Copyright (C) 1996-2003, 2009-2014 Free Software Foundation, Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, dnl with or without modifications, as long as this notice is preserved. dnl Subroutines of libtool.m4, dnl with replacements s/_*LT_PATH/AC_LIB_PROG/ and s/lt_/acl_/ to avoid dnl collision with libtool.m4. dnl From libtool-2.4. Sets the variable with_gnu_ld to yes or no. AC_DEFUN([AC_LIB_PROG_LD_GNU], [AC_CACHE_CHECK([if the linker ($LD) is GNU ld], [acl_cv_prog_gnu_ld], [# I'd rather use --version here, but apparently some GNU lds only accept -v. case `$LD -v 2>&1 /dev/null 2>&1 \ && { (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 \ || PATH_SEPARATOR=';' } fi ac_prog=ld if test "$GCC" = yes; then # Check if gcc -print-prog-name=ld gives a path. AC_MSG_CHECKING([for ld used by $CC]) case $host in *-*-mingw*) # gcc leaves a trailing carriage return which upsets mingw ac_prog=`($CC -print-prog-name=ld) 2>&5 | tr -d '\015'` ;; *) ac_prog=`($CC -print-prog-name=ld) 2>&5` ;; esac case $ac_prog in # Accept absolute paths. [[\\/]]* | ?:[[\\/]]*) re_direlt='/[[^/]][[^/]]*/\.\./' # Canonicalize the pathname of ld ac_prog=`echo "$ac_prog"| sed 's%\\\\%/%g'` while echo "$ac_prog" | grep "$re_direlt" > /dev/null 2>&1; do ac_prog=`echo $ac_prog| sed "s%$re_direlt%/%"` done test -z "$LD" && LD="$ac_prog" ;; "") # If it fails, then pretend we aren't using GCC. ac_prog=ld ;; *) # If it is relative, then search for the first ld in PATH. with_gnu_ld=unknown ;; esac elif test "$with_gnu_ld" = yes; then AC_MSG_CHECKING([for GNU ld]) else AC_MSG_CHECKING([for non-GNU ld]) fi AC_CACHE_VAL([acl_cv_path_LD], [if test -z "$LD"; then acl_save_ifs="$IFS"; IFS=$PATH_SEPARATOR for ac_dir in $PATH; do IFS="$acl_save_ifs" test -z "$ac_dir" && ac_dir=. if test -f "$ac_dir/$ac_prog" || test -f "$ac_dir/$ac_prog$ac_exeext"; then acl_cv_path_LD="$ac_dir/$ac_prog" # Check to see if the program is GNU ld. I'd rather use --version, # but apparently some variants of GNU ld only accept -v. # Break only if it was the GNU/non-GNU ld that we prefer. case `"$acl_cv_path_LD" -v 2>&1 = 1.10 to complain if config.rpath is missing. m4_ifdef([AC_REQUIRE_AUX_FILE], [AC_REQUIRE_AUX_FILE([config.rpath])]) AC_REQUIRE([AC_PROG_CC]) dnl we use $CC, $GCC, $LDFLAGS AC_REQUIRE([AC_LIB_PROG_LD]) dnl we use $LD, $with_gnu_ld AC_REQUIRE([AC_CANONICAL_HOST]) dnl we use $host AC_REQUIRE([AC_CONFIG_AUX_DIR_DEFAULT]) dnl we use $ac_aux_dir AC_CACHE_CHECK([for shared library run path origin], [acl_cv_rpath], [ CC="$CC" GCC="$GCC" LDFLAGS="$LDFLAGS" LD="$LD" with_gnu_ld="$with_gnu_ld" \ ${CONFIG_SHELL-/bin/sh} "$ac_aux_dir/config.rpath" "$host" > conftest.sh . ./conftest.sh rm -f ./conftest.sh acl_cv_rpath=done ]) wl="$acl_cv_wl" acl_libext="$acl_cv_libext" acl_shlibext="$acl_cv_shlibext" acl_libname_spec="$acl_cv_libname_spec" acl_library_names_spec="$acl_cv_library_names_spec" acl_hardcode_libdir_flag_spec="$acl_cv_hardcode_libdir_flag_spec" acl_hardcode_libdir_separator="$acl_cv_hardcode_libdir_separator" acl_hardcode_direct="$acl_cv_hardcode_direct" acl_hardcode_minus_L="$acl_cv_hardcode_minus_L" dnl Determine whether the user wants rpath handling at all. AC_ARG_ENABLE([rpath], [ --disable-rpath do not hardcode runtime library paths], :, enable_rpath=yes) ]) dnl AC_LIB_FROMPACKAGE(name, package) dnl declares that libname comes from the given package. The configure file dnl will then not have a --with-libname-prefix option but a dnl --with-package-prefix option. Several libraries can come from the same dnl package. This declaration must occur before an AC_LIB_LINKFLAGS or similar dnl macro call that searches for libname. AC_DEFUN([AC_LIB_FROMPACKAGE], [ pushdef([NAME],[m4_translit([$1],[abcdefghijklmnopqrstuvwxyz./+-], [ABCDEFGHIJKLMNOPQRSTUVWXYZ____])]) define([acl_frompackage_]NAME, [$2]) popdef([NAME]) pushdef([PACK],[$2]) pushdef([PACKUP],[m4_translit(PACK,[abcdefghijklmnopqrstuvwxyz./+-], [ABCDEFGHIJKLMNOPQRSTUVWXYZ____])]) define([acl_libsinpackage_]PACKUP, m4_ifdef([acl_libsinpackage_]PACKUP, [m4_defn([acl_libsinpackage_]PACKUP)[, ]],)[lib$1]) popdef([PACKUP]) popdef([PACK]) ]) dnl AC_LIB_LINKFLAGS_BODY(name [, dependencies]) searches for libname and dnl the libraries corresponding to explicit and implicit dependencies. dnl Sets the LIB${NAME}, LTLIB${NAME} and INC${NAME} variables. dnl Also, sets the LIB${NAME}_PREFIX variable to nonempty if libname was found dnl in ${LIB${NAME}_PREFIX}/$acl_libdirstem. AC_DEFUN([AC_LIB_LINKFLAGS_BODY], [ AC_REQUIRE([AC_LIB_PREPARE_MULTILIB]) pushdef([NAME],[m4_translit([$1],[abcdefghijklmnopqrstuvwxyz./+-], [ABCDEFGHIJKLMNOPQRSTUVWXYZ____])]) pushdef([PACK],[m4_ifdef([acl_frompackage_]NAME, [acl_frompackage_]NAME, lib[$1])]) pushdef([PACKUP],[m4_translit(PACK,[abcdefghijklmnopqrstuvwxyz./+-], [ABCDEFGHIJKLMNOPQRSTUVWXYZ____])]) pushdef([PACKLIBS],[m4_ifdef([acl_frompackage_]NAME, [acl_libsinpackage_]PACKUP, lib[$1])]) dnl Autoconf >= 2.61 supports dots in --with options. pushdef([P_A_C_K],[m4_if(m4_version_compare(m4_defn([m4_PACKAGE_VERSION]),[2.61]),[-1],[m4_translit(PACK,[.],[_])],PACK)]) dnl By default, look in $includedir and $libdir. use_additional=yes AC_LIB_WITH_FINAL_PREFIX([ eval additional_includedir=\"$includedir\" eval additional_libdir=\"$libdir\" ]) AC_ARG_WITH(P_A_C_K[-prefix], [[ --with-]]P_A_C_K[[-prefix[=DIR] search for ]PACKLIBS[ in DIR/include and DIR/lib --without-]]P_A_C_K[[-prefix don't search for ]PACKLIBS[ in includedir and libdir]], [ if test "X$withval" = "Xno"; then use_additional=no else if test "X$withval" = "X"; then AC_LIB_WITH_FINAL_PREFIX([ eval additional_includedir=\"$includedir\" eval additional_libdir=\"$libdir\" ]) else additional_includedir="$withval/include" additional_libdir="$withval/$acl_libdirstem" if test "$acl_libdirstem2" != "$acl_libdirstem" \ && ! test -d "$withval/$acl_libdirstem"; then additional_libdir="$withval/$acl_libdirstem2" fi fi fi ]) dnl Search the library and its dependencies in $additional_libdir and dnl $LDFLAGS. Using breadth-first-seach. LIB[]NAME= LTLIB[]NAME= INC[]NAME= LIB[]NAME[]_PREFIX= dnl HAVE_LIB${NAME} is an indicator that LIB${NAME}, LTLIB${NAME} have been dnl computed. So it has to be reset here. HAVE_LIB[]NAME= rpathdirs= ltrpathdirs= names_already_handled= names_next_round='$1 $2' while test -n "$names_next_round"; do names_this_round="$names_next_round" names_next_round= for name in $names_this_round; do already_handled= for n in $names_already_handled; do if test "$n" = "$name"; then already_handled=yes break fi done if test -z "$already_handled"; then names_already_handled="$names_already_handled $name" dnl See if it was already located by an earlier AC_LIB_LINKFLAGS dnl or AC_LIB_HAVE_LINKFLAGS call. uppername=`echo "$name" | sed -e 'y|abcdefghijklmnopqrstuvwxyz./+-|ABCDEFGHIJKLMNOPQRSTUVWXYZ____|'` eval value=\"\$HAVE_LIB$uppername\" if test -n "$value"; then if test "$value" = yes; then eval value=\"\$LIB$uppername\" test -z "$value" || LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$value" eval value=\"\$LTLIB$uppername\" test -z "$value" || LTLIB[]NAME="${LTLIB[]NAME}${LTLIB[]NAME:+ }$value" else dnl An earlier call to AC_LIB_HAVE_LINKFLAGS has determined dnl that this library doesn't exist. So just drop it. : fi else dnl Search the library lib$name in $additional_libdir and $LDFLAGS dnl and the already constructed $LIBNAME/$LTLIBNAME. found_dir= found_la= found_so= found_a= eval libname=\"$acl_libname_spec\" # typically: libname=lib$name if test -n "$acl_shlibext"; then shrext=".$acl_shlibext" # typically: shrext=.so else shrext= fi if test $use_additional = yes; then dir="$additional_libdir" dnl The same code as in the loop below: dnl First look for a shared library. if test -n "$acl_shlibext"; then if test -f "$dir/$libname$shrext"; then found_dir="$dir" found_so="$dir/$libname$shrext" else if test "$acl_library_names_spec" = '$libname$shrext$versuffix'; then ver=`(cd "$dir" && \ for f in "$libname$shrext".*; do echo "$f"; done \ | sed -e "s,^$libname$shrext\\\\.,," \ | sort -t '.' -n -r -k1,1 -k2,2 -k3,3 -k4,4 -k5,5 \ | sed 1q ) 2>/dev/null` if test -n "$ver" && test -f "$dir/$libname$shrext.$ver"; then found_dir="$dir" found_so="$dir/$libname$shrext.$ver" fi else eval library_names=\"$acl_library_names_spec\" for f in $library_names; do if test -f "$dir/$f"; then found_dir="$dir" found_so="$dir/$f" break fi done fi fi fi dnl Then look for a static library. if test "X$found_dir" = "X"; then if test -f "$dir/$libname.$acl_libext"; then found_dir="$dir" found_a="$dir/$libname.$acl_libext" fi fi if test "X$found_dir" != "X"; then if test -f "$dir/$libname.la"; then found_la="$dir/$libname.la" fi fi fi if test "X$found_dir" = "X"; then for x in $LDFLAGS $LTLIB[]NAME; do AC_LIB_WITH_FINAL_PREFIX([eval x=\"$x\"]) case "$x" in -L*) dir=`echo "X$x" | sed -e 's/^X-L//'` dnl First look for a shared library. if test -n "$acl_shlibext"; then if test -f "$dir/$libname$shrext"; then found_dir="$dir" found_so="$dir/$libname$shrext" else if test "$acl_library_names_spec" = '$libname$shrext$versuffix'; then ver=`(cd "$dir" && \ for f in "$libname$shrext".*; do echo "$f"; done \ | sed -e "s,^$libname$shrext\\\\.,," \ | sort -t '.' -n -r -k1,1 -k2,2 -k3,3 -k4,4 -k5,5 \ | sed 1q ) 2>/dev/null` if test -n "$ver" && test -f "$dir/$libname$shrext.$ver"; then found_dir="$dir" found_so="$dir/$libname$shrext.$ver" fi else eval library_names=\"$acl_library_names_spec\" for f in $library_names; do if test -f "$dir/$f"; then found_dir="$dir" found_so="$dir/$f" break fi done fi fi fi dnl Then look for a static library. if test "X$found_dir" = "X"; then if test -f "$dir/$libname.$acl_libext"; then found_dir="$dir" found_a="$dir/$libname.$acl_libext" fi fi if test "X$found_dir" != "X"; then if test -f "$dir/$libname.la"; then found_la="$dir/$libname.la" fi fi ;; esac if test "X$found_dir" != "X"; then break fi done fi if test "X$found_dir" != "X"; then dnl Found the library. LTLIB[]NAME="${LTLIB[]NAME}${LTLIB[]NAME:+ }-L$found_dir -l$name" if test "X$found_so" != "X"; then dnl Linking with a shared library. We attempt to hardcode its dnl directory into the executable's runpath, unless it's the dnl standard /usr/lib. if test "$enable_rpath" = no \ || test "X$found_dir" = "X/usr/$acl_libdirstem" \ || test "X$found_dir" = "X/usr/$acl_libdirstem2"; then dnl No hardcoding is needed. LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$found_so" else dnl Use an explicit option to hardcode DIR into the resulting dnl binary. dnl Potentially add DIR to ltrpathdirs. dnl The ltrpathdirs will be appended to $LTLIBNAME at the end. haveit= for x in $ltrpathdirs; do if test "X$x" = "X$found_dir"; then haveit=yes break fi done if test -z "$haveit"; then ltrpathdirs="$ltrpathdirs $found_dir" fi dnl The hardcoding into $LIBNAME is system dependent. if test "$acl_hardcode_direct" = yes; then dnl Using DIR/libNAME.so during linking hardcodes DIR into the dnl resulting binary. LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$found_so" else if test -n "$acl_hardcode_libdir_flag_spec" && test "$acl_hardcode_minus_L" = no; then dnl Use an explicit option to hardcode DIR into the resulting dnl binary. LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$found_so" dnl Potentially add DIR to rpathdirs. dnl The rpathdirs will be appended to $LIBNAME at the end. haveit= for x in $rpathdirs; do if test "X$x" = "X$found_dir"; then haveit=yes break fi done if test -z "$haveit"; then rpathdirs="$rpathdirs $found_dir" fi else dnl Rely on "-L$found_dir". dnl But don't add it if it's already contained in the LDFLAGS dnl or the already constructed $LIBNAME haveit= for x in $LDFLAGS $LIB[]NAME; do AC_LIB_WITH_FINAL_PREFIX([eval x=\"$x\"]) if test "X$x" = "X-L$found_dir"; then haveit=yes break fi done if test -z "$haveit"; then LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }-L$found_dir" fi if test "$acl_hardcode_minus_L" != no; then dnl FIXME: Not sure whether we should use dnl "-L$found_dir -l$name" or "-L$found_dir $found_so" dnl here. LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$found_so" else dnl We cannot use $acl_hardcode_runpath_var and LD_RUN_PATH dnl here, because this doesn't fit in flags passed to the dnl compiler. So give up. No hardcoding. This affects only dnl very old systems. dnl FIXME: Not sure whether we should use dnl "-L$found_dir -l$name" or "-L$found_dir $found_so" dnl here. LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }-l$name" fi fi fi fi else if test "X$found_a" != "X"; then dnl Linking with a static library. LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$found_a" else dnl We shouldn't come here, but anyway it's good to have a dnl fallback. LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }-L$found_dir -l$name" fi fi dnl Assume the include files are nearby. additional_includedir= case "$found_dir" in */$acl_libdirstem | */$acl_libdirstem/) basedir=`echo "X$found_dir" | sed -e 's,^X,,' -e "s,/$acl_libdirstem/"'*$,,'` if test "$name" = '$1'; then LIB[]NAME[]_PREFIX="$basedir" fi additional_includedir="$basedir/include" ;; */$acl_libdirstem2 | */$acl_libdirstem2/) basedir=`echo "X$found_dir" | sed -e 's,^X,,' -e "s,/$acl_libdirstem2/"'*$,,'` if test "$name" = '$1'; then LIB[]NAME[]_PREFIX="$basedir" fi additional_includedir="$basedir/include" ;; esac if test "X$additional_includedir" != "X"; then dnl Potentially add $additional_includedir to $INCNAME. dnl But don't add it dnl 1. if it's the standard /usr/include, dnl 2. if it's /usr/local/include and we are using GCC on Linux, dnl 3. if it's already present in $CPPFLAGS or the already dnl constructed $INCNAME, dnl 4. if it doesn't exist as a directory. if test "X$additional_includedir" != "X/usr/include"; then haveit= if test "X$additional_includedir" = "X/usr/local/include"; then if test -n "$GCC"; then case $host_os in linux* | gnu* | k*bsd*-gnu) haveit=yes;; esac fi fi if test -z "$haveit"; then for x in $CPPFLAGS $INC[]NAME; do AC_LIB_WITH_FINAL_PREFIX([eval x=\"$x\"]) if test "X$x" = "X-I$additional_includedir"; then haveit=yes break fi done if test -z "$haveit"; then if test -d "$additional_includedir"; then dnl Really add $additional_includedir to $INCNAME. INC[]NAME="${INC[]NAME}${INC[]NAME:+ }-I$additional_includedir" fi fi fi fi fi dnl Look for dependencies. if test -n "$found_la"; then dnl Read the .la file. It defines the variables dnl dlname, library_names, old_library, dependency_libs, current, dnl age, revision, installed, dlopen, dlpreopen, libdir. save_libdir="$libdir" case "$found_la" in */* | *\\*) . "$found_la" ;; *) . "./$found_la" ;; esac libdir="$save_libdir" dnl We use only dependency_libs. for dep in $dependency_libs; do case "$dep" in -L*) additional_libdir=`echo "X$dep" | sed -e 's/^X-L//'` dnl Potentially add $additional_libdir to $LIBNAME and $LTLIBNAME. dnl But don't add it dnl 1. if it's the standard /usr/lib, dnl 2. if it's /usr/local/lib and we are using GCC on Linux, dnl 3. if it's already present in $LDFLAGS or the already dnl constructed $LIBNAME, dnl 4. if it doesn't exist as a directory. if test "X$additional_libdir" != "X/usr/$acl_libdirstem" \ && test "X$additional_libdir" != "X/usr/$acl_libdirstem2"; then haveit= if test "X$additional_libdir" = "X/usr/local/$acl_libdirstem" \ || test "X$additional_libdir" = "X/usr/local/$acl_libdirstem2"; then if test -n "$GCC"; then case $host_os in linux* | gnu* | k*bsd*-gnu) haveit=yes;; esac fi fi if test -z "$haveit"; then haveit= for x in $LDFLAGS $LIB[]NAME; do AC_LIB_WITH_FINAL_PREFIX([eval x=\"$x\"]) if test "X$x" = "X-L$additional_libdir"; then haveit=yes break fi done if test -z "$haveit"; then if test -d "$additional_libdir"; then dnl Really add $additional_libdir to $LIBNAME. LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }-L$additional_libdir" fi fi haveit= for x in $LDFLAGS $LTLIB[]NAME; do AC_LIB_WITH_FINAL_PREFIX([eval x=\"$x\"]) if test "X$x" = "X-L$additional_libdir"; then haveit=yes break fi done if test -z "$haveit"; then if test -d "$additional_libdir"; then dnl Really add $additional_libdir to $LTLIBNAME. LTLIB[]NAME="${LTLIB[]NAME}${LTLIB[]NAME:+ }-L$additional_libdir" fi fi fi fi ;; -R*) dir=`echo "X$dep" | sed -e 's/^X-R//'` if test "$enable_rpath" != no; then dnl Potentially add DIR to rpathdirs. dnl The rpathdirs will be appended to $LIBNAME at the end. haveit= for x in $rpathdirs; do if test "X$x" = "X$dir"; then haveit=yes break fi done if test -z "$haveit"; then rpathdirs="$rpathdirs $dir" fi dnl Potentially add DIR to ltrpathdirs. dnl The ltrpathdirs will be appended to $LTLIBNAME at the end. haveit= for x in $ltrpathdirs; do if test "X$x" = "X$dir"; then haveit=yes break fi done if test -z "$haveit"; then ltrpathdirs="$ltrpathdirs $dir" fi fi ;; -l*) dnl Handle this in the next round. names_next_round="$names_next_round "`echo "X$dep" | sed -e 's/^X-l//'` ;; *.la) dnl Handle this in the next round. Throw away the .la's dnl directory; it is already contained in a preceding -L dnl option. names_next_round="$names_next_round "`echo "X$dep" | sed -e 's,^X.*/,,' -e 's,^lib,,' -e 's,\.la$,,'` ;; *) dnl Most likely an immediate library name. LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$dep" LTLIB[]NAME="${LTLIB[]NAME}${LTLIB[]NAME:+ }$dep" ;; esac done fi else dnl Didn't find the library; assume it is in the system directories dnl known to the linker and runtime loader. (All the system dnl directories known to the linker should also be known to the dnl runtime loader, otherwise the system is severely misconfigured.) LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }-l$name" LTLIB[]NAME="${LTLIB[]NAME}${LTLIB[]NAME:+ }-l$name" fi fi fi done done if test "X$rpathdirs" != "X"; then if test -n "$acl_hardcode_libdir_separator"; then dnl Weird platform: only the last -rpath option counts, the user must dnl pass all path elements in one option. We can arrange that for a dnl single library, but not when more than one $LIBNAMEs are used. alldirs= for found_dir in $rpathdirs; do alldirs="${alldirs}${alldirs:+$acl_hardcode_libdir_separator}$found_dir" done dnl Note: acl_hardcode_libdir_flag_spec uses $libdir and $wl. acl_save_libdir="$libdir" libdir="$alldirs" eval flag=\"$acl_hardcode_libdir_flag_spec\" libdir="$acl_save_libdir" LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$flag" else dnl The -rpath options are cumulative. for found_dir in $rpathdirs; do acl_save_libdir="$libdir" libdir="$found_dir" eval flag=\"$acl_hardcode_libdir_flag_spec\" libdir="$acl_save_libdir" LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$flag" done fi fi if test "X$ltrpathdirs" != "X"; then dnl When using libtool, the option that works for both libraries and dnl executables is -R. The -R options are cumulative. for found_dir in $ltrpathdirs; do LTLIB[]NAME="${LTLIB[]NAME}${LTLIB[]NAME:+ }-R$found_dir" done fi popdef([P_A_C_K]) popdef([PACKLIBS]) popdef([PACKUP]) popdef([PACK]) popdef([NAME]) ]) dnl AC_LIB_APPENDTOVAR(VAR, CONTENTS) appends the elements of CONTENTS to VAR, dnl unless already present in VAR. dnl Works only for CPPFLAGS, not for LIB* variables because that sometimes dnl contains two or three consecutive elements that belong together. AC_DEFUN([AC_LIB_APPENDTOVAR], [ for element in [$2]; do haveit= for x in $[$1]; do AC_LIB_WITH_FINAL_PREFIX([eval x=\"$x\"]) if test "X$x" = "X$element"; then haveit=yes break fi done if test -z "$haveit"; then [$1]="${[$1]}${[$1]:+ }$element" fi done ]) dnl For those cases where a variable contains several -L and -l options dnl referring to unknown libraries and directories, this macro determines the dnl necessary additional linker options for the runtime path. dnl AC_LIB_LINKFLAGS_FROM_LIBS([LDADDVAR], [LIBSVALUE], [USE-LIBTOOL]) dnl sets LDADDVAR to linker options needed together with LIBSVALUE. dnl If USE-LIBTOOL evaluates to non-empty, linking with libtool is assumed, dnl otherwise linking without libtool is assumed. AC_DEFUN([AC_LIB_LINKFLAGS_FROM_LIBS], [ AC_REQUIRE([AC_LIB_RPATH]) AC_REQUIRE([AC_LIB_PREPARE_MULTILIB]) $1= if test "$enable_rpath" != no; then if test -n "$acl_hardcode_libdir_flag_spec" && test "$acl_hardcode_minus_L" = no; then dnl Use an explicit option to hardcode directories into the resulting dnl binary. rpathdirs= next= for opt in $2; do if test -n "$next"; then dir="$next" dnl No need to hardcode the standard /usr/lib. if test "X$dir" != "X/usr/$acl_libdirstem" \ && test "X$dir" != "X/usr/$acl_libdirstem2"; then rpathdirs="$rpathdirs $dir" fi next= else case $opt in -L) next=yes ;; -L*) dir=`echo "X$opt" | sed -e 's,^X-L,,'` dnl No need to hardcode the standard /usr/lib. if test "X$dir" != "X/usr/$acl_libdirstem" \ && test "X$dir" != "X/usr/$acl_libdirstem2"; then rpathdirs="$rpathdirs $dir" fi next= ;; *) next= ;; esac fi done if test "X$rpathdirs" != "X"; then if test -n ""$3""; then dnl libtool is used for linking. Use -R options. for dir in $rpathdirs; do $1="${$1}${$1:+ }-R$dir" done else dnl The linker is used for linking directly. if test -n "$acl_hardcode_libdir_separator"; then dnl Weird platform: only the last -rpath option counts, the user dnl must pass all path elements in one option. alldirs= for dir in $rpathdirs; do alldirs="${alldirs}${alldirs:+$acl_hardcode_libdir_separator}$dir" done acl_save_libdir="$libdir" libdir="$alldirs" eval flag=\"$acl_hardcode_libdir_flag_spec\" libdir="$acl_save_libdir" $1="$flag" else dnl The -rpath options are cumulative. for dir in $rpathdirs; do acl_save_libdir="$libdir" libdir="$dir" eval flag=\"$acl_hardcode_libdir_flag_spec\" libdir="$acl_save_libdir" $1="${$1}${$1:+ }$flag" done fi fi fi fi fi AC_SUBST([$1]) ]) # lib-prefix.m4 serial 7 (gettext-0.18) dnl Copyright (C) 2001-2005, 2008-2014 Free Software Foundation, Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, dnl with or without modifications, as long as this notice is preserved. dnl From Bruno Haible. dnl AC_LIB_ARG_WITH is synonymous to AC_ARG_WITH in autoconf-2.13, and dnl similar to AC_ARG_WITH in autoconf 2.52...2.57 except that is doesn't dnl require excessive bracketing. ifdef([AC_HELP_STRING], [AC_DEFUN([AC_LIB_ARG_WITH], [AC_ARG_WITH([$1],[[$2]],[$3],[$4])])], [AC_DEFUN([AC_][LIB_ARG_WITH], [AC_ARG_WITH([$1],[$2],[$3],[$4])])]) dnl AC_LIB_PREFIX adds to the CPPFLAGS and LDFLAGS the flags that are needed dnl to access previously installed libraries. The basic assumption is that dnl a user will want packages to use other packages he previously installed dnl with the same --prefix option. dnl This macro is not needed if only AC_LIB_LINKFLAGS is used to locate dnl libraries, but is otherwise very convenient. AC_DEFUN([AC_LIB_PREFIX], [ AC_BEFORE([$0], [AC_LIB_LINKFLAGS]) AC_REQUIRE([AC_PROG_CC]) AC_REQUIRE([AC_CANONICAL_HOST]) AC_REQUIRE([AC_LIB_PREPARE_MULTILIB]) AC_REQUIRE([AC_LIB_PREPARE_PREFIX]) dnl By default, look in $includedir and $libdir. use_additional=yes AC_LIB_WITH_FINAL_PREFIX([ eval additional_includedir=\"$includedir\" eval additional_libdir=\"$libdir\" ]) AC_LIB_ARG_WITH([lib-prefix], [ --with-lib-prefix[=DIR] search for libraries in DIR/include and DIR/lib --without-lib-prefix don't search for libraries in includedir and libdir], [ if test "X$withval" = "Xno"; then use_additional=no else if test "X$withval" = "X"; then AC_LIB_WITH_FINAL_PREFIX([ eval additional_includedir=\"$includedir\" eval additional_libdir=\"$libdir\" ]) else additional_includedir="$withval/include" additional_libdir="$withval/$acl_libdirstem" fi fi ]) if test $use_additional = yes; then dnl Potentially add $additional_includedir to $CPPFLAGS. dnl But don't add it dnl 1. if it's the standard /usr/include, dnl 2. if it's already present in $CPPFLAGS, dnl 3. if it's /usr/local/include and we are using GCC on Linux, dnl 4. if it doesn't exist as a directory. if test "X$additional_includedir" != "X/usr/include"; then haveit= for x in $CPPFLAGS; do AC_LIB_WITH_FINAL_PREFIX([eval x=\"$x\"]) if test "X$x" = "X-I$additional_includedir"; then haveit=yes break fi done if test -z "$haveit"; then if test "X$additional_includedir" = "X/usr/local/include"; then if test -n "$GCC"; then case $host_os in linux* | gnu* | k*bsd*-gnu) haveit=yes;; esac fi fi if test -z "$haveit"; then if test -d "$additional_includedir"; then dnl Really add $additional_includedir to $CPPFLAGS. CPPFLAGS="${CPPFLAGS}${CPPFLAGS:+ }-I$additional_includedir" fi fi fi fi dnl Potentially add $additional_libdir to $LDFLAGS. dnl But don't add it dnl 1. if it's the standard /usr/lib, dnl 2. if it's already present in $LDFLAGS, dnl 3. if it's /usr/local/lib and we are using GCC on Linux, dnl 4. if it doesn't exist as a directory. if test "X$additional_libdir" != "X/usr/$acl_libdirstem"; then haveit= for x in $LDFLAGS; do AC_LIB_WITH_FINAL_PREFIX([eval x=\"$x\"]) if test "X$x" = "X-L$additional_libdir"; then haveit=yes break fi done if test -z "$haveit"; then if test "X$additional_libdir" = "X/usr/local/$acl_libdirstem"; then if test -n "$GCC"; then case $host_os in linux*) haveit=yes;; esac fi fi if test -z "$haveit"; then if test -d "$additional_libdir"; then dnl Really add $additional_libdir to $LDFLAGS. LDFLAGS="${LDFLAGS}${LDFLAGS:+ }-L$additional_libdir" fi fi fi fi fi ]) dnl AC_LIB_PREPARE_PREFIX creates variables acl_final_prefix, dnl acl_final_exec_prefix, containing the values to which $prefix and dnl $exec_prefix will expand at the end of the configure script. AC_DEFUN([AC_LIB_PREPARE_PREFIX], [ dnl Unfortunately, prefix and exec_prefix get only finally determined dnl at the end of configure. if test "X$prefix" = "XNONE"; then acl_final_prefix="$ac_default_prefix" else acl_final_prefix="$prefix" fi if test "X$exec_prefix" = "XNONE"; then acl_final_exec_prefix='${prefix}' else acl_final_exec_prefix="$exec_prefix" fi acl_save_prefix="$prefix" prefix="$acl_final_prefix" eval acl_final_exec_prefix=\"$acl_final_exec_prefix\" prefix="$acl_save_prefix" ]) dnl AC_LIB_WITH_FINAL_PREFIX([statement]) evaluates statement, with the dnl variables prefix and exec_prefix bound to the values they will have dnl at the end of the configure script. AC_DEFUN([AC_LIB_WITH_FINAL_PREFIX], [ acl_save_prefix="$prefix" prefix="$acl_final_prefix" acl_save_exec_prefix="$exec_prefix" exec_prefix="$acl_final_exec_prefix" $1 exec_prefix="$acl_save_exec_prefix" prefix="$acl_save_prefix" ]) dnl AC_LIB_PREPARE_MULTILIB creates dnl - a variable acl_libdirstem, containing the basename of the libdir, either dnl "lib" or "lib64" or "lib/64", dnl - a variable acl_libdirstem2, as a secondary possible value for dnl acl_libdirstem, either the same as acl_libdirstem or "lib/sparcv9" or dnl "lib/amd64". AC_DEFUN([AC_LIB_PREPARE_MULTILIB], [ dnl There is no formal standard regarding lib and lib64. dnl On glibc systems, the current practice is that on a system supporting dnl 32-bit and 64-bit instruction sets or ABIs, 64-bit libraries go under dnl $prefix/lib64 and 32-bit libraries go under $prefix/lib. We determine dnl the compiler's default mode by looking at the compiler's library search dnl path. If at least one of its elements ends in /lib64 or points to a dnl directory whose absolute pathname ends in /lib64, we assume a 64-bit ABI. dnl Otherwise we use the default, namely "lib". dnl On Solaris systems, the current practice is that on a system supporting dnl 32-bit and 64-bit instruction sets or ABIs, 64-bit libraries go under dnl $prefix/lib/64 (which is a symlink to either $prefix/lib/sparcv9 or dnl $prefix/lib/amd64) and 32-bit libraries go under $prefix/lib. AC_REQUIRE([AC_CANONICAL_HOST]) acl_libdirstem=lib acl_libdirstem2= case "$host_os" in solaris*) dnl See Solaris 10 Software Developer Collection > Solaris 64-bit Developer's Guide > The Development Environment dnl . dnl "Portable Makefiles should refer to any library directories using the 64 symbolic link." dnl But we want to recognize the sparcv9 or amd64 subdirectory also if the dnl symlink is missing, so we set acl_libdirstem2 too. AC_CACHE_CHECK([for 64-bit host], [gl_cv_solaris_64bit], [AC_EGREP_CPP([sixtyfour bits], [ #ifdef _LP64 sixtyfour bits #endif ], [gl_cv_solaris_64bit=yes], [gl_cv_solaris_64bit=no]) ]) if test $gl_cv_solaris_64bit = yes; then acl_libdirstem=lib/64 case "$host_cpu" in sparc*) acl_libdirstem2=lib/sparcv9 ;; i*86 | x86_64) acl_libdirstem2=lib/amd64 ;; esac fi ;; *) searchpath=`(LC_ALL=C $CC -print-search-dirs) 2>/dev/null | sed -n -e 's,^libraries: ,,p' | sed -e 's,^=,,'` if test -n "$searchpath"; then acl_save_IFS="${IFS= }"; IFS=":" for searchdir in $searchpath; do if test -d "$searchdir"; then case "$searchdir" in */lib64/ | */lib64 ) acl_libdirstem=lib64 ;; */../ | */.. ) # Better ignore directories of this form. They are misleading. ;; *) searchdir=`cd "$searchdir" && pwd` case "$searchdir" in */lib64 ) acl_libdirstem=lib64 ;; esac ;; esac fi done IFS="$acl_save_IFS" fi ;; esac test -n "$acl_libdirstem2" || acl_libdirstem2="$acl_libdirstem" ]) # nls.m4 serial 5 (gettext-0.18) dnl Copyright (C) 1995-2003, 2005-2006, 2008-2014 Free Software Foundation, dnl Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, dnl with or without modifications, as long as this notice is preserved. dnl dnl This file can can be used in projects which are not available under dnl the GNU General Public License or the GNU Library General Public dnl License but which still want to provide support for the GNU gettext dnl functionality. dnl Please note that the actual code of the GNU gettext library is covered dnl by the GNU Library General Public License, and the rest of the GNU dnl gettext package package is covered by the GNU General Public License. dnl They are *not* in the public domain. dnl Authors: dnl Ulrich Drepper , 1995-2000. dnl Bruno Haible , 2000-2003. AC_PREREQ([2.50]) AC_DEFUN([AM_NLS], [ AC_MSG_CHECKING([whether NLS is requested]) dnl Default is enabled NLS AC_ARG_ENABLE([nls], [ --disable-nls do not use Native Language Support], USE_NLS=$enableval, USE_NLS=yes) AC_MSG_RESULT([$USE_NLS]) AC_SUBST([USE_NLS]) ]) # pkg.m4 - Macros to locate and utilise pkg-config. -*- Autoconf -*- # serial 1 (pkg-config-0.24) # # Copyright © 2004 Scott James Remnant . # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU # General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. # # As a special exception to the GNU General Public License, if you # distribute this file as part of a program that contains a # configuration script generated by Autoconf, you may include it under # the same distribution terms that you use for the rest of that program. # PKG_PROG_PKG_CONFIG([MIN-VERSION]) # ---------------------------------- AC_DEFUN([PKG_PROG_PKG_CONFIG], [m4_pattern_forbid([^_?PKG_[A-Z_]+$]) m4_pattern_allow([^PKG_CONFIG(_(PATH|LIBDIR|SYSROOT_DIR|ALLOW_SYSTEM_(CFLAGS|LIBS)))?$]) m4_pattern_allow([^PKG_CONFIG_(DISABLE_UNINSTALLED|TOP_BUILD_DIR|DEBUG_SPEW)$]) AC_ARG_VAR([PKG_CONFIG], [path to pkg-config utility]) AC_ARG_VAR([PKG_CONFIG_PATH], [directories to add to pkg-config's search path]) AC_ARG_VAR([PKG_CONFIG_LIBDIR], [path overriding pkg-config's built-in search path]) if test "x$ac_cv_env_PKG_CONFIG_set" != "xset"; then AC_PATH_TOOL([PKG_CONFIG], [pkg-config]) fi if test -n "$PKG_CONFIG"; then _pkg_min_version=m4_default([$1], [0.9.0]) AC_MSG_CHECKING([pkg-config is at least version $_pkg_min_version]) if $PKG_CONFIG --atleast-pkgconfig-version $_pkg_min_version; then AC_MSG_RESULT([yes]) else AC_MSG_RESULT([no]) PKG_CONFIG="" fi fi[]dnl ])# PKG_PROG_PKG_CONFIG # PKG_CHECK_EXISTS(MODULES, [ACTION-IF-FOUND], [ACTION-IF-NOT-FOUND]) # # Check to see whether a particular set of modules exists. Similar # to PKG_CHECK_MODULES(), but does not set variables or print errors. # # Please remember that m4 expands AC_REQUIRE([PKG_PROG_PKG_CONFIG]) # only at the first occurence in configure.ac, so if the first place # it's called might be skipped (such as if it is within an "if", you # have to call PKG_CHECK_EXISTS manually # -------------------------------------------------------------- AC_DEFUN([PKG_CHECK_EXISTS], [AC_REQUIRE([PKG_PROG_PKG_CONFIG])dnl if test -n "$PKG_CONFIG" && \ AC_RUN_LOG([$PKG_CONFIG --exists --print-errors "$1"]); then m4_default([$2], [:]) m4_ifvaln([$3], [else $3])dnl fi]) # _PKG_CONFIG([VARIABLE], [COMMAND], [MODULES]) # --------------------------------------------- m4_define([_PKG_CONFIG], [if test -n "$$1"; then pkg_cv_[]$1="$$1" elif test -n "$PKG_CONFIG"; then PKG_CHECK_EXISTS([$3], [pkg_cv_[]$1=`$PKG_CONFIG --[]$2 "$3" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes ], [pkg_failed=yes]) else pkg_failed=untried fi[]dnl ])# _PKG_CONFIG # _PKG_SHORT_ERRORS_SUPPORTED # ----------------------------- AC_DEFUN([_PKG_SHORT_ERRORS_SUPPORTED], [AC_REQUIRE([PKG_PROG_PKG_CONFIG]) if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then _pkg_short_errors_supported=yes else _pkg_short_errors_supported=no fi[]dnl ])# _PKG_SHORT_ERRORS_SUPPORTED # PKG_CHECK_MODULES(VARIABLE-PREFIX, MODULES, [ACTION-IF-FOUND], # [ACTION-IF-NOT-FOUND]) # # # Note that if there is a possibility the first call to # PKG_CHECK_MODULES might not happen, you should be sure to include an # explicit call to PKG_PROG_PKG_CONFIG in your configure.ac # # # -------------------------------------------------------------- AC_DEFUN([PKG_CHECK_MODULES], [AC_REQUIRE([PKG_PROG_PKG_CONFIG])dnl AC_ARG_VAR([$1][_CFLAGS], [C compiler flags for $1, overriding pkg-config])dnl AC_ARG_VAR([$1][_LIBS], [linker flags for $1, overriding pkg-config])dnl pkg_failed=no AC_MSG_CHECKING([for $1]) _PKG_CONFIG([$1][_CFLAGS], [cflags], [$2]) _PKG_CONFIG([$1][_LIBS], [libs], [$2]) m4_define([_PKG_TEXT], [Alternatively, you may set the environment variables $1[]_CFLAGS and $1[]_LIBS to avoid the need to call pkg-config. See the pkg-config man page for more details.]) if test $pkg_failed = yes; then AC_MSG_RESULT([no]) _PKG_SHORT_ERRORS_SUPPORTED if test $_pkg_short_errors_supported = yes; then $1[]_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "$2" 2>&1` else $1[]_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "$2" 2>&1` fi # Put the nasty error message in config.log where it belongs echo "$$1[]_PKG_ERRORS" >&AS_MESSAGE_LOG_FD m4_default([$4], [AC_MSG_ERROR( [Package requirements ($2) were not met: $$1_PKG_ERRORS Consider adjusting the PKG_CONFIG_PATH environment variable if you installed software in a non-standard prefix. _PKG_TEXT])[]dnl ]) elif test $pkg_failed = untried; then AC_MSG_RESULT([no]) m4_default([$4], [AC_MSG_FAILURE( [The pkg-config script could not be found or is too old. Make sure it is in your PATH or set the PKG_CONFIG environment variable to the full path to pkg-config. _PKG_TEXT To get pkg-config, see .])[]dnl ]) else $1[]_CFLAGS=$pkg_cv_[]$1[]_CFLAGS $1[]_LIBS=$pkg_cv_[]$1[]_LIBS AC_MSG_RESULT([yes]) $3 fi[]dnl ])# PKG_CHECK_MODULES # PKG_INSTALLDIR(DIRECTORY) # ------------------------- # Substitutes the variable pkgconfigdir as the location where a module # should install pkg-config .pc files. By default the directory is # $libdir/pkgconfig, but the default can be changed by passing # DIRECTORY. The user can override through the --with-pkgconfigdir # parameter. AC_DEFUN([PKG_INSTALLDIR], [m4_pushdef([pkg_default], [m4_default([$1], ['${libdir}/pkgconfig'])]) m4_pushdef([pkg_description], [pkg-config installation directory @<:@]pkg_default[@:>@]) AC_ARG_WITH([pkgconfigdir], [AS_HELP_STRING([--with-pkgconfigdir], pkg_description)],, [with_pkgconfigdir=]pkg_default) AC_SUBST([pkgconfigdir], [$with_pkgconfigdir]) m4_popdef([pkg_default]) m4_popdef([pkg_description]) ]) dnl PKG_INSTALLDIR # PKG_NOARCH_INSTALLDIR(DIRECTORY) # ------------------------- # Substitutes the variable noarch_pkgconfigdir as the location where a # module should install arch-independent pkg-config .pc files. By # default the directory is $datadir/pkgconfig, but the default can be # changed by passing DIRECTORY. The user can override through the # --with-noarch-pkgconfigdir parameter. AC_DEFUN([PKG_NOARCH_INSTALLDIR], [m4_pushdef([pkg_default], [m4_default([$1], ['${datadir}/pkgconfig'])]) m4_pushdef([pkg_description], [pkg-config arch-independent installation directory @<:@]pkg_default[@:>@]) AC_ARG_WITH([noarch-pkgconfigdir], [AS_HELP_STRING([--with-noarch-pkgconfigdir], pkg_description)],, [with_noarch_pkgconfigdir=]pkg_default) AC_SUBST([noarch_pkgconfigdir], [$with_noarch_pkgconfigdir]) m4_popdef([pkg_default]) m4_popdef([pkg_description]) ]) dnl PKG_NOARCH_INSTALLDIR # PKG_CHECK_VAR(VARIABLE, MODULE, CONFIG-VARIABLE, # [ACTION-IF-FOUND], [ACTION-IF-NOT-FOUND]) # ------------------------------------------- # Retrieves the value of the pkg-config variable for the given module. AC_DEFUN([PKG_CHECK_VAR], [AC_REQUIRE([PKG_PROG_PKG_CONFIG])dnl AC_ARG_VAR([$1], [value of $3 for $2, overriding pkg-config])dnl _PKG_CONFIG([$1], [variable="][$3]["], [$2]) AS_VAR_COPY([$1], [pkg_cv_][$1]) AS_VAR_IF([$1], [""], [$5], [$4])dnl ])# PKG_CHECK_VAR # po.m4 serial 22 (gettext-0.19) dnl Copyright (C) 1995-2014 Free Software Foundation, Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, dnl with or without modifications, as long as this notice is preserved. dnl dnl This file can can be used in projects which are not available under dnl the GNU General Public License or the GNU Library General Public dnl License but which still want to provide support for the GNU gettext dnl functionality. dnl Please note that the actual code of the GNU gettext library is covered dnl by the GNU Library General Public License, and the rest of the GNU dnl gettext package package is covered by the GNU General Public License. dnl They are *not* in the public domain. dnl Authors: dnl Ulrich Drepper , 1995-2000. dnl Bruno Haible , 2000-2003. AC_PREREQ([2.60]) dnl Checks for all prerequisites of the po subdirectory. AC_DEFUN([AM_PO_SUBDIRS], [ AC_REQUIRE([AC_PROG_MAKE_SET])dnl AC_REQUIRE([AC_PROG_INSTALL])dnl AC_REQUIRE([AC_PROG_MKDIR_P])dnl AC_REQUIRE([AC_PROG_SED])dnl AC_REQUIRE([AM_NLS])dnl dnl Release version of the gettext macros. This is used to ensure that dnl the gettext macros and po/Makefile.in.in are in sync. AC_SUBST([GETTEXT_MACRO_VERSION], [0.19]) dnl Perform the following tests also if --disable-nls has been given, dnl because they are needed for "make dist" to work. dnl Search for GNU msgfmt in the PATH. dnl The first test excludes Solaris msgfmt and early GNU msgfmt versions. dnl The second test excludes FreeBSD msgfmt. AM_PATH_PROG_WITH_TEST(MSGFMT, msgfmt, [$ac_dir/$ac_word --statistics /dev/null >&]AS_MESSAGE_LOG_FD[ 2>&1 && (if $ac_dir/$ac_word --statistics /dev/null 2>&1 >/dev/null | grep usage >/dev/null; then exit 1; else exit 0; fi)], :) AC_PATH_PROG([GMSGFMT], [gmsgfmt], [$MSGFMT]) dnl Test whether it is GNU msgfmt >= 0.15. changequote(,)dnl case `$MSGFMT --version | sed 1q | sed -e 's,^[^0-9]*,,'` in '' | 0.[0-9] | 0.[0-9].* | 0.1[0-4] | 0.1[0-4].*) MSGFMT_015=: ;; *) MSGFMT_015=$MSGFMT ;; esac changequote([,])dnl AC_SUBST([MSGFMT_015]) changequote(,)dnl case `$GMSGFMT --version | sed 1q | sed -e 's,^[^0-9]*,,'` in '' | 0.[0-9] | 0.[0-9].* | 0.1[0-4] | 0.1[0-4].*) GMSGFMT_015=: ;; *) GMSGFMT_015=$GMSGFMT ;; esac changequote([,])dnl AC_SUBST([GMSGFMT_015]) dnl Search for GNU xgettext 0.12 or newer in the PATH. dnl The first test excludes Solaris xgettext and early GNU xgettext versions. dnl The second test excludes FreeBSD xgettext. AM_PATH_PROG_WITH_TEST(XGETTEXT, xgettext, [$ac_dir/$ac_word --omit-header --copyright-holder= --msgid-bugs-address= /dev/null >&]AS_MESSAGE_LOG_FD[ 2>&1 && (if $ac_dir/$ac_word --omit-header --copyright-holder= --msgid-bugs-address= /dev/null 2>&1 >/dev/null | grep usage >/dev/null; then exit 1; else exit 0; fi)], :) dnl Remove leftover from FreeBSD xgettext call. rm -f messages.po dnl Test whether it is GNU xgettext >= 0.15. changequote(,)dnl case `$XGETTEXT --version | sed 1q | sed -e 's,^[^0-9]*,,'` in '' | 0.[0-9] | 0.[0-9].* | 0.1[0-4] | 0.1[0-4].*) XGETTEXT_015=: ;; *) XGETTEXT_015=$XGETTEXT ;; esac changequote([,])dnl AC_SUBST([XGETTEXT_015]) dnl Search for GNU msgmerge 0.11 or newer in the PATH. AM_PATH_PROG_WITH_TEST(MSGMERGE, msgmerge, [$ac_dir/$ac_word --update -q /dev/null /dev/null >&]AS_MESSAGE_LOG_FD[ 2>&1], :) dnl Installation directories. dnl Autoconf >= 2.60 defines localedir. For older versions of autoconf, we dnl have to define it here, so that it can be used in po/Makefile. test -n "$localedir" || localedir='${datadir}/locale' AC_SUBST([localedir]) dnl Support for AM_XGETTEXT_OPTION. test -n "${XGETTEXT_EXTRA_OPTIONS+set}" || XGETTEXT_EXTRA_OPTIONS= AC_SUBST([XGETTEXT_EXTRA_OPTIONS]) AC_CONFIG_COMMANDS([po-directories], [[ for ac_file in $CONFIG_FILES; do # Support "outfile[:infile[:infile...]]" case "$ac_file" in *:*) ac_file=`echo "$ac_file"|sed 's%:.*%%'` ;; esac # PO directories have a Makefile.in generated from Makefile.in.in. case "$ac_file" in */Makefile.in) # Adjust a relative srcdir. ac_dir=`echo "$ac_file"|sed 's%/[^/][^/]*$%%'` ac_dir_suffix=/`echo "$ac_dir"|sed 's%^\./%%'` ac_dots=`echo "$ac_dir_suffix"|sed 's%/[^/]*%../%g'` # In autoconf-2.13 it is called $ac_given_srcdir. # In autoconf-2.50 it is called $srcdir. test -n "$ac_given_srcdir" || ac_given_srcdir="$srcdir" case "$ac_given_srcdir" in .) top_srcdir=`echo $ac_dots|sed 's%/$%%'` ;; /*) top_srcdir="$ac_given_srcdir" ;; *) top_srcdir="$ac_dots$ac_given_srcdir" ;; esac # Treat a directory as a PO directory if and only if it has a # POTFILES.in file. This allows packages to have multiple PO # directories under different names or in different locations. if test -f "$ac_given_srcdir/$ac_dir/POTFILES.in"; then rm -f "$ac_dir/POTFILES" test -n "$as_me" && echo "$as_me: creating $ac_dir/POTFILES" || echo "creating $ac_dir/POTFILES" gt_tab=`printf '\t'` cat "$ac_given_srcdir/$ac_dir/POTFILES.in" | sed -e "/^#/d" -e "/^[ ${gt_tab}]*\$/d" -e "s,.*, $top_srcdir/& \\\\," | sed -e "\$s/\(.*\) \\\\/\1/" > "$ac_dir/POTFILES" POMAKEFILEDEPS="POTFILES.in" # ALL_LINGUAS, POFILES, UPDATEPOFILES, DUMMYPOFILES, GMOFILES depend # on $ac_dir but don't depend on user-specified configuration # parameters. if test -f "$ac_given_srcdir/$ac_dir/LINGUAS"; then # The LINGUAS file contains the set of available languages. if test -n "$OBSOLETE_ALL_LINGUAS"; then test -n "$as_me" && echo "$as_me: setting ALL_LINGUAS in configure.in is obsolete" || echo "setting ALL_LINGUAS in configure.in is obsolete" fi ALL_LINGUAS_=`sed -e "/^#/d" -e "s/#.*//" "$ac_given_srcdir/$ac_dir/LINGUAS"` # Hide the ALL_LINGUAS assignment from automake < 1.5. eval 'ALL_LINGUAS''=$ALL_LINGUAS_' POMAKEFILEDEPS="$POMAKEFILEDEPS LINGUAS" else # The set of available languages was given in configure.in. # Hide the ALL_LINGUAS assignment from automake < 1.5. eval 'ALL_LINGUAS''=$OBSOLETE_ALL_LINGUAS' fi # Compute POFILES # as $(foreach lang, $(ALL_LINGUAS), $(srcdir)/$(lang).po) # Compute UPDATEPOFILES # as $(foreach lang, $(ALL_LINGUAS), $(lang).po-update) # Compute DUMMYPOFILES # as $(foreach lang, $(ALL_LINGUAS), $(lang).nop) # Compute GMOFILES # as $(foreach lang, $(ALL_LINGUAS), $(srcdir)/$(lang).gmo) case "$ac_given_srcdir" in .) srcdirpre= ;; *) srcdirpre='$(srcdir)/' ;; esac POFILES= UPDATEPOFILES= DUMMYPOFILES= GMOFILES= for lang in $ALL_LINGUAS; do POFILES="$POFILES $srcdirpre$lang.po" UPDATEPOFILES="$UPDATEPOFILES $lang.po-update" DUMMYPOFILES="$DUMMYPOFILES $lang.nop" GMOFILES="$GMOFILES $srcdirpre$lang.gmo" done # CATALOGS depends on both $ac_dir and the user's LINGUAS # environment variable. INST_LINGUAS= if test -n "$ALL_LINGUAS"; then for presentlang in $ALL_LINGUAS; do useit=no if test "%UNSET%" != "$LINGUAS"; then desiredlanguages="$LINGUAS" else desiredlanguages="$ALL_LINGUAS" fi for desiredlang in $desiredlanguages; do # Use the presentlang catalog if desiredlang is # a. equal to presentlang, or # b. a variant of presentlang (because in this case, # presentlang can be used as a fallback for messages # which are not translated in the desiredlang catalog). case "$desiredlang" in "$presentlang"*) useit=yes;; esac done if test $useit = yes; then INST_LINGUAS="$INST_LINGUAS $presentlang" fi done fi CATALOGS= if test -n "$INST_LINGUAS"; then for lang in $INST_LINGUAS; do CATALOGS="$CATALOGS $lang.gmo" done fi test -n "$as_me" && echo "$as_me: creating $ac_dir/Makefile" || echo "creating $ac_dir/Makefile" sed -e "/^POTFILES =/r $ac_dir/POTFILES" -e "/^# Makevars/r $ac_given_srcdir/$ac_dir/Makevars" -e "s|@POFILES@|$POFILES|g" -e "s|@UPDATEPOFILES@|$UPDATEPOFILES|g" -e "s|@DUMMYPOFILES@|$DUMMYPOFILES|g" -e "s|@GMOFILES@|$GMOFILES|g" -e "s|@CATALOGS@|$CATALOGS|g" -e "s|@POMAKEFILEDEPS@|$POMAKEFILEDEPS|g" "$ac_dir/Makefile.in" > "$ac_dir/Makefile" for f in "$ac_given_srcdir/$ac_dir"/Rules-*; do if test -f "$f"; then case "$f" in *.orig | *.bak | *~) ;; *) cat "$f" >> "$ac_dir/Makefile" ;; esac fi done fi ;; esac done]], [# Capture the value of obsolete ALL_LINGUAS because we need it to compute # POFILES, UPDATEPOFILES, DUMMYPOFILES, GMOFILES, CATALOGS. But hide it # from automake < 1.5. eval 'OBSOLETE_ALL_LINGUAS''="$ALL_LINGUAS"' # Capture the value of LINGUAS because we need it to compute CATALOGS. LINGUAS="${LINGUAS-%UNSET%}" ]) ]) dnl Postprocesses a Makefile in a directory containing PO files. AC_DEFUN([AM_POSTPROCESS_PO_MAKEFILE], [ # When this code is run, in config.status, two variables have already been # set: # - OBSOLETE_ALL_LINGUAS is the value of LINGUAS set in configure.in, # - LINGUAS is the value of the environment variable LINGUAS at configure # time. changequote(,)dnl # Adjust a relative srcdir. ac_dir=`echo "$ac_file"|sed 's%/[^/][^/]*$%%'` ac_dir_suffix=/`echo "$ac_dir"|sed 's%^\./%%'` ac_dots=`echo "$ac_dir_suffix"|sed 's%/[^/]*%../%g'` # In autoconf-2.13 it is called $ac_given_srcdir. # In autoconf-2.50 it is called $srcdir. test -n "$ac_given_srcdir" || ac_given_srcdir="$srcdir" case "$ac_given_srcdir" in .) top_srcdir=`echo $ac_dots|sed 's%/$%%'` ;; /*) top_srcdir="$ac_given_srcdir" ;; *) top_srcdir="$ac_dots$ac_given_srcdir" ;; esac # Find a way to echo strings without interpreting backslash. if test "X`(echo '\t') 2>/dev/null`" = 'X\t'; then gt_echo='echo' else if test "X`(printf '%s\n' '\t') 2>/dev/null`" = 'X\t'; then gt_echo='printf %s\n' else echo_func () { cat < "$ac_file.tmp" tab=`printf '\t'` if grep -l '@TCLCATALOGS@' "$ac_file" > /dev/null; then # Add dependencies that cannot be formulated as a simple suffix rule. for lang in $ALL_LINGUAS; do frobbedlang=`echo $lang | sed -e 's/\..*$//' -e 'y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/'` cat >> "$ac_file.tmp" < /dev/null; then # Add dependencies that cannot be formulated as a simple suffix rule. for lang in $ALL_LINGUAS; do frobbedlang=`echo $lang | sed -e 's/_/-/g' -e 's/^sr-CS/sr-SP/' -e 's/@latin$/-Latn/' -e 's/@cyrillic$/-Cyrl/' -e 's/^sr-SP$/sr-SP-Latn/' -e 's/^uz-UZ$/uz-UZ-Latn/'` cat >> "$ac_file.tmp" <> "$ac_file.tmp" <, 1996. AC_PREREQ([2.50]) # Search path for a program which passes the given test. dnl AM_PATH_PROG_WITH_TEST(VARIABLE, PROG-TO-CHECK-FOR, dnl TEST-PERFORMED-ON-FOUND_PROGRAM [, VALUE-IF-NOT-FOUND [, PATH]]) AC_DEFUN([AM_PATH_PROG_WITH_TEST], [ # Prepare PATH_SEPARATOR. # The user is always right. if test "${PATH_SEPARATOR+set}" != set; then # Determine PATH_SEPARATOR by trying to find /bin/sh in a PATH which # contains only /bin. Note that ksh looks also at the FPATH variable, # so we have to set that as well for the test. PATH_SEPARATOR=: (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 \ && { (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 \ || PATH_SEPARATOR=';' } fi # Find out how to test for executable files. Don't use a zero-byte file, # as systems may use methods other than mode bits to determine executability. cat >conf$$.file <<_ASEOF #! /bin/sh exit 0 _ASEOF chmod +x conf$$.file if test -x conf$$.file >/dev/null 2>&1; then ac_executable_p="test -x" else ac_executable_p="test -f" fi rm -f conf$$.file # Extract the first word of "$2", so it can be a program name with args. set dummy $2; ac_word=[$]2 AC_MSG_CHECKING([for $ac_word]) AC_CACHE_VAL([ac_cv_path_$1], [case "[$]$1" in [[\\/]]* | ?:[[\\/]]*) ac_cv_path_$1="[$]$1" # Let the user override the test with a path. ;; *) ac_save_IFS="$IFS"; IFS=$PATH_SEPARATOR for ac_dir in ifelse([$5], , $PATH, [$5]); do IFS="$ac_save_IFS" test -z "$ac_dir" && ac_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if $ac_executable_p "$ac_dir/$ac_word$ac_exec_ext"; then echo "$as_me: trying $ac_dir/$ac_word..." >&AS_MESSAGE_LOG_FD if [$3]; then ac_cv_path_$1="$ac_dir/$ac_word$ac_exec_ext" break 2 fi fi done done IFS="$ac_save_IFS" dnl If no 4th arg is given, leave the cache variable unset, dnl so AC_PATH_PROGS will keep looking. ifelse([$4], , , [ test -z "[$]ac_cv_path_$1" && ac_cv_path_$1="$4" ])dnl ;; esac])dnl $1="$ac_cv_path_$1" if test ifelse([$4], , [-n "[$]$1"], ["[$]$1" != "$4"]); then AC_MSG_RESULT([$][$1]) else AC_MSG_RESULT([no]) fi AC_SUBST([$1])dnl ]) # Copyright (C) 2002-2013 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # AM_AUTOMAKE_VERSION(VERSION) # ---------------------------- # Automake X.Y traces this macro to ensure aclocal.m4 has been # generated from the m4 files accompanying Automake X.Y. # (This private macro should not be called outside this file.) AC_DEFUN([AM_AUTOMAKE_VERSION], [am__api_version='1.14' dnl Some users find AM_AUTOMAKE_VERSION and mistake it for a way to dnl require some minimum version. Point them to the right macro. m4_if([$1], [1.14.1], [], [AC_FATAL([Do not call $0, use AM_INIT_AUTOMAKE([$1]).])])dnl ]) # _AM_AUTOCONF_VERSION(VERSION) # ----------------------------- # aclocal traces this macro to find the Autoconf version. # This is a private macro too. Using m4_define simplifies # the logic in aclocal, which can simply ignore this definition. m4_define([_AM_AUTOCONF_VERSION], []) # AM_SET_CURRENT_AUTOMAKE_VERSION # ------------------------------- # Call AM_AUTOMAKE_VERSION and AM_AUTOMAKE_VERSION so they can be traced. # This function is AC_REQUIREd by AM_INIT_AUTOMAKE. AC_DEFUN([AM_SET_CURRENT_AUTOMAKE_VERSION], [AM_AUTOMAKE_VERSION([1.14.1])dnl m4_ifndef([AC_AUTOCONF_VERSION], [m4_copy([m4_PACKAGE_VERSION], [AC_AUTOCONF_VERSION])])dnl _AM_AUTOCONF_VERSION(m4_defn([AC_AUTOCONF_VERSION]))]) # AM_AUX_DIR_EXPAND -*- Autoconf -*- # Copyright (C) 2001-2013 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # For projects using AC_CONFIG_AUX_DIR([foo]), Autoconf sets # $ac_aux_dir to '$srcdir/foo'. In other projects, it is set to # '$srcdir', '$srcdir/..', or '$srcdir/../..'. # # Of course, Automake must honor this variable whenever it calls a # tool from the auxiliary directory. The problem is that $srcdir (and # therefore $ac_aux_dir as well) can be either absolute or relative, # depending on how configure is run. This is pretty annoying, since # it makes $ac_aux_dir quite unusable in subdirectories: in the top # source directory, any form will work fine, but in subdirectories a # relative path needs to be adjusted first. # # $ac_aux_dir/missing # fails when called from a subdirectory if $ac_aux_dir is relative # $top_srcdir/$ac_aux_dir/missing # fails if $ac_aux_dir is absolute, # fails when called from a subdirectory in a VPATH build with # a relative $ac_aux_dir # # The reason of the latter failure is that $top_srcdir and $ac_aux_dir # are both prefixed by $srcdir. In an in-source build this is usually # harmless because $srcdir is '.', but things will broke when you # start a VPATH build or use an absolute $srcdir. # # So we could use something similar to $top_srcdir/$ac_aux_dir/missing, # iff we strip the leading $srcdir from $ac_aux_dir. That would be: # am_aux_dir='\$(top_srcdir)/'`expr "$ac_aux_dir" : "$srcdir//*\(.*\)"` # and then we would define $MISSING as # MISSING="\${SHELL} $am_aux_dir/missing" # This will work as long as MISSING is not called from configure, because # unfortunately $(top_srcdir) has no meaning in configure. # However there are other variables, like CC, which are often used in # configure, and could therefore not use this "fixed" $ac_aux_dir. # # Another solution, used here, is to always expand $ac_aux_dir to an # absolute PATH. The drawback is that using absolute paths prevent a # configured tree to be moved without reconfiguration. AC_DEFUN([AM_AUX_DIR_EXPAND], [AC_REQUIRE([AC_CONFIG_AUX_DIR_DEFAULT])dnl # Expand $ac_aux_dir to an absolute path. am_aux_dir=`cd "$ac_aux_dir" && pwd` ]) # AM_CONDITIONAL -*- Autoconf -*- # Copyright (C) 1997-2013 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # AM_CONDITIONAL(NAME, SHELL-CONDITION) # ------------------------------------- # Define a conditional. AC_DEFUN([AM_CONDITIONAL], [AC_PREREQ([2.52])dnl m4_if([$1], [TRUE], [AC_FATAL([$0: invalid condition: $1])], [$1], [FALSE], [AC_FATAL([$0: invalid condition: $1])])dnl AC_SUBST([$1_TRUE])dnl AC_SUBST([$1_FALSE])dnl _AM_SUBST_NOTMAKE([$1_TRUE])dnl _AM_SUBST_NOTMAKE([$1_FALSE])dnl m4_define([_AM_COND_VALUE_$1], [$2])dnl if $2; then $1_TRUE= $1_FALSE='#' else $1_TRUE='#' $1_FALSE= fi AC_CONFIG_COMMANDS_PRE( [if test -z "${$1_TRUE}" && test -z "${$1_FALSE}"; then AC_MSG_ERROR([[conditional "$1" was never defined. Usually this means the macro was only invoked conditionally.]]) fi])]) # Do all the work for Automake. -*- Autoconf -*- # Copyright (C) 1996-2013 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This macro actually does too much. Some checks are only needed if # your package does certain things. But this isn't really a big deal. dnl Redefine AC_PROG_CC to automatically invoke _AM_PROG_CC_C_O. m4_define([AC_PROG_CC], m4_defn([AC_PROG_CC]) [_AM_PROG_CC_C_O ]) # AM_INIT_AUTOMAKE(PACKAGE, VERSION, [NO-DEFINE]) # AM_INIT_AUTOMAKE([OPTIONS]) # ----------------------------------------------- # The call with PACKAGE and VERSION arguments is the old style # call (pre autoconf-2.50), which is being phased out. PACKAGE # and VERSION should now be passed to AC_INIT and removed from # the call to AM_INIT_AUTOMAKE. # We support both call styles for the transition. After # the next Automake release, Autoconf can make the AC_INIT # arguments mandatory, and then we can depend on a new Autoconf # release and drop the old call support. AC_DEFUN([AM_INIT_AUTOMAKE], [AC_PREREQ([2.65])dnl dnl Autoconf wants to disallow AM_ names. We explicitly allow dnl the ones we care about. m4_pattern_allow([^AM_[A-Z]+FLAGS$])dnl AC_REQUIRE([AM_SET_CURRENT_AUTOMAKE_VERSION])dnl AC_REQUIRE([AC_PROG_INSTALL])dnl if test "`cd $srcdir && pwd`" != "`pwd`"; then # Use -I$(srcdir) only when $(srcdir) != ., so that make's output # is not polluted with repeated "-I." AC_SUBST([am__isrc], [' -I$(srcdir)'])_AM_SUBST_NOTMAKE([am__isrc])dnl # test to see if srcdir already configured if test -f $srcdir/config.status; then AC_MSG_ERROR([source directory already configured; run "make distclean" there first]) fi fi # test whether we have cygpath if test -z "$CYGPATH_W"; then if (cygpath --version) >/dev/null 2>/dev/null; then CYGPATH_W='cygpath -w' else CYGPATH_W=echo fi fi AC_SUBST([CYGPATH_W]) # Define the identity of the package. dnl Distinguish between old-style and new-style calls. m4_ifval([$2], [AC_DIAGNOSE([obsolete], [$0: two- and three-arguments forms are deprecated.]) m4_ifval([$3], [_AM_SET_OPTION([no-define])])dnl AC_SUBST([PACKAGE], [$1])dnl AC_SUBST([VERSION], [$2])], [_AM_SET_OPTIONS([$1])dnl dnl Diagnose old-style AC_INIT with new-style AM_AUTOMAKE_INIT. m4_if( m4_ifdef([AC_PACKAGE_NAME], [ok]):m4_ifdef([AC_PACKAGE_VERSION], [ok]), [ok:ok],, [m4_fatal([AC_INIT should be called with package and version arguments])])dnl AC_SUBST([PACKAGE], ['AC_PACKAGE_TARNAME'])dnl AC_SUBST([VERSION], ['AC_PACKAGE_VERSION'])])dnl _AM_IF_OPTION([no-define],, [AC_DEFINE_UNQUOTED([PACKAGE], ["$PACKAGE"], [Name of package]) AC_DEFINE_UNQUOTED([VERSION], ["$VERSION"], [Version number of package])])dnl # Some tools Automake needs. AC_REQUIRE([AM_SANITY_CHECK])dnl AC_REQUIRE([AC_ARG_PROGRAM])dnl AM_MISSING_PROG([ACLOCAL], [aclocal-${am__api_version}]) AM_MISSING_PROG([AUTOCONF], [autoconf]) AM_MISSING_PROG([AUTOMAKE], [automake-${am__api_version}]) AM_MISSING_PROG([AUTOHEADER], [autoheader]) AM_MISSING_PROG([MAKEINFO], [makeinfo]) AC_REQUIRE([AM_PROG_INSTALL_SH])dnl AC_REQUIRE([AM_PROG_INSTALL_STRIP])dnl AC_REQUIRE([AC_PROG_MKDIR_P])dnl # For better backward compatibility. To be removed once Automake 1.9.x # dies out for good. For more background, see: # # AC_SUBST([mkdir_p], ['$(MKDIR_P)']) # We need awk for the "check" target. The system "awk" is bad on # some platforms. AC_REQUIRE([AC_PROG_AWK])dnl AC_REQUIRE([AC_PROG_MAKE_SET])dnl AC_REQUIRE([AM_SET_LEADING_DOT])dnl _AM_IF_OPTION([tar-ustar], [_AM_PROG_TAR([ustar])], [_AM_IF_OPTION([tar-pax], [_AM_PROG_TAR([pax])], [_AM_PROG_TAR([v7])])]) _AM_IF_OPTION([no-dependencies],, [AC_PROVIDE_IFELSE([AC_PROG_CC], [_AM_DEPENDENCIES([CC])], [m4_define([AC_PROG_CC], m4_defn([AC_PROG_CC])[_AM_DEPENDENCIES([CC])])])dnl AC_PROVIDE_IFELSE([AC_PROG_CXX], [_AM_DEPENDENCIES([CXX])], [m4_define([AC_PROG_CXX], m4_defn([AC_PROG_CXX])[_AM_DEPENDENCIES([CXX])])])dnl AC_PROVIDE_IFELSE([AC_PROG_OBJC], [_AM_DEPENDENCIES([OBJC])], [m4_define([AC_PROG_OBJC], m4_defn([AC_PROG_OBJC])[_AM_DEPENDENCIES([OBJC])])])dnl AC_PROVIDE_IFELSE([AC_PROG_OBJCXX], [_AM_DEPENDENCIES([OBJCXX])], [m4_define([AC_PROG_OBJCXX], m4_defn([AC_PROG_OBJCXX])[_AM_DEPENDENCIES([OBJCXX])])])dnl ]) AC_REQUIRE([AM_SILENT_RULES])dnl dnl The testsuite driver may need to know about EXEEXT, so add the dnl 'am__EXEEXT' conditional if _AM_COMPILER_EXEEXT was seen. This dnl macro is hooked onto _AC_COMPILER_EXEEXT early, see below. AC_CONFIG_COMMANDS_PRE(dnl [m4_provide_if([_AM_COMPILER_EXEEXT], [AM_CONDITIONAL([am__EXEEXT], [test -n "$EXEEXT"])])])dnl # POSIX will say in a future version that running "rm -f" with no argument # is OK; and we want to be able to make that assumption in our Makefile # recipes. So use an aggressive probe to check that the usage we want is # actually supported "in the wild" to an acceptable degree. # See automake bug#10828. # To make any issue more visible, cause the running configure to be aborted # by default if the 'rm' program in use doesn't match our expectations; the # user can still override this though. if rm -f && rm -fr && rm -rf; then : OK; else cat >&2 <<'END' Oops! Your 'rm' program seems unable to run without file operands specified on the command line, even when the '-f' option is present. This is contrary to the behaviour of most rm programs out there, and not conforming with the upcoming POSIX standard: Please tell bug-automake@gnu.org about your system, including the value of your $PATH and any error possibly output before this message. This can help us improve future automake versions. END if test x"$ACCEPT_INFERIOR_RM_PROGRAM" = x"yes"; then echo 'Configuration will proceed anyway, since you have set the' >&2 echo 'ACCEPT_INFERIOR_RM_PROGRAM variable to "yes"' >&2 echo >&2 else cat >&2 <<'END' Aborting the configuration process, to ensure you take notice of the issue. You can download and install GNU coreutils to get an 'rm' implementation that behaves properly: . If you want to complete the configuration process using your problematic 'rm' anyway, export the environment variable ACCEPT_INFERIOR_RM_PROGRAM to "yes", and re-run configure. END AC_MSG_ERROR([Your 'rm' program is bad, sorry.]) fi fi ]) dnl Hook into '_AC_COMPILER_EXEEXT' early to learn its expansion. Do not dnl add the conditional right here, as _AC_COMPILER_EXEEXT may be further dnl mangled by Autoconf and run in a shell conditional statement. m4_define([_AC_COMPILER_EXEEXT], m4_defn([_AC_COMPILER_EXEEXT])[m4_provide([_AM_COMPILER_EXEEXT])]) # When config.status generates a header, we must update the stamp-h file. # This file resides in the same directory as the config header # that is generated. The stamp files are numbered to have different names. # Autoconf calls _AC_AM_CONFIG_HEADER_HOOK (when defined) in the # loop where config.status creates the headers, so we can generate # our stamp files there. AC_DEFUN([_AC_AM_CONFIG_HEADER_HOOK], [# Compute $1's index in $config_headers. _am_arg=$1 _am_stamp_count=1 for _am_header in $config_headers :; do case $_am_header in $_am_arg | $_am_arg:* ) break ;; * ) _am_stamp_count=`expr $_am_stamp_count + 1` ;; esac done echo "timestamp for $_am_arg" >`AS_DIRNAME(["$_am_arg"])`/stamp-h[]$_am_stamp_count]) # Copyright (C) 2001-2013 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # AM_PROG_INSTALL_SH # ------------------ # Define $install_sh. AC_DEFUN([AM_PROG_INSTALL_SH], [AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl if test x"${install_sh}" != xset; then case $am_aux_dir in *\ * | *\ *) install_sh="\${SHELL} '$am_aux_dir/install-sh'" ;; *) install_sh="\${SHELL} $am_aux_dir/install-sh" esac fi AC_SUBST([install_sh])]) # Copyright (C) 2003-2013 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # Check whether the underlying file-system supports filenames # with a leading dot. For instance MS-DOS doesn't. AC_DEFUN([AM_SET_LEADING_DOT], [rm -rf .tst 2>/dev/null mkdir .tst 2>/dev/null if test -d .tst; then am__leading_dot=. else am__leading_dot=_ fi rmdir .tst 2>/dev/null AC_SUBST([am__leading_dot])]) # Fake the existence of programs that GNU maintainers use. -*- Autoconf -*- # Copyright (C) 1997-2013 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # AM_MISSING_PROG(NAME, PROGRAM) # ------------------------------ AC_DEFUN([AM_MISSING_PROG], [AC_REQUIRE([AM_MISSING_HAS_RUN]) $1=${$1-"${am_missing_run}$2"} AC_SUBST($1)]) # AM_MISSING_HAS_RUN # ------------------ # Define MISSING if not defined so far and test if it is modern enough. # If it is, set am_missing_run to use it, otherwise, to nothing. AC_DEFUN([AM_MISSING_HAS_RUN], [AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl AC_REQUIRE_AUX_FILE([missing])dnl if test x"${MISSING+set}" != xset; then case $am_aux_dir in *\ * | *\ *) MISSING="\${SHELL} \"$am_aux_dir/missing\"" ;; *) MISSING="\${SHELL} $am_aux_dir/missing" ;; esac fi # Use eval to expand $SHELL if eval "$MISSING --is-lightweight"; then am_missing_run="$MISSING " else am_missing_run= AC_MSG_WARN(['missing' script is too old or missing]) fi ]) # Helper functions for option handling. -*- Autoconf -*- # Copyright (C) 2001-2013 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # _AM_MANGLE_OPTION(NAME) # ----------------------- AC_DEFUN([_AM_MANGLE_OPTION], [[_AM_OPTION_]m4_bpatsubst($1, [[^a-zA-Z0-9_]], [_])]) # _AM_SET_OPTION(NAME) # -------------------- # Set option NAME. Presently that only means defining a flag for this option. AC_DEFUN([_AM_SET_OPTION], [m4_define(_AM_MANGLE_OPTION([$1]), [1])]) # _AM_SET_OPTIONS(OPTIONS) # ------------------------ # OPTIONS is a space-separated list of Automake options. AC_DEFUN([_AM_SET_OPTIONS], [m4_foreach_w([_AM_Option], [$1], [_AM_SET_OPTION(_AM_Option)])]) # _AM_IF_OPTION(OPTION, IF-SET, [IF-NOT-SET]) # ------------------------------------------- # Execute IF-SET if OPTION is set, IF-NOT-SET otherwise. AC_DEFUN([_AM_IF_OPTION], [m4_ifset(_AM_MANGLE_OPTION([$1]), [$2], [$3])]) # Copyright (C) 1999-2013 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # _AM_PROG_CC_C_O # --------------- # Like AC_PROG_CC_C_O, but changed for automake. We rewrite AC_PROG_CC # to automatically call this. AC_DEFUN([_AM_PROG_CC_C_O], [AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl AC_REQUIRE_AUX_FILE([compile])dnl AC_LANG_PUSH([C])dnl AC_CACHE_CHECK( [whether $CC understands -c and -o together], [am_cv_prog_cc_c_o], [AC_LANG_CONFTEST([AC_LANG_PROGRAM([])]) # Make sure it works both with $CC and with simple cc. # Following AC_PROG_CC_C_O, we do the test twice because some # compilers refuse to overwrite an existing .o file with -o, # though they will create one. am_cv_prog_cc_c_o=yes for am_i in 1 2; do if AM_RUN_LOG([$CC -c conftest.$ac_ext -o conftest2.$ac_objext]) \ && test -f conftest2.$ac_objext; then : OK else am_cv_prog_cc_c_o=no break fi done rm -f core conftest* unset am_i]) if test "$am_cv_prog_cc_c_o" != yes; then # Losing compiler, so override with the script. # FIXME: It is wrong to rewrite CC. # But if we don't then we get into trouble of one sort or another. # A longer-term fix would be to have automake use am__CC in this case, # and then we could set am__CC="\$(top_srcdir)/compile \$(CC)" CC="$am_aux_dir/compile $CC" fi AC_LANG_POP([C])]) # For backward compatibility. AC_DEFUN_ONCE([AM_PROG_CC_C_O], [AC_REQUIRE([AC_PROG_CC])]) # Copyright (C) 2001-2013 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # AM_RUN_LOG(COMMAND) # ------------------- # Run COMMAND, save the exit status in ac_status, and log it. # (This has been adapted from Autoconf's _AC_RUN_LOG macro.) AC_DEFUN([AM_RUN_LOG], [{ echo "$as_me:$LINENO: $1" >&AS_MESSAGE_LOG_FD ($1) >&AS_MESSAGE_LOG_FD 2>&AS_MESSAGE_LOG_FD ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&AS_MESSAGE_LOG_FD (exit $ac_status); }]) # Check to make sure that the build environment is sane. -*- Autoconf -*- # Copyright (C) 1996-2013 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # AM_SANITY_CHECK # --------------- AC_DEFUN([AM_SANITY_CHECK], [AC_MSG_CHECKING([whether build environment is sane]) # Reject unsafe characters in $srcdir or the absolute working directory # name. Accept space and tab only in the latter. am_lf=' ' case `pwd` in *[[\\\"\#\$\&\'\`$am_lf]]*) AC_MSG_ERROR([unsafe absolute working directory name]);; esac case $srcdir in *[[\\\"\#\$\&\'\`$am_lf\ \ ]]*) AC_MSG_ERROR([unsafe srcdir value: '$srcdir']);; esac # Do 'set' in a subshell so we don't clobber the current shell's # arguments. Must try -L first in case configure is actually a # symlink; some systems play weird games with the mod time of symlinks # (eg FreeBSD returns the mod time of the symlink's containing # directory). if ( am_has_slept=no for am_try in 1 2; do echo "timestamp, slept: $am_has_slept" > conftest.file set X `ls -Lt "$srcdir/configure" conftest.file 2> /dev/null` if test "$[*]" = "X"; then # -L didn't work. set X `ls -t "$srcdir/configure" conftest.file` fi if test "$[*]" != "X $srcdir/configure conftest.file" \ && test "$[*]" != "X conftest.file $srcdir/configure"; then # If neither matched, then we have a broken ls. This can happen # if, for instance, CONFIG_SHELL is bash and it inherits a # broken ls alias from the environment. This has actually # happened. Such a system could not be considered "sane". AC_MSG_ERROR([ls -t appears to fail. Make sure there is not a broken alias in your environment]) fi if test "$[2]" = conftest.file || test $am_try -eq 2; then break fi # Just in case. sleep 1 am_has_slept=yes done test "$[2]" = conftest.file ) then # Ok. : else AC_MSG_ERROR([newly created file is older than distributed files! Check your system clock]) fi AC_MSG_RESULT([yes]) # If we didn't sleep, we still need to ensure time stamps of config.status and # generated files are strictly newer. am_sleep_pid= if grep 'slept: no' conftest.file >/dev/null 2>&1; then ( sleep 1 ) & am_sleep_pid=$! fi AC_CONFIG_COMMANDS_PRE( [AC_MSG_CHECKING([that generated files are newer than configure]) if test -n "$am_sleep_pid"; then # Hide warnings about reused PIDs. wait $am_sleep_pid 2>/dev/null fi AC_MSG_RESULT([done])]) rm -f conftest.file ]) # Copyright (C) 2009-2013 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # AM_SILENT_RULES([DEFAULT]) # -------------------------- # Enable less verbose build rules; with the default set to DEFAULT # ("yes" being less verbose, "no" or empty being verbose). AC_DEFUN([AM_SILENT_RULES], [AC_ARG_ENABLE([silent-rules], [dnl AS_HELP_STRING( [--enable-silent-rules], [less verbose build output (undo: "make V=1")]) AS_HELP_STRING( [--disable-silent-rules], [verbose build output (undo: "make V=0")])dnl ]) case $enable_silent_rules in @%:@ ((( yes) AM_DEFAULT_VERBOSITY=0;; no) AM_DEFAULT_VERBOSITY=1;; *) AM_DEFAULT_VERBOSITY=m4_if([$1], [yes], [0], [1]);; esac dnl dnl A few 'make' implementations (e.g., NonStop OS and NextStep) dnl do not support nested variable expansions. dnl See automake bug#9928 and bug#10237. am_make=${MAKE-make} AC_CACHE_CHECK([whether $am_make supports nested variables], [am_cv_make_support_nested_variables], [if AS_ECHO([['TRUE=$(BAR$(V)) BAR0=false BAR1=true V=1 am__doit: @$(TRUE) .PHONY: am__doit']]) | $am_make -f - >/dev/null 2>&1; then am_cv_make_support_nested_variables=yes else am_cv_make_support_nested_variables=no fi]) if test $am_cv_make_support_nested_variables = yes; then dnl Using '$V' instead of '$(V)' breaks IRIX make. AM_V='$(V)' AM_DEFAULT_V='$(AM_DEFAULT_VERBOSITY)' else AM_V=$AM_DEFAULT_VERBOSITY AM_DEFAULT_V=$AM_DEFAULT_VERBOSITY fi AC_SUBST([AM_V])dnl AM_SUBST_NOTMAKE([AM_V])dnl AC_SUBST([AM_DEFAULT_V])dnl AM_SUBST_NOTMAKE([AM_DEFAULT_V])dnl AC_SUBST([AM_DEFAULT_VERBOSITY])dnl AM_BACKSLASH='\' AC_SUBST([AM_BACKSLASH])dnl _AM_SUBST_NOTMAKE([AM_BACKSLASH])dnl ]) # Copyright (C) 2001-2013 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # AM_PROG_INSTALL_STRIP # --------------------- # One issue with vendor 'install' (even GNU) is that you can't # specify the program used to strip binaries. This is especially # annoying in cross-compiling environments, where the build's strip # is unlikely to handle the host's binaries. # Fortunately install-sh will honor a STRIPPROG variable, so we # always use install-sh in "make install-strip", and initialize # STRIPPROG with the value of the STRIP variable (set by the user). AC_DEFUN([AM_PROG_INSTALL_STRIP], [AC_REQUIRE([AM_PROG_INSTALL_SH])dnl # Installed binaries are usually stripped using 'strip' when the user # run "make install-strip". However 'strip' might not be the right # tool to use in cross-compilation environments, therefore Automake # will honor the 'STRIP' environment variable to overrule this program. dnl Don't test for $cross_compiling = yes, because it might be 'maybe'. if test "$cross_compiling" != no; then AC_CHECK_TOOL([STRIP], [strip], :) fi INSTALL_STRIP_PROGRAM="\$(install_sh) -c -s" AC_SUBST([INSTALL_STRIP_PROGRAM])]) # Copyright (C) 2006-2013 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # _AM_SUBST_NOTMAKE(VARIABLE) # --------------------------- # Prevent Automake from outputting VARIABLE = @VARIABLE@ in Makefile.in. # This macro is traced by Automake. AC_DEFUN([_AM_SUBST_NOTMAKE]) # AM_SUBST_NOTMAKE(VARIABLE) # -------------------------- # Public sister of _AM_SUBST_NOTMAKE. AC_DEFUN([AM_SUBST_NOTMAKE], [_AM_SUBST_NOTMAKE($@)]) # Check how to create a tarball. -*- Autoconf -*- # Copyright (C) 2004-2013 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # _AM_PROG_TAR(FORMAT) # -------------------- # Check how to create a tarball in format FORMAT. # FORMAT should be one of 'v7', 'ustar', or 'pax'. # # Substitute a variable $(am__tar) that is a command # writing to stdout a FORMAT-tarball containing the directory # $tardir. # tardir=directory && $(am__tar) > result.tar # # Substitute a variable $(am__untar) that extract such # a tarball read from stdin. # $(am__untar) < result.tar # AC_DEFUN([_AM_PROG_TAR], [# Always define AMTAR for backward compatibility. Yes, it's still used # in the wild :-( We should find a proper way to deprecate it ... AC_SUBST([AMTAR], ['$${TAR-tar}']) # We'll loop over all known methods to create a tar archive until one works. _am_tools='gnutar m4_if([$1], [ustar], [plaintar]) pax cpio none' m4_if([$1], [v7], [am__tar='$${TAR-tar} chof - "$$tardir"' am__untar='$${TAR-tar} xf -'], [m4_case([$1], [ustar], [# The POSIX 1988 'ustar' format is defined with fixed-size fields. # There is notably a 21 bits limit for the UID and the GID. In fact, # the 'pax' utility can hang on bigger UID/GID (see automake bug#8343 # and bug#13588). am_max_uid=2097151 # 2^21 - 1 am_max_gid=$am_max_uid # The $UID and $GID variables are not portable, so we need to resort # to the POSIX-mandated id(1) utility. Errors in the 'id' calls # below are definitely unexpected, so allow the users to see them # (that is, avoid stderr redirection). am_uid=`id -u || echo unknown` am_gid=`id -g || echo unknown` AC_MSG_CHECKING([whether UID '$am_uid' is supported by ustar format]) if test $am_uid -le $am_max_uid; then AC_MSG_RESULT([yes]) else AC_MSG_RESULT([no]) _am_tools=none fi AC_MSG_CHECKING([whether GID '$am_gid' is supported by ustar format]) if test $am_gid -le $am_max_gid; then AC_MSG_RESULT([yes]) else AC_MSG_RESULT([no]) _am_tools=none fi], [pax], [], [m4_fatal([Unknown tar format])]) AC_MSG_CHECKING([how to create a $1 tar archive]) # Go ahead even if we have the value already cached. We do so because we # need to set the values for the 'am__tar' and 'am__untar' variables. _am_tools=${am_cv_prog_tar_$1-$_am_tools} for _am_tool in $_am_tools; do case $_am_tool in gnutar) for _am_tar in tar gnutar gtar; do AM_RUN_LOG([$_am_tar --version]) && break done am__tar="$_am_tar --format=m4_if([$1], [pax], [posix], [$1]) -chf - "'"$$tardir"' am__tar_="$_am_tar --format=m4_if([$1], [pax], [posix], [$1]) -chf - "'"$tardir"' am__untar="$_am_tar -xf -" ;; plaintar) # Must skip GNU tar: if it does not support --format= it doesn't create # ustar tarball either. (tar --version) >/dev/null 2>&1 && continue am__tar='tar chf - "$$tardir"' am__tar_='tar chf - "$tardir"' am__untar='tar xf -' ;; pax) am__tar='pax -L -x $1 -w "$$tardir"' am__tar_='pax -L -x $1 -w "$tardir"' am__untar='pax -r' ;; cpio) am__tar='find "$$tardir" -print | cpio -o -H $1 -L' am__tar_='find "$tardir" -print | cpio -o -H $1 -L' am__untar='cpio -i -H $1 -d' ;; none) am__tar=false am__tar_=false am__untar=false ;; esac # If the value was cached, stop now. We just wanted to have am__tar # and am__untar set. test -n "${am_cv_prog_tar_$1}" && break # tar/untar a dummy directory, and stop if the command works. rm -rf conftest.dir mkdir conftest.dir echo GrepMe > conftest.dir/file AM_RUN_LOG([tardir=conftest.dir && eval $am__tar_ >conftest.tar]) rm -rf conftest.dir if test -s conftest.tar; then AM_RUN_LOG([$am__untar /dev/null 2>&1 && break fi done rm -rf conftest.dir AC_CACHE_VAL([am_cv_prog_tar_$1], [am_cv_prog_tar_$1=$_am_tool]) AC_MSG_RESULT([$am_cv_prog_tar_$1])]) AC_SUBST([am__tar]) AC_SUBST([am__untar]) ]) # _AM_PROG_TAR cryptmount-5.2/configure0000755000175000017500000113535112613124571012447 00000000000000#! /bin/sh # Guess values for system-dependent variables and create Makefiles. # Generated by GNU Autoconf 2.69 for cryptmount 5.2. # # Report bugs to . # # # Copyright (C) 1992-1996, 1998-2012 Free Software Foundation, Inc. # # # This configure script is free software; the Free Software Foundation # gives unlimited permission to copy, distribute and modify it. ## -------------------- ## ## M4sh Initialization. ## ## -------------------- ## # Be more Bourne compatible DUALCASE=1; export DUALCASE # for MKS sh if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then : emulate sh NULLCMD=: # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which # is contrary to our usage. Disable this feature. alias -g '${1+"$@"}'='"$@"' setopt NO_GLOB_SUBST else case `(set -o) 2>/dev/null` in #( *posix*) : set -o posix ;; #( *) : ;; esac fi as_nl=' ' export as_nl # Printing a long string crashes Solaris 7 /usr/bin/printf. as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo # Prefer a ksh shell builtin over an external printf program on Solaris, # but without wasting forks for bash or zsh. if test -z "$BASH_VERSION$ZSH_VERSION" \ && (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then as_echo='print -r --' as_echo_n='print -rn --' elif (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then as_echo='printf %s\n' as_echo_n='printf %s' else if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"' as_echo_n='/usr/ucb/echo -n' else as_echo_body='eval expr "X$1" : "X\\(.*\\)"' as_echo_n_body='eval arg=$1; case $arg in #( *"$as_nl"*) expr "X$arg" : "X\\(.*\\)$as_nl"; arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;; esac; expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl" ' export as_echo_n_body as_echo_n='sh -c $as_echo_n_body as_echo' fi export as_echo_body as_echo='sh -c $as_echo_body as_echo' fi # The user is always right. if test "${PATH_SEPARATOR+set}" != set; then PATH_SEPARATOR=: (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && { (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 || PATH_SEPARATOR=';' } fi # IFS # We need space, tab and new line, in precisely that order. Quoting is # there to prevent editors from complaining about space-tab. # (If _AS_PATH_WALK were called with IFS unset, it would disable word # splitting by setting IFS to empty value.) IFS=" "" $as_nl" # Find who we are. Look in the path if we contain no directory separator. as_myself= case $0 in #(( *[\\/]* ) as_myself=$0 ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break done IFS=$as_save_IFS ;; esac # We did not find ourselves, most probably we were run as `sh COMMAND' # in which case we are not to be found in the path. if test "x$as_myself" = x; then as_myself=$0 fi if test ! -f "$as_myself"; then $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 exit 1 fi # Unset variables that we do not need and which cause bugs (e.g. in # pre-3.0 UWIN ksh). But do not cause bugs in bash 2.01; the "|| exit 1" # suppresses any "Segmentation fault" message there. '((' could # trigger a bug in pdksh 5.2.14. for as_var in BASH_ENV ENV MAIL MAILPATH do eval test x\${$as_var+set} = xset \ && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || : done PS1='$ ' PS2='> ' PS4='+ ' # NLS nuisances. LC_ALL=C export LC_ALL LANGUAGE=C export LANGUAGE # CDPATH. (unset CDPATH) >/dev/null 2>&1 && unset CDPATH # Use a proper internal environment variable to ensure we don't fall # into an infinite loop, continuously re-executing ourselves. if test x"${_as_can_reexec}" != xno && test "x$CONFIG_SHELL" != x; then _as_can_reexec=no; export _as_can_reexec; # We cannot yet assume a decent shell, so we have to provide a # neutralization value for shells without unset; and this also # works around shells that cannot unset nonexistent variables. # Preserve -v and -x to the replacement shell. BASH_ENV=/dev/null ENV=/dev/null (unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV case $- in # (((( *v*x* | *x*v* ) as_opts=-vx ;; *v* ) as_opts=-v ;; *x* ) as_opts=-x ;; * ) as_opts= ;; esac exec $CONFIG_SHELL $as_opts "$as_myself" ${1+"$@"} # Admittedly, this is quite paranoid, since all the known shells bail # out after a failed `exec'. $as_echo "$0: could not re-execute with $CONFIG_SHELL" >&2 as_fn_exit 255 fi # We don't want this to propagate to other subprocesses. { _as_can_reexec=; unset _as_can_reexec;} if test "x$CONFIG_SHELL" = x; then as_bourne_compatible="if test -n \"\${ZSH_VERSION+set}\" && (emulate sh) >/dev/null 2>&1; then : emulate sh NULLCMD=: # Pre-4.2 versions of Zsh do word splitting on \${1+\"\$@\"}, which # is contrary to our usage. Disable this feature. alias -g '\${1+\"\$@\"}'='\"\$@\"' setopt NO_GLOB_SUBST else case \`(set -o) 2>/dev/null\` in #( *posix*) : set -o posix ;; #( *) : ;; esac fi " as_required="as_fn_return () { (exit \$1); } as_fn_success () { as_fn_return 0; } as_fn_failure () { as_fn_return 1; } as_fn_ret_success () { return 0; } as_fn_ret_failure () { return 1; } exitcode=0 as_fn_success || { exitcode=1; echo as_fn_success failed.; } as_fn_failure && { exitcode=1; echo as_fn_failure succeeded.; } as_fn_ret_success || { exitcode=1; echo as_fn_ret_success failed.; } as_fn_ret_failure && { exitcode=1; echo as_fn_ret_failure succeeded.; } if ( set x; as_fn_ret_success y && test x = \"\$1\" ); then : else exitcode=1; echo positional parameters were not saved. fi test x\$exitcode = x0 || exit 1 test -x / || exit 1" as_suggested=" as_lineno_1=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_1a=\$LINENO as_lineno_2=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_2a=\$LINENO eval 'test \"x\$as_lineno_1'\$as_run'\" != \"x\$as_lineno_2'\$as_run'\" && test \"x\`expr \$as_lineno_1'\$as_run' + 1\`\" = \"x\$as_lineno_2'\$as_run'\"' || exit 1 test \$(( 1 + 1 )) = 2 || exit 1" if (eval "$as_required") 2>/dev/null; then : as_have_required=yes else as_have_required=no fi if test x$as_have_required = xyes && (eval "$as_suggested") 2>/dev/null; then : else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR as_found=false for as_dir in /bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. as_found=: case $as_dir in #( /*) for as_base in sh bash ksh sh5; do # Try only shells that exist, to save several forks. as_shell=$as_dir/$as_base if { test -f "$as_shell" || test -f "$as_shell.exe"; } && { $as_echo "$as_bourne_compatible""$as_required" | as_run=a "$as_shell"; } 2>/dev/null; then : CONFIG_SHELL=$as_shell as_have_required=yes if { $as_echo "$as_bourne_compatible""$as_suggested" | as_run=a "$as_shell"; } 2>/dev/null; then : break 2 fi fi done;; esac as_found=false done $as_found || { if { test -f "$SHELL" || test -f "$SHELL.exe"; } && { $as_echo "$as_bourne_compatible""$as_required" | as_run=a "$SHELL"; } 2>/dev/null; then : CONFIG_SHELL=$SHELL as_have_required=yes fi; } IFS=$as_save_IFS if test "x$CONFIG_SHELL" != x; then : export CONFIG_SHELL # We cannot yet assume a decent shell, so we have to provide a # neutralization value for shells without unset; and this also # works around shells that cannot unset nonexistent variables. # Preserve -v and -x to the replacement shell. BASH_ENV=/dev/null ENV=/dev/null (unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV case $- in # (((( *v*x* | *x*v* ) as_opts=-vx ;; *v* ) as_opts=-v ;; *x* ) as_opts=-x ;; * ) as_opts= ;; esac exec $CONFIG_SHELL $as_opts "$as_myself" ${1+"$@"} # Admittedly, this is quite paranoid, since all the known shells bail # out after a failed `exec'. $as_echo "$0: could not re-execute with $CONFIG_SHELL" >&2 exit 255 fi if test x$as_have_required = xno; then : $as_echo "$0: This script requires a shell more modern than all" $as_echo "$0: the shells that I found on your system." if test x${ZSH_VERSION+set} = xset ; then $as_echo "$0: In particular, zsh $ZSH_VERSION has bugs and should" $as_echo "$0: be upgraded to zsh 4.3.4 or later." else $as_echo "$0: Please tell bug-autoconf@gnu.org and $0: cryptmount@rwpenney.org.uk about your system, including $0: any error possibly output before this message. Then $0: install a modern shell, or manually run the script $0: under such a shell if you do have one." fi exit 1 fi fi fi SHELL=${CONFIG_SHELL-/bin/sh} export SHELL # Unset more variables known to interfere with behavior of common tools. CLICOLOR_FORCE= GREP_OPTIONS= unset CLICOLOR_FORCE GREP_OPTIONS ## --------------------- ## ## M4sh Shell Functions. ## ## --------------------- ## # as_fn_unset VAR # --------------- # Portably unset VAR. as_fn_unset () { { eval $1=; unset $1;} } as_unset=as_fn_unset # as_fn_set_status STATUS # ----------------------- # Set $? to STATUS, without forking. as_fn_set_status () { return $1 } # as_fn_set_status # as_fn_exit STATUS # ----------------- # Exit the shell with STATUS, even in a "trap 0" or "set -e" context. as_fn_exit () { set +e as_fn_set_status $1 exit $1 } # as_fn_exit # as_fn_mkdir_p # ------------- # Create "$as_dir" as a directory, including parents if necessary. as_fn_mkdir_p () { case $as_dir in #( -*) as_dir=./$as_dir;; esac test -d "$as_dir" || eval $as_mkdir_p || { as_dirs= while :; do case $as_dir in #( *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'( *) as_qdir=$as_dir;; esac as_dirs="'$as_qdir' $as_dirs" as_dir=`$as_dirname -- "$as_dir" || $as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$as_dir" : 'X\(//\)[^/]' \| \ X"$as_dir" : 'X\(//\)$' \| \ X"$as_dir" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$as_dir" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` test -d "$as_dir" && break done test -z "$as_dirs" || eval "mkdir $as_dirs" } || test -d "$as_dir" || as_fn_error $? "cannot create directory $as_dir" } # as_fn_mkdir_p # as_fn_executable_p FILE # ----------------------- # Test if FILE is an executable regular file. as_fn_executable_p () { test -f "$1" && test -x "$1" } # as_fn_executable_p # as_fn_append VAR VALUE # ---------------------- # Append the text in VALUE to the end of the definition contained in VAR. Take # advantage of any shell optimizations that allow amortized linear growth over # repeated appends, instead of the typical quadratic growth present in naive # implementations. if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null; then : eval 'as_fn_append () { eval $1+=\$2 }' else as_fn_append () { eval $1=\$$1\$2 } fi # as_fn_append # as_fn_arith ARG... # ------------------ # Perform arithmetic evaluation on the ARGs, and store the result in the # global $as_val. Take advantage of shells that can avoid forks. The arguments # must be portable across $(()) and expr. if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null; then : eval 'as_fn_arith () { as_val=$(( $* )) }' else as_fn_arith () { as_val=`expr "$@" || test $? -eq 1` } fi # as_fn_arith # as_fn_error STATUS ERROR [LINENO LOG_FD] # ---------------------------------------- # Output "`basename $0`: error: ERROR" to stderr. If LINENO and LOG_FD are # provided, also output the error to LOG_FD, referencing LINENO. Then exit the # script with STATUS, using 1 if that was 0. as_fn_error () { as_status=$1; test $as_status -eq 0 && as_status=1 if test "$4"; then as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack $as_echo "$as_me:${as_lineno-$LINENO}: error: $2" >&$4 fi $as_echo "$as_me: error: $2" >&2 as_fn_exit $as_status } # as_fn_error if expr a : '\(a\)' >/dev/null 2>&1 && test "X`expr 00001 : '.*\(...\)'`" = X001; then as_expr=expr else as_expr=false fi if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then as_basename=basename else as_basename=false fi if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then as_dirname=dirname else as_dirname=false fi as_me=`$as_basename -- "$0" || $as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ X"$0" : 'X\(//\)$' \| \ X"$0" : 'X\(/\)' \| . 2>/dev/null || $as_echo X/"$0" | sed '/^.*\/\([^/][^/]*\)\/*$/{ s//\1/ q } /^X\/\(\/\/\)$/{ s//\1/ q } /^X\/\(\/\).*/{ s//\1/ q } s/.*/./; q'` # Avoid depending upon Character Ranges. as_cr_letters='abcdefghijklmnopqrstuvwxyz' as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' as_cr_Letters=$as_cr_letters$as_cr_LETTERS as_cr_digits='0123456789' as_cr_alnum=$as_cr_Letters$as_cr_digits as_lineno_1=$LINENO as_lineno_1a=$LINENO as_lineno_2=$LINENO as_lineno_2a=$LINENO eval 'test "x$as_lineno_1'$as_run'" != "x$as_lineno_2'$as_run'" && test "x`expr $as_lineno_1'$as_run' + 1`" = "x$as_lineno_2'$as_run'"' || { # Blame Lee E. McMahon (1931-1989) for sed's syntax. :-) sed -n ' p /[$]LINENO/= ' <$as_myself | sed ' s/[$]LINENO.*/&-/ t lineno b :lineno N :loop s/[$]LINENO\([^'$as_cr_alnum'_].*\n\)\(.*\)/\2\1\2/ t loop s/-\n.*// ' >$as_me.lineno && chmod +x "$as_me.lineno" || { $as_echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2; as_fn_exit 1; } # If we had to re-execute with $CONFIG_SHELL, we're ensured to have # already done that, so ensure we don't try to do so again and fall # in an infinite loop. This has already happened in practice. _as_can_reexec=no; export _as_can_reexec # Don't try to exec as it changes $[0], causing all sort of problems # (the dirname of $[0] is not the place where we might find the # original and so on. Autoconf is especially sensitive to this). . "./$as_me.lineno" # Exit status is that of the last command. exit } ECHO_C= ECHO_N= ECHO_T= case `echo -n x` in #((((( -n*) case `echo 'xy\c'` in *c*) ECHO_T=' ';; # ECHO_T is single tab character. xy) ECHO_C='\c';; *) echo `echo ksh88 bug on AIX 6.1` > /dev/null ECHO_T=' ';; esac;; *) ECHO_N='-n';; esac rm -f conf$$ conf$$.exe conf$$.file if test -d conf$$.dir; then rm -f conf$$.dir/conf$$.file else rm -f conf$$.dir mkdir conf$$.dir 2>/dev/null fi if (echo >conf$$.file) 2>/dev/null; then if ln -s conf$$.file conf$$ 2>/dev/null; then as_ln_s='ln -s' # ... but there are two gotchas: # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail. # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable. # In both cases, we have to default to `cp -pR'. ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || as_ln_s='cp -pR' elif ln conf$$.file conf$$ 2>/dev/null; then as_ln_s=ln else as_ln_s='cp -pR' fi else as_ln_s='cp -pR' fi rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file rmdir conf$$.dir 2>/dev/null if mkdir -p . 2>/dev/null; then as_mkdir_p='mkdir -p "$as_dir"' else test -d ./-p && rmdir ./-p as_mkdir_p=false fi as_test_x='test -x' as_executable_p=as_fn_executable_p # Sed expression to map a string onto a valid CPP name. as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" # Sed expression to map a string onto a valid variable name. as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" test -n "$DJDIR" || exec 7<&0 &1 # Name of the host. # hostname on some systems (SVR3.2, old GNU/Linux) returns a bogus exit status, # so uname gets run too. ac_hostname=`(hostname || uname -n) 2>/dev/null | sed 1q` # # Initializations. # ac_default_prefix=/usr/local ac_clean_files= ac_config_libobj_dir=. LIBOBJS= cross_compiling=no subdirs= MFLAGS= MAKEFLAGS= # Identity of this package. PACKAGE_NAME='cryptmount' PACKAGE_TARNAME='cryptmount' PACKAGE_VERSION='5.2' PACKAGE_STRING='cryptmount 5.2' PACKAGE_BUGREPORT='cryptmount@rwpenney.org.uk' PACKAGE_URL='' # Factoring default headers for most tests. ac_includes_default="\ #include #ifdef HAVE_SYS_TYPES_H # include #endif #ifdef HAVE_SYS_STAT_H # include #endif #ifdef STDC_HEADERS # include # include #else # ifdef HAVE_STDLIB_H # include # endif #endif #ifdef HAVE_STRING_H # if !defined STDC_HEADERS && defined HAVE_MEMORY_H # include # endif # include #endif #ifdef HAVE_STRINGS_H # include #endif #ifdef HAVE_INTTYPES_H # include #endif #ifdef HAVE_STDINT_H # include #endif #ifdef HAVE_UNISTD_H # include #endif" gt_needs= ac_subst_vars='am__EXEEXT_FALSE am__EXEEXT_TRUE LTLIBOBJS LIBOBJS CM_DEFAULT_SUPATH CM_DEFAULT_CIPHER LIBS_LUKS LIBS_GCRY CM_SYSRUN_DIR CM_SYSCONF_DIR USE_SYSTEMD_FALSE USE_SYSTEMD_TRUE DOXYGEN_DOCDIR HAVE_DOXYGEN_FALSE HAVE_DOXYGEN_TRUE use_doxygen POSUB LTLIBINTL LIBINTL INTLLIBS LTLIBICONV LIBICONV INTL_MACOSX_LIBS host_os host_vendor host_cpu host build_os build_vendor build_cpu build XGETTEXT_EXTRA_OPTIONS MSGMERGE XGETTEXT_015 XGETTEXT GMSGFMT_015 MSGFMT_015 GMSGFMT MSGFMT GETTEXT_MACRO_VERSION USE_NLS SED PATH_FSCK WITH_FSCK PATH_MKSWAP WITH_CSWAP PATH_UMOUNT ERSATZ_UMOUNT PATH_MOUNT ERSATZ_MOUNT BUILD_LUKSCOMPAT_FALSE BUILD_LUKSCOMPAT_TRUE libcryptsetup_LIBS libcryptsetup_CFLAGS PKG_CONFIG_LIBDIR PKG_CONFIG_PATH PKG_CONFIG RANLIB EGREP GREP CPP OBJEXT EXEEXT ac_ct_CC CPPFLAGS LDFLAGS CFLAGS CC AM_BACKSLASH AM_DEFAULT_VERBOSITY AM_DEFAULT_V AM_V am__untar am__tar AMTAR am__leading_dot SET_MAKE AWK mkdir_p MKDIR_P INSTALL_STRIP_PROGRAM STRIP install_sh MAKEINFO AUTOHEADER AUTOMAKE AUTOCONF ACLOCAL VERSION PACKAGE CYGPATH_W am__isrc INSTALL_DATA INSTALL_SCRIPT INSTALL_PROGRAM target_alias host_alias build_alias LIBS ECHO_T ECHO_N ECHO_C DEFS mandir localedir libdir psdir pdfdir dvidir htmldir infodir docdir oldincludedir includedir localstatedir sharedstatedir sysconfdir datadir datarootdir libexecdir sbindir bindir program_transform_name prefix exec_prefix PACKAGE_URL PACKAGE_BUGREPORT PACKAGE_STRING PACKAGE_VERSION PACKAGE_TARNAME PACKAGE_NAME PATH_SEPARATOR SHELL' ac_subst_files='' ac_user_opts=' enable_option_checking enable_silent_rules enable_largefile with_sysrundir with_libgcrypt enable_openssl_compat enable_libudev enable_luks enable_delegation enable_cswap enable_fsck enable_nls with_gnu_ld enable_rpath with_libiconv_prefix with_libintl_prefix enable_argv0switch with_docdir with_systemd ' ac_precious_vars='build_alias host_alias target_alias CC CFLAGS LDFLAGS LIBS CPPFLAGS CPP PKG_CONFIG PKG_CONFIG_PATH PKG_CONFIG_LIBDIR libcryptsetup_CFLAGS libcryptsetup_LIBS' # Initialize some variables set by options. ac_init_help= ac_init_version=false ac_unrecognized_opts= ac_unrecognized_sep= # The variables have the same names as the options, with # dashes changed to underlines. cache_file=/dev/null exec_prefix=NONE no_create= no_recursion= prefix=NONE program_prefix=NONE program_suffix=NONE program_transform_name=s,x,x, silent= site= srcdir= verbose= x_includes=NONE x_libraries=NONE # Installation directory options. # These are left unexpanded so users can "make install exec_prefix=/foo" # and all the variables that are supposed to be based on exec_prefix # by default will actually change. # Use braces instead of parens because sh, perl, etc. also accept them. # (The list follows the same order as the GNU Coding Standards.) bindir='${exec_prefix}/bin' sbindir='${exec_prefix}/sbin' libexecdir='${exec_prefix}/libexec' datarootdir='${prefix}/share' datadir='${datarootdir}' sysconfdir='${prefix}/etc' sharedstatedir='${prefix}/com' localstatedir='${prefix}/var' includedir='${prefix}/include' oldincludedir='/usr/include' docdir='${datarootdir}/doc/${PACKAGE_TARNAME}' infodir='${datarootdir}/info' htmldir='${docdir}' dvidir='${docdir}' pdfdir='${docdir}' psdir='${docdir}' libdir='${exec_prefix}/lib' localedir='${datarootdir}/locale' mandir='${datarootdir}/man' ac_prev= ac_dashdash= for ac_option do # If the previous option needs an argument, assign it. if test -n "$ac_prev"; then eval $ac_prev=\$ac_option ac_prev= continue fi case $ac_option in *=?*) ac_optarg=`expr "X$ac_option" : '[^=]*=\(.*\)'` ;; *=) ac_optarg= ;; *) ac_optarg=yes ;; esac # Accept the important Cygnus configure options, so we can diagnose typos. case $ac_dashdash$ac_option in --) ac_dashdash=yes ;; -bindir | --bindir | --bindi | --bind | --bin | --bi) ac_prev=bindir ;; -bindir=* | --bindir=* | --bindi=* | --bind=* | --bin=* | --bi=*) bindir=$ac_optarg ;; -build | --build | --buil | --bui | --bu) ac_prev=build_alias ;; -build=* | --build=* | --buil=* | --bui=* | --bu=*) build_alias=$ac_optarg ;; -cache-file | --cache-file | --cache-fil | --cache-fi \ | --cache-f | --cache- | --cache | --cach | --cac | --ca | --c) ac_prev=cache_file ;; -cache-file=* | --cache-file=* | --cache-fil=* | --cache-fi=* \ | --cache-f=* | --cache-=* | --cache=* | --cach=* | --cac=* | --ca=* | --c=*) cache_file=$ac_optarg ;; --config-cache | -C) cache_file=config.cache ;; -datadir | --datadir | --datadi | --datad) ac_prev=datadir ;; -datadir=* | --datadir=* | --datadi=* | --datad=*) datadir=$ac_optarg ;; -datarootdir | --datarootdir | --datarootdi | --datarootd | --dataroot \ | --dataroo | --dataro | --datar) ac_prev=datarootdir ;; -datarootdir=* | --datarootdir=* | --datarootdi=* | --datarootd=* \ | --dataroot=* | --dataroo=* | --dataro=* | --datar=*) datarootdir=$ac_optarg ;; -disable-* | --disable-*) ac_useropt=`expr "x$ac_option" : 'x-*disable-\(.*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error $? "invalid feature name: $ac_useropt" ac_useropt_orig=$ac_useropt ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "enable_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--disable-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval enable_$ac_useropt=no ;; -docdir | --docdir | --docdi | --doc | --do) ac_prev=docdir ;; -docdir=* | --docdir=* | --docdi=* | --doc=* | --do=*) docdir=$ac_optarg ;; -dvidir | --dvidir | --dvidi | --dvid | --dvi | --dv) ac_prev=dvidir ;; -dvidir=* | --dvidir=* | --dvidi=* | --dvid=* | --dvi=* | --dv=*) dvidir=$ac_optarg ;; -enable-* | --enable-*) ac_useropt=`expr "x$ac_option" : 'x-*enable-\([^=]*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error $? "invalid feature name: $ac_useropt" ac_useropt_orig=$ac_useropt ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "enable_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--enable-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval enable_$ac_useropt=\$ac_optarg ;; -exec-prefix | --exec_prefix | --exec-prefix | --exec-prefi \ | --exec-pref | --exec-pre | --exec-pr | --exec-p | --exec- \ | --exec | --exe | --ex) ac_prev=exec_prefix ;; -exec-prefix=* | --exec_prefix=* | --exec-prefix=* | --exec-prefi=* \ | --exec-pref=* | --exec-pre=* | --exec-pr=* | --exec-p=* | --exec-=* \ | --exec=* | --exe=* | --ex=*) exec_prefix=$ac_optarg ;; -gas | --gas | --ga | --g) # Obsolete; use --with-gas. with_gas=yes ;; -help | --help | --hel | --he | -h) ac_init_help=long ;; -help=r* | --help=r* | --hel=r* | --he=r* | -hr*) ac_init_help=recursive ;; -help=s* | --help=s* | --hel=s* | --he=s* | -hs*) ac_init_help=short ;; -host | --host | --hos | --ho) ac_prev=host_alias ;; -host=* | --host=* | --hos=* | --ho=*) host_alias=$ac_optarg ;; -htmldir | --htmldir | --htmldi | --htmld | --html | --htm | --ht) ac_prev=htmldir ;; -htmldir=* | --htmldir=* | --htmldi=* | --htmld=* | --html=* | --htm=* \ | --ht=*) htmldir=$ac_optarg ;; -includedir | --includedir | --includedi | --included | --include \ | --includ | --inclu | --incl | --inc) ac_prev=includedir ;; -includedir=* | --includedir=* | --includedi=* | --included=* | --include=* \ | --includ=* | --inclu=* | --incl=* | --inc=*) includedir=$ac_optarg ;; -infodir | --infodir | --infodi | --infod | --info | --inf) ac_prev=infodir ;; -infodir=* | --infodir=* | --infodi=* | --infod=* | --info=* | --inf=*) infodir=$ac_optarg ;; -libdir | --libdir | --libdi | --libd) ac_prev=libdir ;; -libdir=* | --libdir=* | --libdi=* | --libd=*) libdir=$ac_optarg ;; -libexecdir | --libexecdir | --libexecdi | --libexecd | --libexec \ | --libexe | --libex | --libe) ac_prev=libexecdir ;; -libexecdir=* | --libexecdir=* | --libexecdi=* | --libexecd=* | --libexec=* \ | --libexe=* | --libex=* | --libe=*) libexecdir=$ac_optarg ;; -localedir | --localedir | --localedi | --localed | --locale) ac_prev=localedir ;; -localedir=* | --localedir=* | --localedi=* | --localed=* | --locale=*) localedir=$ac_optarg ;; -localstatedir | --localstatedir | --localstatedi | --localstated \ | --localstate | --localstat | --localsta | --localst | --locals) ac_prev=localstatedir ;; -localstatedir=* | --localstatedir=* | --localstatedi=* | --localstated=* \ | --localstate=* | --localstat=* | --localsta=* | --localst=* | --locals=*) localstatedir=$ac_optarg ;; -mandir | --mandir | --mandi | --mand | --man | --ma | --m) ac_prev=mandir ;; -mandir=* | --mandir=* | --mandi=* | --mand=* | --man=* | --ma=* | --m=*) mandir=$ac_optarg ;; -nfp | --nfp | --nf) # Obsolete; use --without-fp. with_fp=no ;; -no-create | --no-create | --no-creat | --no-crea | --no-cre \ | --no-cr | --no-c | -n) no_create=yes ;; -no-recursion | --no-recursion | --no-recursio | --no-recursi \ | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r) no_recursion=yes ;; -oldincludedir | --oldincludedir | --oldincludedi | --oldincluded \ | --oldinclude | --oldinclud | --oldinclu | --oldincl | --oldinc \ | --oldin | --oldi | --old | --ol | --o) ac_prev=oldincludedir ;; -oldincludedir=* | --oldincludedir=* | --oldincludedi=* | --oldincluded=* \ | --oldinclude=* | --oldinclud=* | --oldinclu=* | --oldincl=* | --oldinc=* \ | --oldin=* | --oldi=* | --old=* | --ol=* | --o=*) oldincludedir=$ac_optarg ;; -prefix | --prefix | --prefi | --pref | --pre | --pr | --p) ac_prev=prefix ;; -prefix=* | --prefix=* | --prefi=* | --pref=* | --pre=* | --pr=* | --p=*) prefix=$ac_optarg ;; -program-prefix | --program-prefix | --program-prefi | --program-pref \ | --program-pre | --program-pr | --program-p) ac_prev=program_prefix ;; -program-prefix=* | --program-prefix=* | --program-prefi=* \ | --program-pref=* | --program-pre=* | --program-pr=* | --program-p=*) program_prefix=$ac_optarg ;; -program-suffix | --program-suffix | --program-suffi | --program-suff \ | --program-suf | --program-su | --program-s) ac_prev=program_suffix ;; -program-suffix=* | --program-suffix=* | --program-suffi=* \ | --program-suff=* | --program-suf=* | --program-su=* | --program-s=*) program_suffix=$ac_optarg ;; -program-transform-name | --program-transform-name \ | --program-transform-nam | --program-transform-na \ | --program-transform-n | --program-transform- \ | --program-transform | --program-transfor \ | --program-transfo | --program-transf \ | --program-trans | --program-tran \ | --progr-tra | --program-tr | --program-t) ac_prev=program_transform_name ;; -program-transform-name=* | --program-transform-name=* \ | --program-transform-nam=* | --program-transform-na=* \ | --program-transform-n=* | --program-transform-=* \ | --program-transform=* | --program-transfor=* \ | --program-transfo=* | --program-transf=* \ | --program-trans=* | --program-tran=* \ | --progr-tra=* | --program-tr=* | --program-t=*) program_transform_name=$ac_optarg ;; -pdfdir | --pdfdir | --pdfdi | --pdfd | --pdf | --pd) ac_prev=pdfdir ;; -pdfdir=* | --pdfdir=* | --pdfdi=* | --pdfd=* | --pdf=* | --pd=*) pdfdir=$ac_optarg ;; -psdir | --psdir | --psdi | --psd | --ps) ac_prev=psdir ;; -psdir=* | --psdir=* | --psdi=* | --psd=* | --ps=*) psdir=$ac_optarg ;; -q | -quiet | --quiet | --quie | --qui | --qu | --q \ | -silent | --silent | --silen | --sile | --sil) silent=yes ;; -sbindir | --sbindir | --sbindi | --sbind | --sbin | --sbi | --sb) ac_prev=sbindir ;; -sbindir=* | --sbindir=* | --sbindi=* | --sbind=* | --sbin=* \ | --sbi=* | --sb=*) sbindir=$ac_optarg ;; -sharedstatedir | --sharedstatedir | --sharedstatedi \ | --sharedstated | --sharedstate | --sharedstat | --sharedsta \ | --sharedst | --shareds | --shared | --share | --shar \ | --sha | --sh) ac_prev=sharedstatedir ;; -sharedstatedir=* | --sharedstatedir=* | --sharedstatedi=* \ | --sharedstated=* | --sharedstate=* | --sharedstat=* | --sharedsta=* \ | --sharedst=* | --shareds=* | --shared=* | --share=* | --shar=* \ | --sha=* | --sh=*) sharedstatedir=$ac_optarg ;; -site | --site | --sit) ac_prev=site ;; -site=* | --site=* | --sit=*) site=$ac_optarg ;; -srcdir | --srcdir | --srcdi | --srcd | --src | --sr) ac_prev=srcdir ;; -srcdir=* | --srcdir=* | --srcdi=* | --srcd=* | --src=* | --sr=*) srcdir=$ac_optarg ;; -sysconfdir | --sysconfdir | --sysconfdi | --sysconfd | --sysconf \ | --syscon | --sysco | --sysc | --sys | --sy) ac_prev=sysconfdir ;; -sysconfdir=* | --sysconfdir=* | --sysconfdi=* | --sysconfd=* | --sysconf=* \ | --syscon=* | --sysco=* | --sysc=* | --sys=* | --sy=*) sysconfdir=$ac_optarg ;; -target | --target | --targe | --targ | --tar | --ta | --t) ac_prev=target_alias ;; -target=* | --target=* | --targe=* | --targ=* | --tar=* | --ta=* | --t=*) target_alias=$ac_optarg ;; -v | -verbose | --verbose | --verbos | --verbo | --verb) verbose=yes ;; -version | --version | --versio | --versi | --vers | -V) ac_init_version=: ;; -with-* | --with-*) ac_useropt=`expr "x$ac_option" : 'x-*with-\([^=]*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error $? "invalid package name: $ac_useropt" ac_useropt_orig=$ac_useropt ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "with_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--with-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval with_$ac_useropt=\$ac_optarg ;; -without-* | --without-*) ac_useropt=`expr "x$ac_option" : 'x-*without-\(.*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error $? "invalid package name: $ac_useropt" ac_useropt_orig=$ac_useropt ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "with_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--without-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval with_$ac_useropt=no ;; --x) # Obsolete; use --with-x. with_x=yes ;; -x-includes | --x-includes | --x-include | --x-includ | --x-inclu \ | --x-incl | --x-inc | --x-in | --x-i) ac_prev=x_includes ;; -x-includes=* | --x-includes=* | --x-include=* | --x-includ=* | --x-inclu=* \ | --x-incl=* | --x-inc=* | --x-in=* | --x-i=*) x_includes=$ac_optarg ;; -x-libraries | --x-libraries | --x-librarie | --x-librari \ | --x-librar | --x-libra | --x-libr | --x-lib | --x-li | --x-l) ac_prev=x_libraries ;; -x-libraries=* | --x-libraries=* | --x-librarie=* | --x-librari=* \ | --x-librar=* | --x-libra=* | --x-libr=* | --x-lib=* | --x-li=* | --x-l=*) x_libraries=$ac_optarg ;; -*) as_fn_error $? "unrecognized option: \`$ac_option' Try \`$0 --help' for more information" ;; *=*) ac_envvar=`expr "x$ac_option" : 'x\([^=]*\)='` # Reject names that are not valid shell variable names. case $ac_envvar in #( '' | [0-9]* | *[!_$as_cr_alnum]* ) as_fn_error $? "invalid variable name: \`$ac_envvar'" ;; esac eval $ac_envvar=\$ac_optarg export $ac_envvar ;; *) # FIXME: should be removed in autoconf 3.0. $as_echo "$as_me: WARNING: you should use --build, --host, --target" >&2 expr "x$ac_option" : ".*[^-._$as_cr_alnum]" >/dev/null && $as_echo "$as_me: WARNING: invalid host type: $ac_option" >&2 : "${build_alias=$ac_option} ${host_alias=$ac_option} ${target_alias=$ac_option}" ;; esac done if test -n "$ac_prev"; then ac_option=--`echo $ac_prev | sed 's/_/-/g'` as_fn_error $? "missing argument to $ac_option" fi if test -n "$ac_unrecognized_opts"; then case $enable_option_checking in no) ;; fatal) as_fn_error $? "unrecognized options: $ac_unrecognized_opts" ;; *) $as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2 ;; esac fi # Check all directory arguments for consistency. for ac_var in exec_prefix prefix bindir sbindir libexecdir datarootdir \ datadir sysconfdir sharedstatedir localstatedir includedir \ oldincludedir docdir infodir htmldir dvidir pdfdir psdir \ libdir localedir mandir do eval ac_val=\$$ac_var # Remove trailing slashes. case $ac_val in */ ) ac_val=`expr "X$ac_val" : 'X\(.*[^/]\)' \| "X$ac_val" : 'X\(.*\)'` eval $ac_var=\$ac_val;; esac # Be sure to have absolute directory names. case $ac_val in [\\/$]* | ?:[\\/]* ) continue;; NONE | '' ) case $ac_var in *prefix ) continue;; esac;; esac as_fn_error $? "expected an absolute directory name for --$ac_var: $ac_val" done # There might be people who depend on the old broken behavior: `$host' # used to hold the argument of --host etc. # FIXME: To remove some day. build=$build_alias host=$host_alias target=$target_alias # FIXME: To remove some day. if test "x$host_alias" != x; then if test "x$build_alias" = x; then cross_compiling=maybe elif test "x$build_alias" != "x$host_alias"; then cross_compiling=yes fi fi ac_tool_prefix= test -n "$host_alias" && ac_tool_prefix=$host_alias- test "$silent" = yes && exec 6>/dev/null ac_pwd=`pwd` && test -n "$ac_pwd" && ac_ls_di=`ls -di .` && ac_pwd_ls_di=`cd "$ac_pwd" && ls -di .` || as_fn_error $? "working directory cannot be determined" test "X$ac_ls_di" = "X$ac_pwd_ls_di" || as_fn_error $? "pwd does not report name of working directory" # Find the source files, if location was not specified. if test -z "$srcdir"; then ac_srcdir_defaulted=yes # Try the directory containing this script, then the parent directory. ac_confdir=`$as_dirname -- "$as_myself" || $as_expr X"$as_myself" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$as_myself" : 'X\(//\)[^/]' \| \ X"$as_myself" : 'X\(//\)$' \| \ X"$as_myself" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$as_myself" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` srcdir=$ac_confdir if test ! -r "$srcdir/$ac_unique_file"; then srcdir=.. fi else ac_srcdir_defaulted=no fi if test ! -r "$srcdir/$ac_unique_file"; then test "$ac_srcdir_defaulted" = yes && srcdir="$ac_confdir or .." as_fn_error $? "cannot find sources ($ac_unique_file) in $srcdir" fi ac_msg="sources are in $srcdir, but \`cd $srcdir' does not work" ac_abs_confdir=`( cd "$srcdir" && test -r "./$ac_unique_file" || as_fn_error $? "$ac_msg" pwd)` # When building in place, set srcdir=. if test "$ac_abs_confdir" = "$ac_pwd"; then srcdir=. fi # Remove unnecessary trailing slashes from srcdir. # Double slashes in file names in object file debugging info # mess up M-x gdb in Emacs. case $srcdir in */) srcdir=`expr "X$srcdir" : 'X\(.*[^/]\)' \| "X$srcdir" : 'X\(.*\)'`;; esac for ac_var in $ac_precious_vars; do eval ac_env_${ac_var}_set=\${${ac_var}+set} eval ac_env_${ac_var}_value=\$${ac_var} eval ac_cv_env_${ac_var}_set=\${${ac_var}+set} eval ac_cv_env_${ac_var}_value=\$${ac_var} done # # Report the --help message. # if test "$ac_init_help" = "long"; then # Omit some internal or obsolete options to make the list less imposing. # This message is too long to be a string in the A/UX 3.1 sh. cat <<_ACEOF \`configure' configures cryptmount 5.2 to adapt to many kinds of systems. Usage: $0 [OPTION]... [VAR=VALUE]... To assign environment variables (e.g., CC, CFLAGS...), specify them as VAR=VALUE. See below for descriptions of some of the useful variables. Defaults for the options are specified in brackets. Configuration: -h, --help display this help and exit --help=short display options specific to this package --help=recursive display the short help of all the included packages -V, --version display version information and exit -q, --quiet, --silent do not print \`checking ...' messages --cache-file=FILE cache test results in FILE [disabled] -C, --config-cache alias for \`--cache-file=config.cache' -n, --no-create do not create output files --srcdir=DIR find the sources in DIR [configure dir or \`..'] Installation directories: --prefix=PREFIX install architecture-independent files in PREFIX [$ac_default_prefix] --exec-prefix=EPREFIX install architecture-dependent files in EPREFIX [PREFIX] By default, \`make install' will install all the files in \`$ac_default_prefix/bin', \`$ac_default_prefix/lib' etc. You can specify an installation prefix other than \`$ac_default_prefix' using \`--prefix', for instance \`--prefix=\$HOME'. For better control, use the options below. Fine tuning of the installation directories: --bindir=DIR user executables [EPREFIX/bin] --sbindir=DIR system admin executables [EPREFIX/sbin] --libexecdir=DIR program executables [EPREFIX/libexec] --sysconfdir=DIR read-only single-machine data [PREFIX/etc] --sharedstatedir=DIR modifiable architecture-independent data [PREFIX/com] --localstatedir=DIR modifiable single-machine data [PREFIX/var] --libdir=DIR object code libraries [EPREFIX/lib] --includedir=DIR C header files [PREFIX/include] --oldincludedir=DIR C header files for non-gcc [/usr/include] --datarootdir=DIR read-only arch.-independent data root [PREFIX/share] --datadir=DIR read-only architecture-independent data [DATAROOTDIR] --infodir=DIR info documentation [DATAROOTDIR/info] --localedir=DIR locale-dependent data [DATAROOTDIR/locale] --mandir=DIR man documentation [DATAROOTDIR/man] --docdir=DIR documentation root [DATAROOTDIR/doc/cryptmount] --htmldir=DIR html documentation [DOCDIR] --dvidir=DIR dvi documentation [DOCDIR] --pdfdir=DIR pdf documentation [DOCDIR] --psdir=DIR ps documentation [DOCDIR] _ACEOF cat <<\_ACEOF Program names: --program-prefix=PREFIX prepend PREFIX to installed program names --program-suffix=SUFFIX append SUFFIX to installed program names --program-transform-name=PROGRAM run sed PROGRAM on installed program names System types: --build=BUILD configure for building on BUILD [guessed] --host=HOST cross-compile to build programs to run on HOST [BUILD] _ACEOF fi if test -n "$ac_init_help"; then case $ac_init_help in short | recursive ) echo "Configuration of cryptmount 5.2:";; esac cat <<\_ACEOF Optional Features: --disable-option-checking ignore unrecognized --enable/--with options --disable-FEATURE do not include FEATURE (same as --enable-FEATURE=no) --enable-FEATURE[=ARG] include FEATURE [ARG=yes] --enable-silent-rules less verbose build output (undo: "make V=1") --disable-silent-rules verbose build output (undo: "make V=0") --disable-largefile omit support for large files --enable-openssl-compat enable libgcrypt-based OpenSSL compatible key-files (default is YES) --enable-libudev (EXPERIMENTAL) use libudev for /dev events (default=NO) --enable-luks enable key-management via Linux Unified Key Setup (default is YES) --enable-delegation delegate (un)mounting to /bin/(u)mount (default is YES) --enable-cswap enable crypto-swap support (default is YES) --enable-fsck check filesystems before mounting (default is YES) --disable-nls do not use Native Language Support --disable-rpath do not hardcode runtime library paths --enable-argv0switch default action given by progname (default is NO) Optional Packages: --with-PACKAGE[=ARG] use PACKAGE [ARG=yes] --without-PACKAGE do not use PACKAGE (same as --with-PACKAGE=no) --with-sysrundir=DIR directory for run-time state --with-libgcrypt support libgcrypt-encryption of keys --with-gnu-ld assume the C compiler uses GNU ld [default=no] --with-libiconv-prefix[=DIR] search for libiconv in DIR/include and DIR/lib --without-libiconv-prefix don't search for libiconv in includedir and libdir --with-libintl-prefix[=DIR] search for libintl in DIR/include and DIR/lib --without-libintl-prefix don't search for libintl in includedir and libdir --with-docdir directory for assembling source-code documentation --with-systemd whether boot-up support should be via systemd or sysvinit (default is NO) Some influential environment variables: CC C compiler command CFLAGS C compiler flags LDFLAGS linker flags, e.g. -L if you have libraries in a nonstandard directory LIBS libraries to pass to the linker, e.g. -l CPPFLAGS (Objective) C/C++ preprocessor flags, e.g. -I if you have headers in a nonstandard directory CPP C preprocessor PKG_CONFIG path to pkg-config utility PKG_CONFIG_PATH directories to add to pkg-config's search path PKG_CONFIG_LIBDIR path overriding pkg-config's built-in search path libcryptsetup_CFLAGS C compiler flags for libcryptsetup, overriding pkg-config libcryptsetup_LIBS linker flags for libcryptsetup, overriding pkg-config Use these variables to override the choices made by `configure' or to help it to find libraries and programs with nonstandard names/locations. Report bugs to . _ACEOF ac_status=$? fi if test "$ac_init_help" = "recursive"; then # If there are subdirs, report their specific --help. for ac_dir in : $ac_subdirs_all; do test "x$ac_dir" = x: && continue test -d "$ac_dir" || { cd "$srcdir" && ac_pwd=`pwd` && srcdir=. && test -d "$ac_dir"; } || continue ac_builddir=. case "$ac_dir" in .) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'` # A ".." for each directory in $ac_dir_suffix. ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'` case $ac_top_builddir_sub in "") ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_top_build_prefix=$ac_top_builddir_sub/ ;; esac ;; esac ac_abs_top_builddir=$ac_pwd ac_abs_builddir=$ac_pwd$ac_dir_suffix # for backward compatibility: ac_top_builddir=$ac_top_build_prefix case $srcdir in .) # We are building in place. ac_srcdir=. ac_top_srcdir=$ac_top_builddir_sub ac_abs_top_srcdir=$ac_pwd ;; [\\/]* | ?:[\\/]* ) # Absolute name. ac_srcdir=$srcdir$ac_dir_suffix; ac_top_srcdir=$srcdir ac_abs_top_srcdir=$srcdir ;; *) # Relative name. ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix ac_top_srcdir=$ac_top_build_prefix$srcdir ac_abs_top_srcdir=$ac_pwd/$srcdir ;; esac ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix cd "$ac_dir" || { ac_status=$?; continue; } # Check for guested configure. if test -f "$ac_srcdir/configure.gnu"; then echo && $SHELL "$ac_srcdir/configure.gnu" --help=recursive elif test -f "$ac_srcdir/configure"; then echo && $SHELL "$ac_srcdir/configure" --help=recursive else $as_echo "$as_me: WARNING: no configuration information is in $ac_dir" >&2 fi || ac_status=$? cd "$ac_pwd" || { ac_status=$?; break; } done fi test -n "$ac_init_help" && exit $ac_status if $ac_init_version; then cat <<\_ACEOF cryptmount configure 5.2 generated by GNU Autoconf 2.69 Copyright (C) 2012 Free Software Foundation, Inc. This configure script is free software; the Free Software Foundation gives unlimited permission to copy, distribute and modify it. _ACEOF exit fi ## ------------------------ ## ## Autoconf initialization. ## ## ------------------------ ## # ac_fn_c_try_compile LINENO # -------------------------- # Try to compile conftest.$ac_ext, and return whether this succeeded. ac_fn_c_try_compile () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack rm -f conftest.$ac_objext if { { ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_compile") 2>conftest.err ac_status=$? if test -s conftest.err; then grep -v '^ *+' conftest.err >conftest.er1 cat conftest.er1 >&5 mv -f conftest.er1 conftest.err fi $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext; then : ac_retval=0 else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=1 fi eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } # ac_fn_c_try_compile # ac_fn_c_try_cpp LINENO # ---------------------- # Try to preprocess conftest.$ac_ext, and return whether this succeeded. ac_fn_c_try_cpp () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack if { { ac_try="$ac_cpp conftest.$ac_ext" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_cpp conftest.$ac_ext") 2>conftest.err ac_status=$? if test -s conftest.err; then grep -v '^ *+' conftest.err >conftest.er1 cat conftest.er1 >&5 mv -f conftest.er1 conftest.err fi $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } > conftest.i && { test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" || test ! -s conftest.err }; then : ac_retval=0 else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=1 fi eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } # ac_fn_c_try_cpp # ac_fn_c_check_header_mongrel LINENO HEADER VAR INCLUDES # ------------------------------------------------------- # Tests whether HEADER exists, giving a warning if it cannot be compiled using # the include files in INCLUDES and setting the cache variable VAR # accordingly. ac_fn_c_check_header_mongrel () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack if eval \${$3+:} false; then : { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 $as_echo_n "checking for $2... " >&6; } if eval \${$3+:} false; then : $as_echo_n "(cached) " >&6 fi eval ac_res=\$$3 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } else # Is the header compilable? { $as_echo "$as_me:${as_lineno-$LINENO}: checking $2 usability" >&5 $as_echo_n "checking $2 usability... " >&6; } cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 #include <$2> _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_header_compiler=yes else ac_header_compiler=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_header_compiler" >&5 $as_echo "$ac_header_compiler" >&6; } # Is the header present? { $as_echo "$as_me:${as_lineno-$LINENO}: checking $2 presence" >&5 $as_echo_n "checking $2 presence... " >&6; } cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include <$2> _ACEOF if ac_fn_c_try_cpp "$LINENO"; then : ac_header_preproc=yes else ac_header_preproc=no fi rm -f conftest.err conftest.i conftest.$ac_ext { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_header_preproc" >&5 $as_echo "$ac_header_preproc" >&6; } # So? What about this header? case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in #(( yes:no: ) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: accepted by the compiler, rejected by the preprocessor!" >&5 $as_echo "$as_me: WARNING: $2: accepted by the compiler, rejected by the preprocessor!" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: proceeding with the compiler's result" >&5 $as_echo "$as_me: WARNING: $2: proceeding with the compiler's result" >&2;} ;; no:yes:* ) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: present but cannot be compiled" >&5 $as_echo "$as_me: WARNING: $2: present but cannot be compiled" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: check for missing prerequisite headers?" >&5 $as_echo "$as_me: WARNING: $2: check for missing prerequisite headers?" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: see the Autoconf documentation" >&5 $as_echo "$as_me: WARNING: $2: see the Autoconf documentation" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: section \"Present But Cannot Be Compiled\"" >&5 $as_echo "$as_me: WARNING: $2: section \"Present But Cannot Be Compiled\"" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: proceeding with the compiler's result" >&5 $as_echo "$as_me: WARNING: $2: proceeding with the compiler's result" >&2;} ( $as_echo "## ----------------------------------------- ## ## Report this to cryptmount@rwpenney.org.uk ## ## ----------------------------------------- ##" ) | sed "s/^/$as_me: WARNING: /" >&2 ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 $as_echo_n "checking for $2... " >&6; } if eval \${$3+:} false; then : $as_echo_n "(cached) " >&6 else eval "$3=\$ac_header_compiler" fi eval ac_res=\$$3 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } fi eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno } # ac_fn_c_check_header_mongrel # ac_fn_c_try_run LINENO # ---------------------- # Try to link conftest.$ac_ext, and return whether this succeeded. Assumes # that executables *can* be run. ac_fn_c_try_run () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack if { { ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && { ac_try='./conftest$ac_exeext' { { case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_try") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; }; then : ac_retval=0 else $as_echo "$as_me: program exited with status $ac_status" >&5 $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=$ac_status fi rm -rf conftest.dSYM conftest_ipa8_conftest.oo eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } # ac_fn_c_try_run # ac_fn_c_check_header_compile LINENO HEADER VAR INCLUDES # ------------------------------------------------------- # Tests whether HEADER exists and can be compiled using the include files in # INCLUDES, setting the cache variable VAR accordingly. ac_fn_c_check_header_compile () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 $as_echo_n "checking for $2... " >&6; } if eval \${$3+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 #include <$2> _ACEOF if ac_fn_c_try_compile "$LINENO"; then : eval "$3=yes" else eval "$3=no" fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi eval ac_res=\$$3 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno } # ac_fn_c_check_header_compile # ac_fn_c_try_link LINENO # ----------------------- # Try to link conftest.$ac_ext, and return whether this succeeded. ac_fn_c_try_link () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack rm -f conftest.$ac_objext conftest$ac_exeext if { { ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link") 2>conftest.err ac_status=$? if test -s conftest.err; then grep -v '^ *+' conftest.err >conftest.er1 cat conftest.er1 >&5 mv -f conftest.er1 conftest.err fi $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest$ac_exeext && { test "$cross_compiling" = yes || test -x conftest$ac_exeext }; then : ac_retval=0 else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=1 fi # Delete the IPA/IPO (Inter Procedural Analysis/Optimization) information # created by the PGI compiler (conftest_ipa8_conftest.oo), as it would # interfere with the next link command; also delete a directory that is # left behind by Apple's compiler. We do this before executing the actions. rm -rf conftest.dSYM conftest_ipa8_conftest.oo eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } # ac_fn_c_try_link # ac_fn_c_check_func LINENO FUNC VAR # ---------------------------------- # Tests whether FUNC exists, setting the cache variable VAR accordingly ac_fn_c_check_func () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 $as_echo_n "checking for $2... " >&6; } if eval \${$3+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Define $2 to an innocuous variant, in case declares $2. For example, HP-UX 11i declares gettimeofday. */ #define $2 innocuous_$2 /* System header to define __stub macros and hopefully few prototypes, which can conflict with char $2 (); below. Prefer to if __STDC__ is defined, since exists even on freestanding compilers. */ #ifdef __STDC__ # include #else # include #endif #undef $2 /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char $2 (); /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named something starting with __ and the normal name is an alias. */ #if defined __stub_$2 || defined __stub___$2 choke me #endif int main () { return $2 (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : eval "$3=yes" else eval "$3=no" fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext fi eval ac_res=\$$3 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno } # ac_fn_c_check_func # ac_fn_c_check_decl LINENO SYMBOL VAR INCLUDES # --------------------------------------------- # Tests whether SYMBOL is declared in INCLUDES, setting cache variable VAR # accordingly. ac_fn_c_check_decl () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack as_decl_name=`echo $2|sed 's/ *(.*//'` as_decl_use=`echo $2|sed -e 's/(/((/' -e 's/)/) 0&/' -e 's/,/) 0& (/g'` { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $as_decl_name is declared" >&5 $as_echo_n "checking whether $as_decl_name is declared... " >&6; } if eval \${$3+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 int main () { #ifndef $as_decl_name #ifdef __cplusplus (void) $as_decl_use; #else (void) $as_decl_name; #endif #endif ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : eval "$3=yes" else eval "$3=no" fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi eval ac_res=\$$3 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno } # ac_fn_c_check_decl cat >config.log <<_ACEOF This file contains any messages produced by compilers while running configure, to aid debugging if configure makes a mistake. It was created by cryptmount $as_me 5.2, which was generated by GNU Autoconf 2.69. Invocation command line was $ $0 $@ _ACEOF exec 5>>config.log { cat <<_ASUNAME ## --------- ## ## Platform. ## ## --------- ## hostname = `(hostname || uname -n) 2>/dev/null | sed 1q` uname -m = `(uname -m) 2>/dev/null || echo unknown` uname -r = `(uname -r) 2>/dev/null || echo unknown` uname -s = `(uname -s) 2>/dev/null || echo unknown` uname -v = `(uname -v) 2>/dev/null || echo unknown` /usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null || echo unknown` /bin/uname -X = `(/bin/uname -X) 2>/dev/null || echo unknown` /bin/arch = `(/bin/arch) 2>/dev/null || echo unknown` /usr/bin/arch -k = `(/usr/bin/arch -k) 2>/dev/null || echo unknown` /usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null || echo unknown` /usr/bin/hostinfo = `(/usr/bin/hostinfo) 2>/dev/null || echo unknown` /bin/machine = `(/bin/machine) 2>/dev/null || echo unknown` /usr/bin/oslevel = `(/usr/bin/oslevel) 2>/dev/null || echo unknown` /bin/universe = `(/bin/universe) 2>/dev/null || echo unknown` _ASUNAME as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. $as_echo "PATH: $as_dir" done IFS=$as_save_IFS } >&5 cat >&5 <<_ACEOF ## ----------- ## ## Core tests. ## ## ----------- ## _ACEOF # Keep a trace of the command line. # Strip out --no-create and --no-recursion so they do not pile up. # Strip out --silent because we don't want to record it for future runs. # Also quote any args containing shell meta-characters. # Make two passes to allow for proper duplicate-argument suppression. ac_configure_args= ac_configure_args0= ac_configure_args1= ac_must_keep_next=false for ac_pass in 1 2 do for ac_arg do case $ac_arg in -no-create | --no-c* | -n | -no-recursion | --no-r*) continue ;; -q | -quiet | --quiet | --quie | --qui | --qu | --q \ | -silent | --silent | --silen | --sile | --sil) continue ;; *\'*) ac_arg=`$as_echo "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;; esac case $ac_pass in 1) as_fn_append ac_configure_args0 " '$ac_arg'" ;; 2) as_fn_append ac_configure_args1 " '$ac_arg'" if test $ac_must_keep_next = true; then ac_must_keep_next=false # Got value, back to normal. else case $ac_arg in *=* | --config-cache | -C | -disable-* | --disable-* \ | -enable-* | --enable-* | -gas | --g* | -nfp | --nf* \ | -q | -quiet | --q* | -silent | --sil* | -v | -verb* \ | -with-* | --with-* | -without-* | --without-* | --x) case "$ac_configure_args0 " in "$ac_configure_args1"*" '$ac_arg' "* ) continue ;; esac ;; -* ) ac_must_keep_next=true ;; esac fi as_fn_append ac_configure_args " '$ac_arg'" ;; esac done done { ac_configure_args0=; unset ac_configure_args0;} { ac_configure_args1=; unset ac_configure_args1;} # When interrupted or exit'd, cleanup temporary files, and complete # config.log. We remove comments because anyway the quotes in there # would cause problems or look ugly. # WARNING: Use '\'' to represent an apostrophe within the trap. # WARNING: Do not start the trap code with a newline, due to a FreeBSD 4.0 bug. trap 'exit_status=$? # Save into config.log some information that might help in debugging. { echo $as_echo "## ---------------- ## ## Cache variables. ## ## ---------------- ##" echo # The following way of writing the cache mishandles newlines in values, ( for ac_var in `(set) 2>&1 | sed -n '\''s/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'\''`; do eval ac_val=\$$ac_var case $ac_val in #( *${as_nl}*) case $ac_var in #( *_cv_*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5 $as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;; esac case $ac_var in #( _ | IFS | as_nl) ;; #( BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #( *) { eval $ac_var=; unset $ac_var;} ;; esac ;; esac done (set) 2>&1 | case $as_nl`(ac_space='\'' '\''; set) 2>&1` in #( *${as_nl}ac_space=\ *) sed -n \ "s/'\''/'\''\\\\'\'''\''/g; s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\''\\2'\''/p" ;; #( *) sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p" ;; esac | sort ) echo $as_echo "## ----------------- ## ## Output variables. ## ## ----------------- ##" echo for ac_var in $ac_subst_vars do eval ac_val=\$$ac_var case $ac_val in *\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;; esac $as_echo "$ac_var='\''$ac_val'\''" done | sort echo if test -n "$ac_subst_files"; then $as_echo "## ------------------- ## ## File substitutions. ## ## ------------------- ##" echo for ac_var in $ac_subst_files do eval ac_val=\$$ac_var case $ac_val in *\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;; esac $as_echo "$ac_var='\''$ac_val'\''" done | sort echo fi if test -s confdefs.h; then $as_echo "## ----------- ## ## confdefs.h. ## ## ----------- ##" echo cat confdefs.h echo fi test "$ac_signal" != 0 && $as_echo "$as_me: caught signal $ac_signal" $as_echo "$as_me: exit $exit_status" } >&5 rm -f core *.core core.conftest.* && rm -f -r conftest* confdefs* conf$$* $ac_clean_files && exit $exit_status ' 0 for ac_signal in 1 2 13 15; do trap 'ac_signal='$ac_signal'; as_fn_exit 1' $ac_signal done ac_signal=0 # confdefs.h avoids OS command line length limits that DEFS can exceed. rm -f -r conftest* confdefs.h $as_echo "/* confdefs.h */" > confdefs.h # Predefined preprocessor variables. cat >>confdefs.h <<_ACEOF #define PACKAGE_NAME "$PACKAGE_NAME" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_TARNAME "$PACKAGE_TARNAME" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_VERSION "$PACKAGE_VERSION" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_STRING "$PACKAGE_STRING" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_BUGREPORT "$PACKAGE_BUGREPORT" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_URL "$PACKAGE_URL" _ACEOF # Let the site file select an alternate cache file if it wants to. # Prefer an explicitly selected file to automatically selected ones. ac_site_file1=NONE ac_site_file2=NONE if test -n "$CONFIG_SITE"; then # We do not want a PATH search for config.site. case $CONFIG_SITE in #(( -*) ac_site_file1=./$CONFIG_SITE;; */*) ac_site_file1=$CONFIG_SITE;; *) ac_site_file1=./$CONFIG_SITE;; esac elif test "x$prefix" != xNONE; then ac_site_file1=$prefix/share/config.site ac_site_file2=$prefix/etc/config.site else ac_site_file1=$ac_default_prefix/share/config.site ac_site_file2=$ac_default_prefix/etc/config.site fi for ac_site_file in "$ac_site_file1" "$ac_site_file2" do test "x$ac_site_file" = xNONE && continue if test /dev/null != "$ac_site_file" && test -r "$ac_site_file"; then { $as_echo "$as_me:${as_lineno-$LINENO}: loading site script $ac_site_file" >&5 $as_echo "$as_me: loading site script $ac_site_file" >&6;} sed 's/^/| /' "$ac_site_file" >&5 . "$ac_site_file" \ || { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "failed to load site script $ac_site_file See \`config.log' for more details" "$LINENO" 5; } fi done if test -r "$cache_file"; then # Some versions of bash will fail to source /dev/null (special files # actually), so we avoid doing that. DJGPP emulates it as a regular file. if test /dev/null != "$cache_file" && test -f "$cache_file"; then { $as_echo "$as_me:${as_lineno-$LINENO}: loading cache $cache_file" >&5 $as_echo "$as_me: loading cache $cache_file" >&6;} case $cache_file in [\\/]* | ?:[\\/]* ) . "$cache_file";; *) . "./$cache_file";; esac fi else { $as_echo "$as_me:${as_lineno-$LINENO}: creating cache $cache_file" >&5 $as_echo "$as_me: creating cache $cache_file" >&6;} >$cache_file fi gt_needs="$gt_needs " # Check that the precious variables saved in the cache have kept the same # value. ac_cache_corrupted=false for ac_var in $ac_precious_vars; do eval ac_old_set=\$ac_cv_env_${ac_var}_set eval ac_new_set=\$ac_env_${ac_var}_set eval ac_old_val=\$ac_cv_env_${ac_var}_value eval ac_new_val=\$ac_env_${ac_var}_value case $ac_old_set,$ac_new_set in set,) { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&5 $as_echo "$as_me: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&2;} ac_cache_corrupted=: ;; ,set) { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was not set in the previous run" >&5 $as_echo "$as_me: error: \`$ac_var' was not set in the previous run" >&2;} ac_cache_corrupted=: ;; ,);; *) if test "x$ac_old_val" != "x$ac_new_val"; then # differences in whitespace do not lead to failure. ac_old_val_w=`echo x $ac_old_val` ac_new_val_w=`echo x $ac_new_val` if test "$ac_old_val_w" != "$ac_new_val_w"; then { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' has changed since the previous run:" >&5 $as_echo "$as_me: error: \`$ac_var' has changed since the previous run:" >&2;} ac_cache_corrupted=: else { $as_echo "$as_me:${as_lineno-$LINENO}: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&5 $as_echo "$as_me: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&2;} eval $ac_var=\$ac_old_val fi { $as_echo "$as_me:${as_lineno-$LINENO}: former value: \`$ac_old_val'" >&5 $as_echo "$as_me: former value: \`$ac_old_val'" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: current value: \`$ac_new_val'" >&5 $as_echo "$as_me: current value: \`$ac_new_val'" >&2;} fi;; esac # Pass precious variables to config.status. if test "$ac_new_set" = set; then case $ac_new_val in *\'*) ac_arg=$ac_var=`$as_echo "$ac_new_val" | sed "s/'/'\\\\\\\\''/g"` ;; *) ac_arg=$ac_var=$ac_new_val ;; esac case " $ac_configure_args " in *" '$ac_arg' "*) ;; # Avoid dups. Use of quotes ensures accuracy. *) as_fn_append ac_configure_args " '$ac_arg'" ;; esac fi done if $ac_cache_corrupted; then { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: error: changes in the environment can compromise the build" >&5 $as_echo "$as_me: error: changes in the environment can compromise the build" >&2;} as_fn_error $? "run \`make distclean' and/or \`rm $cache_file' and start over" "$LINENO" 5 fi ## -------------------- ## ## Main body of script. ## ## -------------------- ## ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu SYSPATH="/sbin:/bin:/usr/sbin:/usr/bin" CM_SYSCONF_DIR="${sysconfdir}/cryptmount" CM_DEFAULT_SUPATH=${SYSPATH} CM_DEFAULT_CIPHER="aes-cbc-plain" LIBS_GCRY="" LIBS_LUKS="" am__api_version='1.14' ac_aux_dir= for ac_dir in "$srcdir" "$srcdir/.." "$srcdir/../.."; do if test -f "$ac_dir/install-sh"; then ac_aux_dir=$ac_dir ac_install_sh="$ac_aux_dir/install-sh -c" break elif test -f "$ac_dir/install.sh"; then ac_aux_dir=$ac_dir ac_install_sh="$ac_aux_dir/install.sh -c" break elif test -f "$ac_dir/shtool"; then ac_aux_dir=$ac_dir ac_install_sh="$ac_aux_dir/shtool install -c" break fi done if test -z "$ac_aux_dir"; then as_fn_error $? "cannot find install-sh, install.sh, or shtool in \"$srcdir\" \"$srcdir/..\" \"$srcdir/../..\"" "$LINENO" 5 fi # These three variables are undocumented and unsupported, # and are intended to be withdrawn in a future Autoconf release. # They can cause serious problems if a builder's source tree is in a directory # whose full name contains unusual characters. ac_config_guess="$SHELL $ac_aux_dir/config.guess" # Please don't use this var. ac_config_sub="$SHELL $ac_aux_dir/config.sub" # Please don't use this var. ac_configure="$SHELL $ac_aux_dir/configure" # Please don't use this var. # Find a good install program. We prefer a C program (faster), # so one script is as good as another. But avoid the broken or # incompatible versions: # SysV /etc/install, /usr/sbin/install # SunOS /usr/etc/install # IRIX /sbin/install # AIX /bin/install # AmigaOS /C/install, which installs bootblocks on floppy discs # AIX 4 /usr/bin/installbsd, which doesn't work without a -g flag # AFS /usr/afsws/bin/install, which mishandles nonexistent args # SVR4 /usr/ucb/install, which tries to use the nonexistent group "staff" # OS/2's system install, which has a completely different semantic # ./install, which can be erroneously created by make from ./install.sh. # Reject install programs that cannot install multiple files. { $as_echo "$as_me:${as_lineno-$LINENO}: checking for a BSD-compatible install" >&5 $as_echo_n "checking for a BSD-compatible install... " >&6; } if test -z "$INSTALL"; then if ${ac_cv_path_install+:} false; then : $as_echo_n "(cached) " >&6 else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. # Account for people who put trailing slashes in PATH elements. case $as_dir/ in #(( ./ | .// | /[cC]/* | \ /etc/* | /usr/sbin/* | /usr/etc/* | /sbin/* | /usr/afsws/bin/* | \ ?:[\\/]os2[\\/]install[\\/]* | ?:[\\/]OS2[\\/]INSTALL[\\/]* | \ /usr/ucb/* ) ;; *) # OSF1 and SCO ODT 3.0 have their own names for install. # Don't use installbsd from OSF since it installs stuff as root # by default. for ac_prog in ginstall scoinst install; do for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_prog$ac_exec_ext"; then if test $ac_prog = install && grep dspmsg "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then # AIX install. It has an incompatible calling convention. : elif test $ac_prog = install && grep pwplus "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then # program-specific install script used by HP pwplus--don't use. : else rm -rf conftest.one conftest.two conftest.dir echo one > conftest.one echo two > conftest.two mkdir conftest.dir if "$as_dir/$ac_prog$ac_exec_ext" -c conftest.one conftest.two "`pwd`/conftest.dir" && test -s conftest.one && test -s conftest.two && test -s conftest.dir/conftest.one && test -s conftest.dir/conftest.two then ac_cv_path_install="$as_dir/$ac_prog$ac_exec_ext -c" break 3 fi fi fi done done ;; esac done IFS=$as_save_IFS rm -rf conftest.one conftest.two conftest.dir fi if test "${ac_cv_path_install+set}" = set; then INSTALL=$ac_cv_path_install else # As a last resort, use the slow shell script. Don't cache a # value for INSTALL within a source directory, because that will # break other packages using the cache if that directory is # removed, or if the value is a relative name. INSTALL=$ac_install_sh fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $INSTALL" >&5 $as_echo "$INSTALL" >&6; } # Use test -z because SunOS4 sh mishandles braces in ${var-val}. # It thinks the first close brace ends the variable substitution. test -z "$INSTALL_PROGRAM" && INSTALL_PROGRAM='${INSTALL}' test -z "$INSTALL_SCRIPT" && INSTALL_SCRIPT='${INSTALL}' test -z "$INSTALL_DATA" && INSTALL_DATA='${INSTALL} -m 644' { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether build environment is sane" >&5 $as_echo_n "checking whether build environment is sane... " >&6; } # Reject unsafe characters in $srcdir or the absolute working directory # name. Accept space and tab only in the latter. am_lf=' ' case `pwd` in *[\\\"\#\$\&\'\`$am_lf]*) as_fn_error $? "unsafe absolute working directory name" "$LINENO" 5;; esac case $srcdir in *[\\\"\#\$\&\'\`$am_lf\ \ ]*) as_fn_error $? "unsafe srcdir value: '$srcdir'" "$LINENO" 5;; esac # Do 'set' in a subshell so we don't clobber the current shell's # arguments. Must try -L first in case configure is actually a # symlink; some systems play weird games with the mod time of symlinks # (eg FreeBSD returns the mod time of the symlink's containing # directory). if ( am_has_slept=no for am_try in 1 2; do echo "timestamp, slept: $am_has_slept" > conftest.file set X `ls -Lt "$srcdir/configure" conftest.file 2> /dev/null` if test "$*" = "X"; then # -L didn't work. set X `ls -t "$srcdir/configure" conftest.file` fi if test "$*" != "X $srcdir/configure conftest.file" \ && test "$*" != "X conftest.file $srcdir/configure"; then # If neither matched, then we have a broken ls. This can happen # if, for instance, CONFIG_SHELL is bash and it inherits a # broken ls alias from the environment. This has actually # happened. Such a system could not be considered "sane". as_fn_error $? "ls -t appears to fail. Make sure there is not a broken alias in your environment" "$LINENO" 5 fi if test "$2" = conftest.file || test $am_try -eq 2; then break fi # Just in case. sleep 1 am_has_slept=yes done test "$2" = conftest.file ) then # Ok. : else as_fn_error $? "newly created file is older than distributed files! Check your system clock" "$LINENO" 5 fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } # If we didn't sleep, we still need to ensure time stamps of config.status and # generated files are strictly newer. am_sleep_pid= if grep 'slept: no' conftest.file >/dev/null 2>&1; then ( sleep 1 ) & am_sleep_pid=$! fi rm -f conftest.file test "$program_prefix" != NONE && program_transform_name="s&^&$program_prefix&;$program_transform_name" # Use a double $ so make ignores it. test "$program_suffix" != NONE && program_transform_name="s&\$&$program_suffix&;$program_transform_name" # Double any \ or $. # By default was `s,x,x', remove it if useless. ac_script='s/[\\$]/&&/g;s/;s,x,x,$//' program_transform_name=`$as_echo "$program_transform_name" | sed "$ac_script"` # Expand $ac_aux_dir to an absolute path. am_aux_dir=`cd "$ac_aux_dir" && pwd` if test x"${MISSING+set}" != xset; then case $am_aux_dir in *\ * | *\ *) MISSING="\${SHELL} \"$am_aux_dir/missing\"" ;; *) MISSING="\${SHELL} $am_aux_dir/missing" ;; esac fi # Use eval to expand $SHELL if eval "$MISSING --is-lightweight"; then am_missing_run="$MISSING " else am_missing_run= { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: 'missing' script is too old or missing" >&5 $as_echo "$as_me: WARNING: 'missing' script is too old or missing" >&2;} fi if test x"${install_sh}" != xset; then case $am_aux_dir in *\ * | *\ *) install_sh="\${SHELL} '$am_aux_dir/install-sh'" ;; *) install_sh="\${SHELL} $am_aux_dir/install-sh" esac fi # Installed binaries are usually stripped using 'strip' when the user # run "make install-strip". However 'strip' might not be the right # tool to use in cross-compilation environments, therefore Automake # will honor the 'STRIP' environment variable to overrule this program. if test "$cross_compiling" != no; then if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}strip", so it can be a program name with args. set dummy ${ac_tool_prefix}strip; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_STRIP+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$STRIP"; then ac_cv_prog_STRIP="$STRIP" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_STRIP="${ac_tool_prefix}strip" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi STRIP=$ac_cv_prog_STRIP if test -n "$STRIP"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $STRIP" >&5 $as_echo "$STRIP" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_STRIP"; then ac_ct_STRIP=$STRIP # Extract the first word of "strip", so it can be a program name with args. set dummy strip; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_STRIP+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_STRIP"; then ac_cv_prog_ac_ct_STRIP="$ac_ct_STRIP" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_STRIP="strip" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_STRIP=$ac_cv_prog_ac_ct_STRIP if test -n "$ac_ct_STRIP"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_STRIP" >&5 $as_echo "$ac_ct_STRIP" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_STRIP" = x; then STRIP=":" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac STRIP=$ac_ct_STRIP fi else STRIP="$ac_cv_prog_STRIP" fi fi INSTALL_STRIP_PROGRAM="\$(install_sh) -c -s" { $as_echo "$as_me:${as_lineno-$LINENO}: checking for a thread-safe mkdir -p" >&5 $as_echo_n "checking for a thread-safe mkdir -p... " >&6; } if test -z "$MKDIR_P"; then if ${ac_cv_path_mkdir+:} false; then : $as_echo_n "(cached) " >&6 else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH$PATH_SEPARATOR/opt/sfw/bin do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_prog in mkdir gmkdir; do for ac_exec_ext in '' $ac_executable_extensions; do as_fn_executable_p "$as_dir/$ac_prog$ac_exec_ext" || continue case `"$as_dir/$ac_prog$ac_exec_ext" --version 2>&1` in #( 'mkdir (GNU coreutils) '* | \ 'mkdir (coreutils) '* | \ 'mkdir (fileutils) '4.1*) ac_cv_path_mkdir=$as_dir/$ac_prog$ac_exec_ext break 3;; esac done done done IFS=$as_save_IFS fi test -d ./--version && rmdir ./--version if test "${ac_cv_path_mkdir+set}" = set; then MKDIR_P="$ac_cv_path_mkdir -p" else # As a last resort, use the slow shell script. Don't cache a # value for MKDIR_P within a source directory, because that will # break other packages using the cache if that directory is # removed, or if the value is a relative name. MKDIR_P="$ac_install_sh -d" fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MKDIR_P" >&5 $as_echo "$MKDIR_P" >&6; } for ac_prog in gawk mawk nawk awk do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_AWK+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$AWK"; then ac_cv_prog_AWK="$AWK" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_AWK="$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi AWK=$ac_cv_prog_AWK if test -n "$AWK"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $AWK" >&5 $as_echo "$AWK" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$AWK" && break done { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ${MAKE-make} sets \$(MAKE)" >&5 $as_echo_n "checking whether ${MAKE-make} sets \$(MAKE)... " >&6; } set x ${MAKE-make} ac_make=`$as_echo "$2" | sed 's/+/p/g; s/[^a-zA-Z0-9_]/_/g'` if eval \${ac_cv_prog_make_${ac_make}_set+:} false; then : $as_echo_n "(cached) " >&6 else cat >conftest.make <<\_ACEOF SHELL = /bin/sh all: @echo '@@@%%%=$(MAKE)=@@@%%%' _ACEOF # GNU make sometimes prints "make[1]: Entering ...", which would confuse us. case `${MAKE-make} -f conftest.make 2>/dev/null` in *@@@%%%=?*=@@@%%%*) eval ac_cv_prog_make_${ac_make}_set=yes;; *) eval ac_cv_prog_make_${ac_make}_set=no;; esac rm -f conftest.make fi if eval test \$ac_cv_prog_make_${ac_make}_set = yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } SET_MAKE= else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } SET_MAKE="MAKE=${MAKE-make}" fi rm -rf .tst 2>/dev/null mkdir .tst 2>/dev/null if test -d .tst; then am__leading_dot=. else am__leading_dot=_ fi rmdir .tst 2>/dev/null # Check whether --enable-silent-rules was given. if test "${enable_silent_rules+set}" = set; then : enableval=$enable_silent_rules; fi case $enable_silent_rules in # ((( yes) AM_DEFAULT_VERBOSITY=0;; no) AM_DEFAULT_VERBOSITY=1;; *) AM_DEFAULT_VERBOSITY=1;; esac am_make=${MAKE-make} { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $am_make supports nested variables" >&5 $as_echo_n "checking whether $am_make supports nested variables... " >&6; } if ${am_cv_make_support_nested_variables+:} false; then : $as_echo_n "(cached) " >&6 else if $as_echo 'TRUE=$(BAR$(V)) BAR0=false BAR1=true V=1 am__doit: @$(TRUE) .PHONY: am__doit' | $am_make -f - >/dev/null 2>&1; then am_cv_make_support_nested_variables=yes else am_cv_make_support_nested_variables=no fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_make_support_nested_variables" >&5 $as_echo "$am_cv_make_support_nested_variables" >&6; } if test $am_cv_make_support_nested_variables = yes; then AM_V='$(V)' AM_DEFAULT_V='$(AM_DEFAULT_VERBOSITY)' else AM_V=$AM_DEFAULT_VERBOSITY AM_DEFAULT_V=$AM_DEFAULT_VERBOSITY fi AM_BACKSLASH='\' if test "`cd $srcdir && pwd`" != "`pwd`"; then # Use -I$(srcdir) only when $(srcdir) != ., so that make's output # is not polluted with repeated "-I." am__isrc=' -I$(srcdir)' # test to see if srcdir already configured if test -f $srcdir/config.status; then as_fn_error $? "source directory already configured; run \"make distclean\" there first" "$LINENO" 5 fi fi # test whether we have cygpath if test -z "$CYGPATH_W"; then if (cygpath --version) >/dev/null 2>/dev/null; then CYGPATH_W='cygpath -w' else CYGPATH_W=echo fi fi # Define the identity of the package. PACKAGE='cryptmount' VERSION='5.2' cat >>confdefs.h <<_ACEOF #define PACKAGE "$PACKAGE" _ACEOF cat >>confdefs.h <<_ACEOF #define VERSION "$VERSION" _ACEOF # Some tools Automake needs. ACLOCAL=${ACLOCAL-"${am_missing_run}aclocal-${am__api_version}"} AUTOCONF=${AUTOCONF-"${am_missing_run}autoconf"} AUTOMAKE=${AUTOMAKE-"${am_missing_run}automake-${am__api_version}"} AUTOHEADER=${AUTOHEADER-"${am_missing_run}autoheader"} MAKEINFO=${MAKEINFO-"${am_missing_run}makeinfo"} # For better backward compatibility. To be removed once Automake 1.9.x # dies out for good. For more background, see: # # mkdir_p='$(MKDIR_P)' # We need awk for the "check" target. The system "awk" is bad on # some platforms. # Always define AMTAR for backward compatibility. Yes, it's still used # in the wild :-( We should find a proper way to deprecate it ... AMTAR='$${TAR-tar}' # We'll loop over all known methods to create a tar archive until one works. _am_tools='gnutar pax cpio none' am__tar='$${TAR-tar} chof - "$$tardir"' am__untar='$${TAR-tar} xf -' # POSIX will say in a future version that running "rm -f" with no argument # is OK; and we want to be able to make that assumption in our Makefile # recipes. So use an aggressive probe to check that the usage we want is # actually supported "in the wild" to an acceptable degree. # See automake bug#10828. # To make any issue more visible, cause the running configure to be aborted # by default if the 'rm' program in use doesn't match our expectations; the # user can still override this though. if rm -f && rm -fr && rm -rf; then : OK; else cat >&2 <<'END' Oops! Your 'rm' program seems unable to run without file operands specified on the command line, even when the '-f' option is present. This is contrary to the behaviour of most rm programs out there, and not conforming with the upcoming POSIX standard: Please tell bug-automake@gnu.org about your system, including the value of your $PATH and any error possibly output before this message. This can help us improve future automake versions. END if test x"$ACCEPT_INFERIOR_RM_PROGRAM" = x"yes"; then echo 'Configuration will proceed anyway, since you have set the' >&2 echo 'ACCEPT_INFERIOR_RM_PROGRAM variable to "yes"' >&2 echo >&2 else cat >&2 <<'END' Aborting the configuration process, to ensure you take notice of the issue. You can download and install GNU coreutils to get an 'rm' implementation that behaves properly: . If you want to complete the configuration process using your problematic 'rm' anyway, export the environment variable ACCEPT_INFERIOR_RM_PROGRAM to "yes", and re-run configure. END as_fn_error $? "Your 'rm' program is bad, sorry." "$LINENO" 5 fi fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}gcc", so it can be a program name with args. set dummy ${ac_tool_prefix}gcc; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_CC="${ac_tool_prefix}gcc" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_CC"; then ac_ct_CC=$CC # Extract the first word of "gcc", so it can be a program name with args. set dummy gcc; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_CC"; then ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_CC="gcc" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_CC=$ac_cv_prog_ac_ct_CC if test -n "$ac_ct_CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 $as_echo "$ac_ct_CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_CC" = x; then CC="" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac CC=$ac_ct_CC fi else CC="$ac_cv_prog_CC" fi if test -z "$CC"; then if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}cc", so it can be a program name with args. set dummy ${ac_tool_prefix}cc; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_CC="${ac_tool_prefix}cc" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi fi if test -z "$CC"; then # Extract the first word of "cc", so it can be a program name with args. set dummy cc; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else ac_prog_rejected=no as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then if test "$as_dir/$ac_word$ac_exec_ext" = "/usr/ucb/cc"; then ac_prog_rejected=yes continue fi ac_cv_prog_CC="cc" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS if test $ac_prog_rejected = yes; then # We found a bogon in the path, so make sure we never use it. set dummy $ac_cv_prog_CC shift if test $# != 0; then # We chose a different compiler from the bogus one. # However, it has the same basename, so the bogon will be chosen # first if we set CC to just the basename; use the full file name. shift ac_cv_prog_CC="$as_dir/$ac_word${1+' '}$@" fi fi fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$CC"; then if test -n "$ac_tool_prefix"; then for ac_prog in cl.exe do # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. set dummy $ac_tool_prefix$ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_CC="$ac_tool_prefix$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$CC" && break done fi if test -z "$CC"; then ac_ct_CC=$CC for ac_prog in cl.exe do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_CC"; then ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_CC="$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_CC=$ac_cv_prog_ac_ct_CC if test -n "$ac_ct_CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 $as_echo "$ac_ct_CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$ac_ct_CC" && break done if test "x$ac_ct_CC" = x; then CC="" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac CC=$ac_ct_CC fi fi fi test -z "$CC" && { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "no acceptable C compiler found in \$PATH See \`config.log' for more details" "$LINENO" 5; } # Provide some information about the compiler. $as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler version" >&5 set X $ac_compile ac_compiler=$2 for ac_option in --version -v -V -qversion; do { { ac_try="$ac_compiler $ac_option >&5" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_compiler $ac_option >&5") 2>conftest.err ac_status=$? if test -s conftest.err; then sed '10a\ ... rest of stderr output deleted ... 10q' conftest.err >conftest.er1 cat conftest.er1 >&5 fi rm -f conftest.er1 conftest.err $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } done cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF ac_clean_files_save=$ac_clean_files ac_clean_files="$ac_clean_files a.out a.out.dSYM a.exe b.out" # Try to create an executable without -o first, disregard a.out. # It will help us diagnose broken compilers, and finding out an intuition # of exeext. { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the C compiler works" >&5 $as_echo_n "checking whether the C compiler works... " >&6; } ac_link_default=`$as_echo "$ac_link" | sed 's/ -o *conftest[^ ]*//'` # The possible output files: ac_files="a.out conftest.exe conftest a.exe a_out.exe b.out conftest.*" ac_rmfiles= for ac_file in $ac_files do case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;; * ) ac_rmfiles="$ac_rmfiles $ac_file";; esac done rm -f $ac_rmfiles if { { ac_try="$ac_link_default" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link_default") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then : # Autoconf-2.13 could set the ac_cv_exeext variable to `no'. # So ignore a value of `no', otherwise this would lead to `EXEEXT = no' # in a Makefile. We should not override ac_cv_exeext if it was cached, # so that the user can short-circuit this test for compilers unknown to # Autoconf. for ac_file in $ac_files '' do test -f "$ac_file" || continue case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;; [ab].out ) # We found the default executable, but exeext='' is most # certainly right. break;; *.* ) if test "${ac_cv_exeext+set}" = set && test "$ac_cv_exeext" != no; then :; else ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'` fi # We set ac_cv_exeext here because the later test for it is not # safe: cross compilers may not add the suffix if given an `-o' # argument, so we may need to know it at that point already. # Even if this section looks crufty: it has the advantage of # actually working. break;; * ) break;; esac done test "$ac_cv_exeext" = no && ac_cv_exeext= else ac_file='' fi if test -z "$ac_file"; then : { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error 77 "C compiler cannot create executables See \`config.log' for more details" "$LINENO" 5; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler default output file name" >&5 $as_echo_n "checking for C compiler default output file name... " >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_file" >&5 $as_echo "$ac_file" >&6; } ac_exeext=$ac_cv_exeext rm -f -r a.out a.out.dSYM a.exe conftest$ac_cv_exeext b.out ac_clean_files=$ac_clean_files_save { $as_echo "$as_me:${as_lineno-$LINENO}: checking for suffix of executables" >&5 $as_echo_n "checking for suffix of executables... " >&6; } if { { ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then : # If both `conftest.exe' and `conftest' are `present' (well, observable) # catch `conftest.exe'. For instance with Cygwin, `ls conftest' will # work properly (i.e., refer to `conftest.exe'), while it won't with # `rm'. for ac_file in conftest.exe conftest conftest.*; do test -f "$ac_file" || continue case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;; *.* ) ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'` break;; * ) break;; esac done else { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "cannot compute suffix of executables: cannot compile and link See \`config.log' for more details" "$LINENO" 5; } fi rm -f conftest conftest$ac_cv_exeext { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_exeext" >&5 $as_echo "$ac_cv_exeext" >&6; } rm -f conftest.$ac_ext EXEEXT=$ac_cv_exeext ac_exeext=$EXEEXT cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main () { FILE *f = fopen ("conftest.out", "w"); return ferror (f) || fclose (f) != 0; ; return 0; } _ACEOF ac_clean_files="$ac_clean_files conftest.out" # Check that the compiler produces executables we can run. If not, either # the compiler is broken, or we cross compile. { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are cross compiling" >&5 $as_echo_n "checking whether we are cross compiling... " >&6; } if test "$cross_compiling" != yes; then { { ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } if { ac_try='./conftest$ac_cv_exeext' { { case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_try") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; }; then cross_compiling=no else if test "$cross_compiling" = maybe; then cross_compiling=yes else { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "cannot run C compiled programs. If you meant to cross compile, use \`--host'. See \`config.log' for more details" "$LINENO" 5; } fi fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $cross_compiling" >&5 $as_echo "$cross_compiling" >&6; } rm -f conftest.$ac_ext conftest$ac_cv_exeext conftest.out ac_clean_files=$ac_clean_files_save { $as_echo "$as_me:${as_lineno-$LINENO}: checking for suffix of object files" >&5 $as_echo_n "checking for suffix of object files... " >&6; } if ${ac_cv_objext+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF rm -f conftest.o conftest.obj if { { ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_compile") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then : for ac_file in conftest.o conftest.obj conftest.*; do test -f "$ac_file" || continue; case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM ) ;; *) ac_cv_objext=`expr "$ac_file" : '.*\.\(.*\)'` break;; esac done else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "cannot compute suffix of object files: cannot compile See \`config.log' for more details" "$LINENO" 5; } fi rm -f conftest.$ac_cv_objext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_objext" >&5 $as_echo "$ac_cv_objext" >&6; } OBJEXT=$ac_cv_objext ac_objext=$OBJEXT { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are using the GNU C compiler" >&5 $as_echo_n "checking whether we are using the GNU C compiler... " >&6; } if ${ac_cv_c_compiler_gnu+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { #ifndef __GNUC__ choke me #endif ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_compiler_gnu=yes else ac_compiler_gnu=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_cv_c_compiler_gnu=$ac_compiler_gnu fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_compiler_gnu" >&5 $as_echo "$ac_cv_c_compiler_gnu" >&6; } if test $ac_compiler_gnu = yes; then GCC=yes else GCC= fi ac_test_CFLAGS=${CFLAGS+set} ac_save_CFLAGS=$CFLAGS { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC accepts -g" >&5 $as_echo_n "checking whether $CC accepts -g... " >&6; } if ${ac_cv_prog_cc_g+:} false; then : $as_echo_n "(cached) " >&6 else ac_save_c_werror_flag=$ac_c_werror_flag ac_c_werror_flag=yes ac_cv_prog_cc_g=no CFLAGS="-g" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_prog_cc_g=yes else CFLAGS="" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : else ac_c_werror_flag=$ac_save_c_werror_flag CFLAGS="-g" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_prog_cc_g=yes fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_c_werror_flag=$ac_save_c_werror_flag fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_g" >&5 $as_echo "$ac_cv_prog_cc_g" >&6; } if test "$ac_test_CFLAGS" = set; then CFLAGS=$ac_save_CFLAGS elif test $ac_cv_prog_cc_g = yes; then if test "$GCC" = yes; then CFLAGS="-g -O2" else CFLAGS="-g" fi else if test "$GCC" = yes; then CFLAGS="-O2" else CFLAGS= fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $CC option to accept ISO C89" >&5 $as_echo_n "checking for $CC option to accept ISO C89... " >&6; } if ${ac_cv_prog_cc_c89+:} false; then : $as_echo_n "(cached) " >&6 else ac_cv_prog_cc_c89=no ac_save_CC=$CC cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include struct stat; /* Most of the following tests are stolen from RCS 5.7's src/conf.sh. */ struct buf { int x; }; FILE * (*rcsopen) (struct buf *, struct stat *, int); static char *e (p, i) char **p; int i; { return p[i]; } static char *f (char * (*g) (char **, int), char **p, ...) { char *s; va_list v; va_start (v,p); s = g (p, va_arg (v,int)); va_end (v); return s; } /* OSF 4.0 Compaq cc is some sort of almost-ANSI by default. It has function prototypes and stuff, but not '\xHH' hex character constants. These don't provoke an error unfortunately, instead are silently treated as 'x'. The following induces an error, until -std is added to get proper ANSI mode. Curiously '\x00'!='x' always comes out true, for an array size at least. It's necessary to write '\x00'==0 to get something that's true only with -std. */ int osf4_cc_array ['\x00' == 0 ? 1 : -1]; /* IBM C 6 for AIX is almost-ANSI by default, but it replaces macro parameters inside strings and character constants. */ #define FOO(x) 'x' int xlc6_cc_array[FOO(a) == 'x' ? 1 : -1]; int test (int i, double x); struct s1 {int (*f) (int a);}; struct s2 {int (*f) (double a);}; int pairnames (int, char **, FILE *(*)(struct buf *, struct stat *, int), int, int); int argc; char **argv; int main () { return f (e, argv, 0) != argv[0] || f (e, argv, 1) != argv[1]; ; return 0; } _ACEOF for ac_arg in '' -qlanglvl=extc89 -qlanglvl=ansi -std \ -Ae "-Aa -D_HPUX_SOURCE" "-Xc -D__EXTENSIONS__" do CC="$ac_save_CC $ac_arg" if ac_fn_c_try_compile "$LINENO"; then : ac_cv_prog_cc_c89=$ac_arg fi rm -f core conftest.err conftest.$ac_objext test "x$ac_cv_prog_cc_c89" != "xno" && break done rm -f conftest.$ac_ext CC=$ac_save_CC fi # AC_CACHE_VAL case "x$ac_cv_prog_cc_c89" in x) { $as_echo "$as_me:${as_lineno-$LINENO}: result: none needed" >&5 $as_echo "none needed" >&6; } ;; xno) { $as_echo "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5 $as_echo "unsupported" >&6; } ;; *) CC="$CC $ac_cv_prog_cc_c89" { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c89" >&5 $as_echo "$ac_cv_prog_cc_c89" >&6; } ;; esac if test "x$ac_cv_prog_cc_c89" != xno; then : fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC understands -c and -o together" >&5 $as_echo_n "checking whether $CC understands -c and -o together... " >&6; } if ${am_cv_prog_cc_c_o+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF # Make sure it works both with $CC and with simple cc. # Following AC_PROG_CC_C_O, we do the test twice because some # compilers refuse to overwrite an existing .o file with -o, # though they will create one. am_cv_prog_cc_c_o=yes for am_i in 1 2; do if { echo "$as_me:$LINENO: $CC -c conftest.$ac_ext -o conftest2.$ac_objext" >&5 ($CC -c conftest.$ac_ext -o conftest2.$ac_objext) >&5 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } \ && test -f conftest2.$ac_objext; then : OK else am_cv_prog_cc_c_o=no break fi done rm -f core conftest* unset am_i fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_prog_cc_c_o" >&5 $as_echo "$am_cv_prog_cc_c_o" >&6; } if test "$am_cv_prog_cc_c_o" != yes; then # Losing compiler, so override with the script. # FIXME: It is wrong to rewrite CC. # But if we don't then we get into trouble of one sort or another. # A longer-term fix would be to have automake use am__CC in this case, # and then we could set am__CC="\$(top_srcdir)/compile \$(CC)" CC="$am_aux_dir/compile $CC" fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to run the C preprocessor" >&5 $as_echo_n "checking how to run the C preprocessor... " >&6; } # On Suns, sometimes $CPP names a directory. if test -n "$CPP" && test -d "$CPP"; then CPP= fi if test -z "$CPP"; then if ${ac_cv_prog_CPP+:} false; then : $as_echo_n "(cached) " >&6 else # Double quotes because CPP needs to be expanded for CPP in "$CC -E" "$CC -E -traditional-cpp" "/lib/cpp" do ac_preproc_ok=false for ac_c_preproc_warn_flag in '' yes do # Use a header file that comes with gcc, so configuring glibc # with a fresh cross-compiler works. # Prefer to if __STDC__ is defined, since # exists even on freestanding compilers. # On the NeXT, cc -E runs the code through the compiler's parser, # not just through cpp. "Syntax error" is here to catch this case. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #ifdef __STDC__ # include #else # include #endif Syntax error _ACEOF if ac_fn_c_try_cpp "$LINENO"; then : else # Broken: fails on valid input. continue fi rm -f conftest.err conftest.i conftest.$ac_ext # OK, works on sane cases. Now check whether nonexistent headers # can be detected and how. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if ac_fn_c_try_cpp "$LINENO"; then : # Broken: success on invalid input. continue else # Passes both tests. ac_preproc_ok=: break fi rm -f conftest.err conftest.i conftest.$ac_ext done # Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. rm -f conftest.i conftest.err conftest.$ac_ext if $ac_preproc_ok; then : break fi done ac_cv_prog_CPP=$CPP fi CPP=$ac_cv_prog_CPP else ac_cv_prog_CPP=$CPP fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CPP" >&5 $as_echo "$CPP" >&6; } ac_preproc_ok=false for ac_c_preproc_warn_flag in '' yes do # Use a header file that comes with gcc, so configuring glibc # with a fresh cross-compiler works. # Prefer to if __STDC__ is defined, since # exists even on freestanding compilers. # On the NeXT, cc -E runs the code through the compiler's parser, # not just through cpp. "Syntax error" is here to catch this case. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #ifdef __STDC__ # include #else # include #endif Syntax error _ACEOF if ac_fn_c_try_cpp "$LINENO"; then : else # Broken: fails on valid input. continue fi rm -f conftest.err conftest.i conftest.$ac_ext # OK, works on sane cases. Now check whether nonexistent headers # can be detected and how. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if ac_fn_c_try_cpp "$LINENO"; then : # Broken: success on invalid input. continue else # Passes both tests. ac_preproc_ok=: break fi rm -f conftest.err conftest.i conftest.$ac_ext done # Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. rm -f conftest.i conftest.err conftest.$ac_ext if $ac_preproc_ok; then : else { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "C preprocessor \"$CPP\" fails sanity check See \`config.log' for more details" "$LINENO" 5; } fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu { $as_echo "$as_me:${as_lineno-$LINENO}: checking for grep that handles long lines and -e" >&5 $as_echo_n "checking for grep that handles long lines and -e... " >&6; } if ${ac_cv_path_GREP+:} false; then : $as_echo_n "(cached) " >&6 else if test -z "$GREP"; then ac_path_GREP_found=false # Loop through the user's path and test for each of PROGNAME-LIST as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_prog in grep ggrep; do for ac_exec_ext in '' $ac_executable_extensions; do ac_path_GREP="$as_dir/$ac_prog$ac_exec_ext" as_fn_executable_p "$ac_path_GREP" || continue # Check for GNU ac_path_GREP and select it if it is found. # Check for GNU $ac_path_GREP case `"$ac_path_GREP" --version 2>&1` in *GNU*) ac_cv_path_GREP="$ac_path_GREP" ac_path_GREP_found=:;; *) ac_count=0 $as_echo_n 0123456789 >"conftest.in" while : do cat "conftest.in" "conftest.in" >"conftest.tmp" mv "conftest.tmp" "conftest.in" cp "conftest.in" "conftest.nl" $as_echo 'GREP' >> "conftest.nl" "$ac_path_GREP" -e 'GREP$' -e '-(cannot match)-' < "conftest.nl" >"conftest.out" 2>/dev/null || break diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break as_fn_arith $ac_count + 1 && ac_count=$as_val if test $ac_count -gt ${ac_path_GREP_max-0}; then # Best one so far, save it but keep looking for a better one ac_cv_path_GREP="$ac_path_GREP" ac_path_GREP_max=$ac_count fi # 10*(2^10) chars as input seems more than enough test $ac_count -gt 10 && break done rm -f conftest.in conftest.tmp conftest.nl conftest.out;; esac $ac_path_GREP_found && break 3 done done done IFS=$as_save_IFS if test -z "$ac_cv_path_GREP"; then as_fn_error $? "no acceptable grep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5 fi else ac_cv_path_GREP=$GREP fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_GREP" >&5 $as_echo "$ac_cv_path_GREP" >&6; } GREP="$ac_cv_path_GREP" { $as_echo "$as_me:${as_lineno-$LINENO}: checking for egrep" >&5 $as_echo_n "checking for egrep... " >&6; } if ${ac_cv_path_EGREP+:} false; then : $as_echo_n "(cached) " >&6 else if echo a | $GREP -E '(a|b)' >/dev/null 2>&1 then ac_cv_path_EGREP="$GREP -E" else if test -z "$EGREP"; then ac_path_EGREP_found=false # Loop through the user's path and test for each of PROGNAME-LIST as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_prog in egrep; do for ac_exec_ext in '' $ac_executable_extensions; do ac_path_EGREP="$as_dir/$ac_prog$ac_exec_ext" as_fn_executable_p "$ac_path_EGREP" || continue # Check for GNU ac_path_EGREP and select it if it is found. # Check for GNU $ac_path_EGREP case `"$ac_path_EGREP" --version 2>&1` in *GNU*) ac_cv_path_EGREP="$ac_path_EGREP" ac_path_EGREP_found=:;; *) ac_count=0 $as_echo_n 0123456789 >"conftest.in" while : do cat "conftest.in" "conftest.in" >"conftest.tmp" mv "conftest.tmp" "conftest.in" cp "conftest.in" "conftest.nl" $as_echo 'EGREP' >> "conftest.nl" "$ac_path_EGREP" 'EGREP$' < "conftest.nl" >"conftest.out" 2>/dev/null || break diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break as_fn_arith $ac_count + 1 && ac_count=$as_val if test $ac_count -gt ${ac_path_EGREP_max-0}; then # Best one so far, save it but keep looking for a better one ac_cv_path_EGREP="$ac_path_EGREP" ac_path_EGREP_max=$ac_count fi # 10*(2^10) chars as input seems more than enough test $ac_count -gt 10 && break done rm -f conftest.in conftest.tmp conftest.nl conftest.out;; esac $ac_path_EGREP_found && break 3 done done done IFS=$as_save_IFS if test -z "$ac_cv_path_EGREP"; then as_fn_error $? "no acceptable egrep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5 fi else ac_cv_path_EGREP=$EGREP fi fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_EGREP" >&5 $as_echo "$ac_cv_path_EGREP" >&6; } EGREP="$ac_cv_path_EGREP" { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ANSI C header files" >&5 $as_echo_n "checking for ANSI C header files... " >&6; } if ${ac_cv_header_stdc+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include #include #include int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_header_stdc=yes else ac_cv_header_stdc=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext if test $ac_cv_header_stdc = yes; then # SunOS 4.x string.h does not declare mem*, contrary to ANSI. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | $EGREP "memchr" >/dev/null 2>&1; then : else ac_cv_header_stdc=no fi rm -f conftest* fi if test $ac_cv_header_stdc = yes; then # ISC 2.0.2 stdlib.h does not declare free, contrary to ANSI. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | $EGREP "free" >/dev/null 2>&1; then : else ac_cv_header_stdc=no fi rm -f conftest* fi if test $ac_cv_header_stdc = yes; then # /bin/cc in Irix-4.0.5 gets non-ANSI ctype macros unless using -ansi. if test "$cross_compiling" = yes; then : : else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include #if ((' ' & 0x0FF) == 0x020) # define ISLOWER(c) ('a' <= (c) && (c) <= 'z') # define TOUPPER(c) (ISLOWER(c) ? 'A' + ((c) - 'a') : (c)) #else # define ISLOWER(c) \ (('a' <= (c) && (c) <= 'i') \ || ('j' <= (c) && (c) <= 'r') \ || ('s' <= (c) && (c) <= 'z')) # define TOUPPER(c) (ISLOWER(c) ? ((c) | 0x40) : (c)) #endif #define XOR(e, f) (((e) && !(f)) || (!(e) && (f))) int main () { int i; for (i = 0; i < 256; i++) if (XOR (islower (i), ISLOWER (i)) || toupper (i) != TOUPPER (i)) return 2; return 0; } _ACEOF if ac_fn_c_try_run "$LINENO"; then : else ac_cv_header_stdc=no fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_header_stdc" >&5 $as_echo "$ac_cv_header_stdc" >&6; } if test $ac_cv_header_stdc = yes; then $as_echo "#define STDC_HEADERS 1" >>confdefs.h fi # On IRIX 5.3, sys/types and inttypes.h are conflicting. for ac_header in sys/types.h sys/stat.h stdlib.h string.h memory.h strings.h \ inttypes.h stdint.h unistd.h do : as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` ac_fn_c_check_header_compile "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default " if eval test \"x\$"$as_ac_Header"\" = x"yes"; then : cat >>confdefs.h <<_ACEOF #define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 _ACEOF fi done ac_fn_c_check_header_mongrel "$LINENO" "minix/config.h" "ac_cv_header_minix_config_h" "$ac_includes_default" if test "x$ac_cv_header_minix_config_h" = xyes; then : MINIX=yes else MINIX= fi if test "$MINIX" = yes; then $as_echo "#define _POSIX_SOURCE 1" >>confdefs.h $as_echo "#define _POSIX_1_SOURCE 2" >>confdefs.h $as_echo "#define _MINIX 1" >>confdefs.h fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether it is safe to define __EXTENSIONS__" >&5 $as_echo_n "checking whether it is safe to define __EXTENSIONS__... " >&6; } if ${ac_cv_safe_to_define___extensions__+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ # define __EXTENSIONS__ 1 $ac_includes_default int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_safe_to_define___extensions__=yes else ac_cv_safe_to_define___extensions__=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_safe_to_define___extensions__" >&5 $as_echo "$ac_cv_safe_to_define___extensions__" >&6; } test $ac_cv_safe_to_define___extensions__ = yes && $as_echo "#define __EXTENSIONS__ 1" >>confdefs.h $as_echo "#define _ALL_SOURCE 1" >>confdefs.h $as_echo "#define _GNU_SOURCE 1" >>confdefs.h $as_echo "#define _POSIX_PTHREAD_SEMANTICS 1" >>confdefs.h $as_echo "#define _TANDEM_SOURCE 1" >>confdefs.h ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}gcc", so it can be a program name with args. set dummy ${ac_tool_prefix}gcc; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_CC="${ac_tool_prefix}gcc" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_CC"; then ac_ct_CC=$CC # Extract the first word of "gcc", so it can be a program name with args. set dummy gcc; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_CC"; then ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_CC="gcc" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_CC=$ac_cv_prog_ac_ct_CC if test -n "$ac_ct_CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 $as_echo "$ac_ct_CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_CC" = x; then CC="" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac CC=$ac_ct_CC fi else CC="$ac_cv_prog_CC" fi if test -z "$CC"; then if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}cc", so it can be a program name with args. set dummy ${ac_tool_prefix}cc; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_CC="${ac_tool_prefix}cc" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi fi if test -z "$CC"; then # Extract the first word of "cc", so it can be a program name with args. set dummy cc; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else ac_prog_rejected=no as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then if test "$as_dir/$ac_word$ac_exec_ext" = "/usr/ucb/cc"; then ac_prog_rejected=yes continue fi ac_cv_prog_CC="cc" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS if test $ac_prog_rejected = yes; then # We found a bogon in the path, so make sure we never use it. set dummy $ac_cv_prog_CC shift if test $# != 0; then # We chose a different compiler from the bogus one. # However, it has the same basename, so the bogon will be chosen # first if we set CC to just the basename; use the full file name. shift ac_cv_prog_CC="$as_dir/$ac_word${1+' '}$@" fi fi fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$CC"; then if test -n "$ac_tool_prefix"; then for ac_prog in cl.exe do # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. set dummy $ac_tool_prefix$ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_CC="$ac_tool_prefix$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$CC" && break done fi if test -z "$CC"; then ac_ct_CC=$CC for ac_prog in cl.exe do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_CC"; then ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_CC="$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_CC=$ac_cv_prog_ac_ct_CC if test -n "$ac_ct_CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 $as_echo "$ac_ct_CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$ac_ct_CC" && break done if test "x$ac_ct_CC" = x; then CC="" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac CC=$ac_ct_CC fi fi fi test -z "$CC" && { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "no acceptable C compiler found in \$PATH See \`config.log' for more details" "$LINENO" 5; } # Provide some information about the compiler. $as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler version" >&5 set X $ac_compile ac_compiler=$2 for ac_option in --version -v -V -qversion; do { { ac_try="$ac_compiler $ac_option >&5" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_compiler $ac_option >&5") 2>conftest.err ac_status=$? if test -s conftest.err; then sed '10a\ ... rest of stderr output deleted ... 10q' conftest.err >conftest.er1 cat conftest.er1 >&5 fi rm -f conftest.er1 conftest.err $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } done { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are using the GNU C compiler" >&5 $as_echo_n "checking whether we are using the GNU C compiler... " >&6; } if ${ac_cv_c_compiler_gnu+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { #ifndef __GNUC__ choke me #endif ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_compiler_gnu=yes else ac_compiler_gnu=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_cv_c_compiler_gnu=$ac_compiler_gnu fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_compiler_gnu" >&5 $as_echo "$ac_cv_c_compiler_gnu" >&6; } if test $ac_compiler_gnu = yes; then GCC=yes else GCC= fi ac_test_CFLAGS=${CFLAGS+set} ac_save_CFLAGS=$CFLAGS { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC accepts -g" >&5 $as_echo_n "checking whether $CC accepts -g... " >&6; } if ${ac_cv_prog_cc_g+:} false; then : $as_echo_n "(cached) " >&6 else ac_save_c_werror_flag=$ac_c_werror_flag ac_c_werror_flag=yes ac_cv_prog_cc_g=no CFLAGS="-g" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_prog_cc_g=yes else CFLAGS="" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : else ac_c_werror_flag=$ac_save_c_werror_flag CFLAGS="-g" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_prog_cc_g=yes fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_c_werror_flag=$ac_save_c_werror_flag fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_g" >&5 $as_echo "$ac_cv_prog_cc_g" >&6; } if test "$ac_test_CFLAGS" = set; then CFLAGS=$ac_save_CFLAGS elif test $ac_cv_prog_cc_g = yes; then if test "$GCC" = yes; then CFLAGS="-g -O2" else CFLAGS="-g" fi else if test "$GCC" = yes; then CFLAGS="-O2" else CFLAGS= fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $CC option to accept ISO C89" >&5 $as_echo_n "checking for $CC option to accept ISO C89... " >&6; } if ${ac_cv_prog_cc_c89+:} false; then : $as_echo_n "(cached) " >&6 else ac_cv_prog_cc_c89=no ac_save_CC=$CC cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include struct stat; /* Most of the following tests are stolen from RCS 5.7's src/conf.sh. */ struct buf { int x; }; FILE * (*rcsopen) (struct buf *, struct stat *, int); static char *e (p, i) char **p; int i; { return p[i]; } static char *f (char * (*g) (char **, int), char **p, ...) { char *s; va_list v; va_start (v,p); s = g (p, va_arg (v,int)); va_end (v); return s; } /* OSF 4.0 Compaq cc is some sort of almost-ANSI by default. It has function prototypes and stuff, but not '\xHH' hex character constants. These don't provoke an error unfortunately, instead are silently treated as 'x'. The following induces an error, until -std is added to get proper ANSI mode. Curiously '\x00'!='x' always comes out true, for an array size at least. It's necessary to write '\x00'==0 to get something that's true only with -std. */ int osf4_cc_array ['\x00' == 0 ? 1 : -1]; /* IBM C 6 for AIX is almost-ANSI by default, but it replaces macro parameters inside strings and character constants. */ #define FOO(x) 'x' int xlc6_cc_array[FOO(a) == 'x' ? 1 : -1]; int test (int i, double x); struct s1 {int (*f) (int a);}; struct s2 {int (*f) (double a);}; int pairnames (int, char **, FILE *(*)(struct buf *, struct stat *, int), int, int); int argc; char **argv; int main () { return f (e, argv, 0) != argv[0] || f (e, argv, 1) != argv[1]; ; return 0; } _ACEOF for ac_arg in '' -qlanglvl=extc89 -qlanglvl=ansi -std \ -Ae "-Aa -D_HPUX_SOURCE" "-Xc -D__EXTENSIONS__" do CC="$ac_save_CC $ac_arg" if ac_fn_c_try_compile "$LINENO"; then : ac_cv_prog_cc_c89=$ac_arg fi rm -f core conftest.err conftest.$ac_objext test "x$ac_cv_prog_cc_c89" != "xno" && break done rm -f conftest.$ac_ext CC=$ac_save_CC fi # AC_CACHE_VAL case "x$ac_cv_prog_cc_c89" in x) { $as_echo "$as_me:${as_lineno-$LINENO}: result: none needed" >&5 $as_echo "none needed" >&6; } ;; xno) { $as_echo "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5 $as_echo "unsupported" >&6; } ;; *) CC="$CC $ac_cv_prog_cc_c89" { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c89" >&5 $as_echo "$ac_cv_prog_cc_c89" >&6; } ;; esac if test "x$ac_cv_prog_cc_c89" != xno; then : fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC understands -c and -o together" >&5 $as_echo_n "checking whether $CC understands -c and -o together... " >&6; } if ${am_cv_prog_cc_c_o+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF # Make sure it works both with $CC and with simple cc. # Following AC_PROG_CC_C_O, we do the test twice because some # compilers refuse to overwrite an existing .o file with -o, # though they will create one. am_cv_prog_cc_c_o=yes for am_i in 1 2; do if { echo "$as_me:$LINENO: $CC -c conftest.$ac_ext -o conftest2.$ac_objext" >&5 ($CC -c conftest.$ac_ext -o conftest2.$ac_objext) >&5 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } \ && test -f conftest2.$ac_objext; then : OK else am_cv_prog_cc_c_o=no break fi done rm -f core conftest* unset am_i fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_prog_cc_c_o" >&5 $as_echo "$am_cv_prog_cc_c_o" >&6; } if test "$am_cv_prog_cc_c_o" != yes; then # Losing compiler, so override with the script. # FIXME: It is wrong to rewrite CC. # But if we don't then we get into trouble of one sort or another. # A longer-term fix would be to have automake use am__CC in this case, # and then we could set am__CC="\$(top_srcdir)/compile \$(CC)" CC="$am_aux_dir/compile $CC" fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ${MAKE-make} sets \$(MAKE)" >&5 $as_echo_n "checking whether ${MAKE-make} sets \$(MAKE)... " >&6; } set x ${MAKE-make} ac_make=`$as_echo "$2" | sed 's/+/p/g; s/[^a-zA-Z0-9_]/_/g'` if eval \${ac_cv_prog_make_${ac_make}_set+:} false; then : $as_echo_n "(cached) " >&6 else cat >conftest.make <<\_ACEOF SHELL = /bin/sh all: @echo '@@@%%%=$(MAKE)=@@@%%%' _ACEOF # GNU make sometimes prints "make[1]: Entering ...", which would confuse us. case `${MAKE-make} -f conftest.make 2>/dev/null` in *@@@%%%=?*=@@@%%%*) eval ac_cv_prog_make_${ac_make}_set=yes;; *) eval ac_cv_prog_make_${ac_make}_set=no;; esac rm -f conftest.make fi if eval test \$ac_cv_prog_make_${ac_make}_set = yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } SET_MAKE= else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } SET_MAKE="MAKE=${MAKE-make}" fi if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}ranlib", so it can be a program name with args. set dummy ${ac_tool_prefix}ranlib; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_RANLIB+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$RANLIB"; then ac_cv_prog_RANLIB="$RANLIB" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_RANLIB="${ac_tool_prefix}ranlib" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi RANLIB=$ac_cv_prog_RANLIB if test -n "$RANLIB"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $RANLIB" >&5 $as_echo "$RANLIB" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_RANLIB"; then ac_ct_RANLIB=$RANLIB # Extract the first word of "ranlib", so it can be a program name with args. set dummy ranlib; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_RANLIB+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_RANLIB"; then ac_cv_prog_ac_ct_RANLIB="$ac_ct_RANLIB" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_RANLIB="ranlib" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_RANLIB=$ac_cv_prog_ac_ct_RANLIB if test -n "$ac_ct_RANLIB"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_RANLIB" >&5 $as_echo "$ac_ct_RANLIB" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_RANLIB" = x; then RANLIB=":" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac RANLIB=$ac_ct_RANLIB fi else RANLIB="$ac_cv_prog_RANLIB" fi # Check whether --enable-largefile was given. if test "${enable_largefile+set}" = set; then : enableval=$enable_largefile; fi if test "$enable_largefile" != no; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for special C compiler options needed for large files" >&5 $as_echo_n "checking for special C compiler options needed for large files... " >&6; } if ${ac_cv_sys_largefile_CC+:} false; then : $as_echo_n "(cached) " >&6 else ac_cv_sys_largefile_CC=no if test "$GCC" != yes; then ac_save_CC=$CC while :; do # IRIX 6.2 and later do not support large files by default, # so use the C compiler's -n32 option if that helps. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include /* Check that off_t can represent 2**63 - 1 correctly. We can't simply define LARGE_OFF_T to be 9223372036854775807, since some C++ compilers masquerading as C compilers incorrectly reject 9223372036854775807. */ #define LARGE_OFF_T ((((off_t) 1 << 31) << 31) - 1 + (((off_t) 1 << 31) << 31)) int off_t_is_large[(LARGE_OFF_T % 2147483629 == 721 && LARGE_OFF_T % 2147483647 == 1) ? 1 : -1]; int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : break fi rm -f core conftest.err conftest.$ac_objext CC="$CC -n32" if ac_fn_c_try_compile "$LINENO"; then : ac_cv_sys_largefile_CC=' -n32'; break fi rm -f core conftest.err conftest.$ac_objext break done CC=$ac_save_CC rm -f conftest.$ac_ext fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sys_largefile_CC" >&5 $as_echo "$ac_cv_sys_largefile_CC" >&6; } if test "$ac_cv_sys_largefile_CC" != no; then CC=$CC$ac_cv_sys_largefile_CC fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for _FILE_OFFSET_BITS value needed for large files" >&5 $as_echo_n "checking for _FILE_OFFSET_BITS value needed for large files... " >&6; } if ${ac_cv_sys_file_offset_bits+:} false; then : $as_echo_n "(cached) " >&6 else while :; do cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include /* Check that off_t can represent 2**63 - 1 correctly. We can't simply define LARGE_OFF_T to be 9223372036854775807, since some C++ compilers masquerading as C compilers incorrectly reject 9223372036854775807. */ #define LARGE_OFF_T ((((off_t) 1 << 31) << 31) - 1 + (((off_t) 1 << 31) << 31)) int off_t_is_large[(LARGE_OFF_T % 2147483629 == 721 && LARGE_OFF_T % 2147483647 == 1) ? 1 : -1]; int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_sys_file_offset_bits=no; break fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #define _FILE_OFFSET_BITS 64 #include /* Check that off_t can represent 2**63 - 1 correctly. We can't simply define LARGE_OFF_T to be 9223372036854775807, since some C++ compilers masquerading as C compilers incorrectly reject 9223372036854775807. */ #define LARGE_OFF_T ((((off_t) 1 << 31) << 31) - 1 + (((off_t) 1 << 31) << 31)) int off_t_is_large[(LARGE_OFF_T % 2147483629 == 721 && LARGE_OFF_T % 2147483647 == 1) ? 1 : -1]; int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_sys_file_offset_bits=64; break fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_cv_sys_file_offset_bits=unknown break done fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sys_file_offset_bits" >&5 $as_echo "$ac_cv_sys_file_offset_bits" >&6; } case $ac_cv_sys_file_offset_bits in #( no | unknown) ;; *) cat >>confdefs.h <<_ACEOF #define _FILE_OFFSET_BITS $ac_cv_sys_file_offset_bits _ACEOF ;; esac rm -rf conftest* if test $ac_cv_sys_file_offset_bits = unknown; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for _LARGE_FILES value needed for large files" >&5 $as_echo_n "checking for _LARGE_FILES value needed for large files... " >&6; } if ${ac_cv_sys_large_files+:} false; then : $as_echo_n "(cached) " >&6 else while :; do cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include /* Check that off_t can represent 2**63 - 1 correctly. We can't simply define LARGE_OFF_T to be 9223372036854775807, since some C++ compilers masquerading as C compilers incorrectly reject 9223372036854775807. */ #define LARGE_OFF_T ((((off_t) 1 << 31) << 31) - 1 + (((off_t) 1 << 31) << 31)) int off_t_is_large[(LARGE_OFF_T % 2147483629 == 721 && LARGE_OFF_T % 2147483647 == 1) ? 1 : -1]; int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_sys_large_files=no; break fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #define _LARGE_FILES 1 #include /* Check that off_t can represent 2**63 - 1 correctly. We can't simply define LARGE_OFF_T to be 9223372036854775807, since some C++ compilers masquerading as C compilers incorrectly reject 9223372036854775807. */ #define LARGE_OFF_T ((((off_t) 1 << 31) << 31) - 1 + (((off_t) 1 << 31) << 31)) int off_t_is_large[(LARGE_OFF_T % 2147483629 == 721 && LARGE_OFF_T % 2147483647 == 1) ? 1 : -1]; int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_sys_large_files=1; break fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_cv_sys_large_files=unknown break done fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sys_large_files" >&5 $as_echo "$ac_cv_sys_large_files" >&6; } case $ac_cv_sys_large_files in #( no | unknown) ;; *) cat >>confdefs.h <<_ACEOF #define _LARGE_FILES $ac_cv_sys_large_files _ACEOF ;; esac rm -rf conftest* fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for library containing nanosleep" >&5 $as_echo_n "checking for library containing nanosleep... " >&6; } if ${ac_cv_search_nanosleep+:} false; then : $as_echo_n "(cached) " >&6 else ac_func_search_save_LIBS=$LIBS cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char nanosleep (); int main () { return nanosleep (); ; return 0; } _ACEOF for ac_lib in '' posix; do if test -z "$ac_lib"; then ac_res="none required" else ac_res=-l$ac_lib LIBS="-l$ac_lib $ac_func_search_save_LIBS" fi if ac_fn_c_try_link "$LINENO"; then : ac_cv_search_nanosleep=$ac_res fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext if ${ac_cv_search_nanosleep+:} false; then : break fi done if ${ac_cv_search_nanosleep+:} false; then : else ac_cv_search_nanosleep=no fi rm conftest.$ac_ext LIBS=$ac_func_search_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_search_nanosleep" >&5 $as_echo "$ac_cv_search_nanosleep" >&6; } ac_res=$ac_cv_search_nanosleep if test "$ac_res" != no; then : test "$ac_res" = "none required" || LIBS="$ac_res $LIBS" $as_echo "#define HAVE_NANOSLEEP 1" >>confdefs.h else $as_echo "#define HAVE_NANOSLEEP 0" >>confdefs.h fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for library containing tcgetattr" >&5 $as_echo_n "checking for library containing tcgetattr... " >&6; } if ${ac_cv_search_tcgetattr+:} false; then : $as_echo_n "(cached) " >&6 else ac_func_search_save_LIBS=$LIBS cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char tcgetattr (); int main () { return tcgetattr (); ; return 0; } _ACEOF for ac_lib in '' termios; do if test -z "$ac_lib"; then ac_res="none required" else ac_res=-l$ac_lib LIBS="-l$ac_lib $ac_func_search_save_LIBS" fi if ac_fn_c_try_link "$LINENO"; then : ac_cv_search_tcgetattr=$ac_res fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext if ${ac_cv_search_tcgetattr+:} false; then : break fi done if ${ac_cv_search_tcgetattr+:} false; then : else ac_cv_search_tcgetattr=no fi rm conftest.$ac_ext LIBS=$ac_func_search_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_search_tcgetattr" >&5 $as_echo "$ac_cv_search_tcgetattr" >&6; } ac_res=$ac_cv_search_tcgetattr if test "$ac_res" != no; then : test "$ac_res" = "none required" || LIBS="$ac_res $LIBS" $as_echo "#define HAVE_TERMIOS 1" >>confdefs.h else $as_echo "#define HAVE_TERMIOS 0" >>confdefs.h fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ANSI C header files" >&5 $as_echo_n "checking for ANSI C header files... " >&6; } if ${ac_cv_header_stdc+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include #include #include int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_header_stdc=yes else ac_cv_header_stdc=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext if test $ac_cv_header_stdc = yes; then # SunOS 4.x string.h does not declare mem*, contrary to ANSI. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | $EGREP "memchr" >/dev/null 2>&1; then : else ac_cv_header_stdc=no fi rm -f conftest* fi if test $ac_cv_header_stdc = yes; then # ISC 2.0.2 stdlib.h does not declare free, contrary to ANSI. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | $EGREP "free" >/dev/null 2>&1; then : else ac_cv_header_stdc=no fi rm -f conftest* fi if test $ac_cv_header_stdc = yes; then # /bin/cc in Irix-4.0.5 gets non-ANSI ctype macros unless using -ansi. if test "$cross_compiling" = yes; then : : else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include #if ((' ' & 0x0FF) == 0x020) # define ISLOWER(c) ('a' <= (c) && (c) <= 'z') # define TOUPPER(c) (ISLOWER(c) ? 'A' + ((c) - 'a') : (c)) #else # define ISLOWER(c) \ (('a' <= (c) && (c) <= 'i') \ || ('j' <= (c) && (c) <= 'r') \ || ('s' <= (c) && (c) <= 'z')) # define TOUPPER(c) (ISLOWER(c) ? ((c) | 0x40) : (c)) #endif #define XOR(e, f) (((e) && !(f)) || (!(e) && (f))) int main () { int i; for (i = 0; i < 256; i++) if (XOR (islower (i), ISLOWER (i)) || toupper (i) != TOUPPER (i)) return 2; return 0; } _ACEOF if ac_fn_c_try_run "$LINENO"; then : else ac_cv_header_stdc=no fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_header_stdc" >&5 $as_echo "$ac_cv_header_stdc" >&6; } if test $ac_cv_header_stdc = yes; then $as_echo "#define STDC_HEADERS 1" >>confdefs.h fi for ac_header in errno.h getopt.h mntent.h linux/fs.h linux/loop.h do : as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` ac_fn_c_check_header_mongrel "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default" if eval test \"x\$"$as_ac_Header"\" = x"yes"; then : cat >>confdefs.h <<_ACEOF #define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 _ACEOF fi done for ac_func in ioctl memset mknod open strncpy syslog do : as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh` ac_fn_c_check_func "$LINENO" "$ac_func" "$as_ac_var" if eval test \"x\$"$as_ac_var"\" = x"yes"; then : cat >>confdefs.h <<_ACEOF #define `$as_echo "HAVE_$ac_func" | $as_tr_cpp` 1 _ACEOF fi done { $as_echo "$as_me:${as_lineno-$LINENO}: checking for library containing log" >&5 $as_echo_n "checking for library containing log... " >&6; } if ${ac_cv_search_log+:} false; then : $as_echo_n "(cached) " >&6 else ac_func_search_save_LIBS=$LIBS cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char log (); int main () { return log (); ; return 0; } _ACEOF for ac_lib in '' m; do if test -z "$ac_lib"; then ac_res="none required" else ac_res=-l$ac_lib LIBS="-l$ac_lib $ac_func_search_save_LIBS" fi if ac_fn_c_try_link "$LINENO"; then : ac_cv_search_log=$ac_res fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext if ${ac_cv_search_log+:} false; then : break fi done if ${ac_cv_search_log+:} false; then : else ac_cv_search_log=no fi rm conftest.$ac_ext LIBS=$ac_func_search_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_search_log" >&5 $as_echo "$ac_cv_search_log" >&6; } ac_res=$ac_cv_search_log if test "$ac_res" != no; then : test "$ac_res" = "none required" || LIBS="$ac_res $LIBS" fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for an ANSI C-conforming const" >&5 $as_echo_n "checking for an ANSI C-conforming const... " >&6; } if ${ac_cv_c_const+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { #ifndef __cplusplus /* Ultrix mips cc rejects this sort of thing. */ typedef int charset[2]; const charset cs = { 0, 0 }; /* SunOS 4.1.1 cc rejects this. */ char const *const *pcpcc; char **ppc; /* NEC SVR4.0.2 mips cc rejects this. */ struct point {int x, y;}; static struct point const zero = {0,0}; /* AIX XL C 1.02.0.0 rejects this. It does not let you subtract one const X* pointer from another in an arm of an if-expression whose if-part is not a constant expression */ const char *g = "string"; pcpcc = &g + (g ? g-g : 0); /* HPUX 7.0 cc rejects these. */ ++pcpcc; ppc = (char**) pcpcc; pcpcc = (char const *const *) ppc; { /* SCO 3.2v4 cc rejects this sort of thing. */ char tx; char *t = &tx; char const *s = 0 ? (char *) 0 : (char const *) 0; *t++ = 0; if (s) return 0; } { /* Someone thinks the Sun supposedly-ANSI compiler will reject this. */ int x[] = {25, 17}; const int *foo = &x[0]; ++foo; } { /* Sun SC1.0 ANSI compiler rejects this -- but not the above. */ typedef const int *iptr; iptr p = 0; ++p; } { /* AIX XL C 1.02.0.0 rejects this sort of thing, saying "k.c", line 2.27: 1506-025 (S) Operand must be a modifiable lvalue. */ struct s { int j; const int *ap[3]; } bx; struct s *b = &bx; b->j = 5; } { /* ULTRIX-32 V3.1 (Rev 9) vcc rejects this */ const int foo = 10; if (!foo) return 0; } return !cs[0] && !zero.x; #endif ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_c_const=yes else ac_cv_c_const=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_const" >&5 $as_echo "$ac_cv_c_const" >&6; } if test $ac_cv_c_const = no; then $as_echo "#define const /**/" >>confdefs.h fi if test -d /run; then default_sysrundir="/run"; else default_sysrundir="/var/run"; fi # Check whether --with-sysrundir was given. if test "${with_sysrundir+set}" = set; then : withval=$with_sysrundir; sysrundir="${withval}" else sysrundir="${default_sysrundir}" fi if test "x${sysrundir}" = "xyes" -o "x${sysrundir}" = "xno"; then CM_SYSRUN_DIR="${default_sysrundir}" else CM_SYSRUN_DIR="${sysrundir}" fi ac_fn_c_check_header_mongrel "$LINENO" "libdevmapper.h" "ac_cv_header_libdevmapper_h" "$ac_includes_default" if test "x$ac_cv_header_libdevmapper_h" = xyes; then : $as_echo "#define HAVE_LIBDEVMAP 1" >>confdefs.h else as_fn_error $? "libdevmapper-devel package is needed to build cryptmount" "$LINENO" 5 fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for library containing dm_task_create" >&5 $as_echo_n "checking for library containing dm_task_create... " >&6; } if ${ac_cv_search_dm_task_create+:} false; then : $as_echo_n "(cached) " >&6 else ac_func_search_save_LIBS=$LIBS cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char dm_task_create (); int main () { return dm_task_create (); ; return 0; } _ACEOF for ac_lib in '' devmapper; do if test -z "$ac_lib"; then ac_res="none required" else ac_res=-l$ac_lib LIBS="-l$ac_lib $ac_func_search_save_LIBS" fi if ac_fn_c_try_link "$LINENO"; then : ac_cv_search_dm_task_create=$ac_res fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext if ${ac_cv_search_dm_task_create+:} false; then : break fi done if ${ac_cv_search_dm_task_create+:} false; then : else ac_cv_search_dm_task_create=no fi rm conftest.$ac_ext LIBS=$ac_func_search_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_search_dm_task_create" >&5 $as_echo "$ac_cv_search_dm_task_create" >&6; } ac_res=$ac_cv_search_dm_task_create if test "$ac_res" != no; then : test "$ac_res" = "none required" || LIBS="$ac_res $LIBS" else as_fn_error $? "libdevmapper package is needed to build cryptmount" "$LINENO" 5 fi ac_fn_c_check_decl "$LINENO" "dm_task_secure_data" "ac_cv_have_decl_dm_task_secure_data" "#include " if test "x$ac_cv_have_decl_dm_task_secure_data" = xyes; then : ac_have_decl=1 else ac_have_decl=0 fi cat >>confdefs.h <<_ACEOF #define HAVE_DECL_DM_TASK_SECURE_DATA $ac_have_decl _ACEOF ac_fn_c_check_header_mongrel "$LINENO" "gcrypt.h" "ac_cv_header_gcrypt_h" "$ac_includes_default" if test "x$ac_cv_header_gcrypt_h" = xyes; then : dfltGCRY="yes" else dfltGCRY="no" fi # Check whether --with-libgcrypt was given. if test "${with_libgcrypt+set}" = set; then : withval=$with_libgcrypt; libgcrypt="${withval}" else libgcrypt="${dfltGCRY}" fi if test "x${libgcrypt}" = "xyes"; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for library containing gcry_cipher_open" >&5 $as_echo_n "checking for library containing gcry_cipher_open... " >&6; } if ${ac_cv_search_gcry_cipher_open+:} false; then : $as_echo_n "(cached) " >&6 else ac_func_search_save_LIBS=$LIBS cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char gcry_cipher_open (); int main () { return gcry_cipher_open (); ; return 0; } _ACEOF for ac_lib in '' gcrypt; do if test -z "$ac_lib"; then ac_res="none required" else ac_res=-l$ac_lib LIBS="-l$ac_lib $ac_func_search_save_LIBS" fi if ac_fn_c_try_link "$LINENO"; then : ac_cv_search_gcry_cipher_open=$ac_res fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext if ${ac_cv_search_gcry_cipher_open+:} false; then : break fi done if ${ac_cv_search_gcry_cipher_open+:} false; then : else ac_cv_search_gcry_cipher_open=no fi rm conftest.$ac_ext LIBS=$ac_func_search_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_search_gcry_cipher_open" >&5 $as_echo "$ac_cv_search_gcry_cipher_open" >&6; } ac_res=$ac_cv_search_gcry_cipher_open if test "$ac_res" != no; then : test "$ac_res" = "none required" || LIBS="$ac_res $LIBS" $as_echo "#define HAVE_LIBGCRYPT 1" >>confdefs.h else as_fn_error $? "cannot find libgcrypt libraries" "$LINENO" 5 fi else $as_echo "#define HAVE_LIBGCRYPT 0" >>confdefs.h fi # Check whether --enable-openssl-compat was given. if test "${enable_openssl_compat+set}" = set; then : enableval=$enable_openssl_compat; sslcompat="${enableval}" else sslcompat="yes" fi if test "x${sslcompat}" = "xyes"; then $as_echo "#define USE_GCRYOSSL 1" >>confdefs.h else $as_echo "#define USE_GCRYOSSL 0" >>confdefs.h fi # Check whether --enable-libudev was given. if test "${enable_libudev+set}" = set; then : enableval=$enable_libudev; use_libudev="${enableval}" else use_libudev="no" fi if test "x${use_libudev}" = "xyes"; then ac_fn_c_check_header_mongrel "$LINENO" "libudev.h" "ac_cv_header_libudev_h" "$ac_includes_default" if test "x$ac_cv_header_libudev_h" = xyes; then : { $as_echo "$as_me:${as_lineno-$LINENO}: checking for library containing udev_queue_get_queue_is_empty" >&5 $as_echo_n "checking for library containing udev_queue_get_queue_is_empty... " >&6; } if ${ac_cv_search_udev_queue_get_queue_is_empty+:} false; then : $as_echo_n "(cached) " >&6 else ac_func_search_save_LIBS=$LIBS cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char udev_queue_get_queue_is_empty (); int main () { return udev_queue_get_queue_is_empty (); ; return 0; } _ACEOF for ac_lib in '' udev; do if test -z "$ac_lib"; then ac_res="none required" else ac_res=-l$ac_lib LIBS="-l$ac_lib $ac_func_search_save_LIBS" fi if ac_fn_c_try_link "$LINENO"; then : ac_cv_search_udev_queue_get_queue_is_empty=$ac_res fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext if ${ac_cv_search_udev_queue_get_queue_is_empty+:} false; then : break fi done if ${ac_cv_search_udev_queue_get_queue_is_empty+:} false; then : else ac_cv_search_udev_queue_get_queue_is_empty=no fi rm conftest.$ac_ext LIBS=$ac_func_search_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_search_udev_queue_get_queue_is_empty" >&5 $as_echo "$ac_cv_search_udev_queue_get_queue_is_empty" >&6; } ac_res=$ac_cv_search_udev_queue_get_queue_is_empty if test "$ac_res" != no; then : test "$ac_res" = "none required" || LIBS="$ac_res $LIBS" udevlib="yes" else udevlib="no" fi else udevlib="no" fi else udevlib="no" fi if test "x${udevlib}" = "xyes"; then $as_echo "#define HAVE_LIBUDEV 1" >>confdefs.h fi if test "x$ac_cv_env_PKG_CONFIG_set" != "xset"; then if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}pkg-config", so it can be a program name with args. set dummy ${ac_tool_prefix}pkg-config; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_path_PKG_CONFIG+:} false; then : $as_echo_n "(cached) " >&6 else case $PKG_CONFIG in [\\/]* | ?:[\\/]*) ac_cv_path_PKG_CONFIG="$PKG_CONFIG" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_path_PKG_CONFIG="$as_dir/$ac_word$ac_exec_ext" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS ;; esac fi PKG_CONFIG=$ac_cv_path_PKG_CONFIG if test -n "$PKG_CONFIG"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $PKG_CONFIG" >&5 $as_echo "$PKG_CONFIG" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_path_PKG_CONFIG"; then ac_pt_PKG_CONFIG=$PKG_CONFIG # Extract the first word of "pkg-config", so it can be a program name with args. set dummy pkg-config; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_path_ac_pt_PKG_CONFIG+:} false; then : $as_echo_n "(cached) " >&6 else case $ac_pt_PKG_CONFIG in [\\/]* | ?:[\\/]*) ac_cv_path_ac_pt_PKG_CONFIG="$ac_pt_PKG_CONFIG" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_path_ac_pt_PKG_CONFIG="$as_dir/$ac_word$ac_exec_ext" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS ;; esac fi ac_pt_PKG_CONFIG=$ac_cv_path_ac_pt_PKG_CONFIG if test -n "$ac_pt_PKG_CONFIG"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_pt_PKG_CONFIG" >&5 $as_echo "$ac_pt_PKG_CONFIG" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_pt_PKG_CONFIG" = x; then PKG_CONFIG="" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac PKG_CONFIG=$ac_pt_PKG_CONFIG fi else PKG_CONFIG="$ac_cv_path_PKG_CONFIG" fi fi if test -n "$PKG_CONFIG"; then _pkg_min_version=0.9.0 { $as_echo "$as_me:${as_lineno-$LINENO}: checking pkg-config is at least version $_pkg_min_version" >&5 $as_echo_n "checking pkg-config is at least version $_pkg_min_version... " >&6; } if $PKG_CONFIG --atleast-pkgconfig-version $_pkg_min_version; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } PKG_CONFIG="" fi fi pkg_failed=no { $as_echo "$as_me:${as_lineno-$LINENO}: checking for libcryptsetup" >&5 $as_echo_n "checking for libcryptsetup... " >&6; } if test -n "$libcryptsetup_CFLAGS"; then pkg_cv_libcryptsetup_CFLAGS="$libcryptsetup_CFLAGS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"libcryptsetup >= 1.4\""; } >&5 ($PKG_CONFIG --exists --print-errors "libcryptsetup >= 1.4") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_libcryptsetup_CFLAGS=`$PKG_CONFIG --cflags "libcryptsetup >= 1.4" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test -n "$libcryptsetup_LIBS"; then pkg_cv_libcryptsetup_LIBS="$libcryptsetup_LIBS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"libcryptsetup >= 1.4\""; } >&5 ($PKG_CONFIG --exists --print-errors "libcryptsetup >= 1.4") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_libcryptsetup_LIBS=`$PKG_CONFIG --libs "libcryptsetup >= 1.4" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test $pkg_failed = yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then _pkg_short_errors_supported=yes else _pkg_short_errors_supported=no fi if test $_pkg_short_errors_supported = yes; then libcryptsetup_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "libcryptsetup >= 1.4" 2>&1` else libcryptsetup_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "libcryptsetup >= 1.4" 2>&1` fi # Put the nasty error message in config.log where it belongs echo "$libcryptsetup_PKG_ERRORS" >&5 libcs="no" elif test $pkg_failed = untried; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } libcs="no" else libcryptsetup_CFLAGS=$pkg_cv_libcryptsetup_CFLAGS libcryptsetup_LIBS=$pkg_cv_libcryptsetup_LIBS { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } libcs="yes" fi if test "x${libcs}" = "xyes"; then $as_echo "#define HAVE_LIBCRYPTSETUP 1" >>confdefs.h fi # Check whether --enable-luks was given. if test "${enable_luks+set}" = set; then : enableval=$enable_luks; use_lukscompat="${enableval}" else use_lukscompat="${libgcrypt}" fi if test "x${use_lukscompat}" = "xyes" \ -a \( "x${libgcrypt}" != "xyes" -o "x${libcs}" != "xyes" \); then { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: LUKS support requires libcryptsetup and libgcrypt libraries" >&5 $as_echo "$as_me: WARNING: LUKS support requires libcryptsetup and libgcrypt libraries" >&2;} use_lukscompat="no" fi if test "x${use_lukscompat}" = "xyes"; then $as_echo "#define USE_LUKSCOMPAT 1" >>confdefs.h LIBS="${LIBS} ${libcryptsetup_LIBS}" CPPFLAGS="${CPPFLAGS} ${libcryptsetup_CFLAGS}" { $as_echo "$as_me:${as_lineno-$LINENO}: checking for library containing crypt_keyslot_change_by_passphrase" >&5 $as_echo_n "checking for library containing crypt_keyslot_change_by_passphrase... " >&6; } if ${ac_cv_search_crypt_keyslot_change_by_passphrase+:} false; then : $as_echo_n "(cached) " >&6 else ac_func_search_save_LIBS=$LIBS cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char crypt_keyslot_change_by_passphrase (); int main () { return crypt_keyslot_change_by_passphrase (); ; return 0; } _ACEOF for ac_lib in '' libcryptsetup; do if test -z "$ac_lib"; then ac_res="none required" else ac_res=-l$ac_lib LIBS="-l$ac_lib $ac_func_search_save_LIBS" fi if ac_fn_c_try_link "$LINENO"; then : ac_cv_search_crypt_keyslot_change_by_passphrase=$ac_res fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext if ${ac_cv_search_crypt_keyslot_change_by_passphrase+:} false; then : break fi done if ${ac_cv_search_crypt_keyslot_change_by_passphrase+:} false; then : else ac_cv_search_crypt_keyslot_change_by_passphrase=no fi rm conftest.$ac_ext LIBS=$ac_func_search_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_search_crypt_keyslot_change_by_passphrase" >&5 $as_echo "$ac_cv_search_crypt_keyslot_change_by_passphrase" >&6; } ac_res=$ac_cv_search_crypt_keyslot_change_by_passphrase if test "$ac_res" != no; then : test "$ac_res" = "none required" || LIBS="$ac_res $LIBS" $as_echo "#define HAVE_LIBCRYPTSETUP_1_6 1" >>confdefs.h else $as_echo "#define HAVE_LIBCRYPTSETUP_1_6 0" >>confdefs.h fi else $as_echo "#define USE_LUKSCOMPAT 0" >>confdefs.h fi if test "x$use_lukscompat" = "xyes"; then BUILD_LUKSCOMPAT_TRUE= BUILD_LUKSCOMPAT_FALSE='#' else BUILD_LUKSCOMPAT_TRUE='#' BUILD_LUKSCOMPAT_FALSE= fi # Check whether --enable-delegation was given. if test "${enable_delegation+set}" = set; then : enableval=$enable_delegation; delegation="${enableval}" else delegation="yes" fi if test "x${delegation}" = "xyes"; then dfltERSATZ=0; else dlftERSATZ=1; fi # Extract the first word of "mount", so it can be a program name with args. set dummy mount; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ERSATZ_MOUNT+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ERSATZ_MOUNT"; then ac_cv_prog_ERSATZ_MOUNT="$ERSATZ_MOUNT" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in ${SYSPATH} do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ERSATZ_MOUNT="${dfltERSATZ}" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS test -z "$ac_cv_prog_ERSATZ_MOUNT" && ac_cv_prog_ERSATZ_MOUNT="1" fi fi ERSATZ_MOUNT=$ac_cv_prog_ERSATZ_MOUNT if test -n "$ERSATZ_MOUNT"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ERSATZ_MOUNT" >&5 $as_echo "$ERSATZ_MOUNT" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi # Extract the first word of "mount", so it can be a program name with args. set dummy mount; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_path_PATH_MOUNT+:} false; then : $as_echo_n "(cached) " >&6 else case $PATH_MOUNT in [\\/]* | ?:[\\/]*) ac_cv_path_PATH_MOUNT="$PATH_MOUNT" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in ${SYSPATH} do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_path_PATH_MOUNT="$as_dir/$ac_word$ac_exec_ext" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS test -z "$ac_cv_path_PATH_MOUNT" && ac_cv_path_PATH_MOUNT="NOTHING" ;; esac fi PATH_MOUNT=$ac_cv_path_PATH_MOUNT if test -n "$PATH_MOUNT"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $PATH_MOUNT" >&5 $as_echo "$PATH_MOUNT" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi # Extract the first word of "umount", so it can be a program name with args. set dummy umount; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ERSATZ_UMOUNT+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ERSATZ_UMOUNT"; then ac_cv_prog_ERSATZ_UMOUNT="$ERSATZ_UMOUNT" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in ${SYSPATH} do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ERSATZ_UMOUNT="${dfltERSATZ}" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS test -z "$ac_cv_prog_ERSATZ_UMOUNT" && ac_cv_prog_ERSATZ_UMOUNT="1" fi fi ERSATZ_UMOUNT=$ac_cv_prog_ERSATZ_UMOUNT if test -n "$ERSATZ_UMOUNT"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ERSATZ_UMOUNT" >&5 $as_echo "$ERSATZ_UMOUNT" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi # Extract the first word of "umount", so it can be a program name with args. set dummy umount; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_path_PATH_UMOUNT+:} false; then : $as_echo_n "(cached) " >&6 else case $PATH_UMOUNT in [\\/]* | ?:[\\/]*) ac_cv_path_PATH_UMOUNT="$PATH_UMOUNT" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in ${SYSPATH} do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_path_PATH_UMOUNT="$as_dir/$ac_word$ac_exec_ext" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS test -z "$ac_cv_path_PATH_UMOUNT" && ac_cv_path_PATH_UMOUNT="NOTHING" ;; esac fi PATH_UMOUNT=$ac_cv_path_PATH_UMOUNT if test -n "$PATH_UMOUNT"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $PATH_UMOUNT" >&5 $as_echo "$PATH_UMOUNT" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi # Check whether --enable-cswap was given. if test "${enable_cswap+set}" = set; then : enableval=$enable_cswap; use_cswap="${enableval}" else use_cswap="yes" fi if test "x${use_cswap}" = "xyes"; then dfltSWAP=1; { $as_echo "$as_me:${as_lineno-$LINENO}: checking for library containing swapon" >&5 $as_echo_n "checking for library containing swapon... " >&6; } if ${ac_cv_search_swapon+:} false; then : $as_echo_n "(cached) " >&6 else ac_func_search_save_LIBS=$LIBS cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char swapon (); int main () { return swapon (); ; return 0; } _ACEOF for ac_lib in '' c; do if test -z "$ac_lib"; then ac_res="none required" else ac_res=-l$ac_lib LIBS="-l$ac_lib $ac_func_search_save_LIBS" fi if ac_fn_c_try_link "$LINENO"; then : ac_cv_search_swapon=$ac_res fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext if ${ac_cv_search_swapon+:} false; then : break fi done if ${ac_cv_search_swapon+:} false; then : else ac_cv_search_swapon=no fi rm conftest.$ac_ext LIBS=$ac_func_search_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_search_swapon" >&5 $as_echo "$ac_cv_search_swapon" >&6; } ac_res=$ac_cv_search_swapon if test "$ac_res" != no; then : test "$ac_res" = "none required" || LIBS="$ac_res $LIBS" else as_fn_error $? "swapon() system-call is needed for crypto-swap" "$LINENO" 5 fi else dfltSWAP=0; fi # Extract the first word of "mkswap", so it can be a program name with args. set dummy mkswap; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_WITH_CSWAP+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$WITH_CSWAP"; then ac_cv_prog_WITH_CSWAP="$WITH_CSWAP" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in ${SYSPATH} do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_WITH_CSWAP="${dfltSWAP}" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS test -z "$ac_cv_prog_WITH_CSWAP" && ac_cv_prog_WITH_CSWAP="0" fi fi WITH_CSWAP=$ac_cv_prog_WITH_CSWAP if test -n "$WITH_CSWAP"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $WITH_CSWAP" >&5 $as_echo "$WITH_CSWAP" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi # Extract the first word of "mkswap", so it can be a program name with args. set dummy mkswap; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_path_PATH_MKSWAP+:} false; then : $as_echo_n "(cached) " >&6 else case $PATH_MKSWAP in [\\/]* | ?:[\\/]*) ac_cv_path_PATH_MKSWAP="$PATH_MKSWAP" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in ${SYSPATH} do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_path_PATH_MKSWAP="$as_dir/$ac_word$ac_exec_ext" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS test -z "$ac_cv_path_PATH_MKSWAP" && ac_cv_path_PATH_MKSWAP="NOTHING" ;; esac fi PATH_MKSWAP=$ac_cv_path_PATH_MKSWAP if test -n "$PATH_MKSWAP"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $PATH_MKSWAP" >&5 $as_echo "$PATH_MKSWAP" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi # Check whether --enable-fsck was given. if test "${enable_fsck+set}" = set; then : enableval=$enable_fsck; fsck="${enableval}" else fsck="yes" fi if test "x${fsck}" = "xyes"; then dfltFSCK=1; else dfltFSCK=0; fi # Extract the first word of "fsck", so it can be a program name with args. set dummy fsck; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_WITH_FSCK+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$WITH_FSCK"; then ac_cv_prog_WITH_FSCK="$WITH_FSCK" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in ${SYSPATH} do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_WITH_FSCK="${dfltFSCK}" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS test -z "$ac_cv_prog_WITH_FSCK" && ac_cv_prog_WITH_FSCK="0" fi fi WITH_FSCK=$ac_cv_prog_WITH_FSCK if test -n "$WITH_FSCK"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $WITH_FSCK" >&5 $as_echo "$WITH_FSCK" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi # Extract the first word of "fsck", so it can be a program name with args. set dummy fsck; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_path_PATH_FSCK+:} false; then : $as_echo_n "(cached) " >&6 else case $PATH_FSCK in [\\/]* | ?:[\\/]*) ac_cv_path_PATH_FSCK="$PATH_FSCK" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in ${SYSPATH} do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_path_PATH_FSCK="$as_dir/$ac_word$ac_exec_ext" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS test -z "$ac_cv_path_PATH_FSCK" && ac_cv_path_PATH_FSCK="NOTHING" ;; esac fi PATH_FSCK=$ac_cv_path_PATH_FSCK if test -n "$PATH_FSCK"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $PATH_FSCK" >&5 $as_echo "$PATH_FSCK" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for a sed that does not truncate output" >&5 $as_echo_n "checking for a sed that does not truncate output... " >&6; } if ${ac_cv_path_SED+:} false; then : $as_echo_n "(cached) " >&6 else ac_script=s/aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa/bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb/ for ac_i in 1 2 3 4 5 6 7; do ac_script="$ac_script$as_nl$ac_script" done echo "$ac_script" 2>/dev/null | sed 99q >conftest.sed { ac_script=; unset ac_script;} if test -z "$SED"; then ac_path_SED_found=false # Loop through the user's path and test for each of PROGNAME-LIST as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_prog in sed gsed; do for ac_exec_ext in '' $ac_executable_extensions; do ac_path_SED="$as_dir/$ac_prog$ac_exec_ext" as_fn_executable_p "$ac_path_SED" || continue # Check for GNU ac_path_SED and select it if it is found. # Check for GNU $ac_path_SED case `"$ac_path_SED" --version 2>&1` in *GNU*) ac_cv_path_SED="$ac_path_SED" ac_path_SED_found=:;; *) ac_count=0 $as_echo_n 0123456789 >"conftest.in" while : do cat "conftest.in" "conftest.in" >"conftest.tmp" mv "conftest.tmp" "conftest.in" cp "conftest.in" "conftest.nl" $as_echo '' >> "conftest.nl" "$ac_path_SED" -f conftest.sed < "conftest.nl" >"conftest.out" 2>/dev/null || break diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break as_fn_arith $ac_count + 1 && ac_count=$as_val if test $ac_count -gt ${ac_path_SED_max-0}; then # Best one so far, save it but keep looking for a better one ac_cv_path_SED="$ac_path_SED" ac_path_SED_max=$ac_count fi # 10*(2^10) chars as input seems more than enough test $ac_count -gt 10 && break done rm -f conftest.in conftest.tmp conftest.nl conftest.out;; esac $ac_path_SED_found && break 3 done done done IFS=$as_save_IFS if test -z "$ac_cv_path_SED"; then as_fn_error $? "no acceptable sed could be found in \$PATH" "$LINENO" 5 fi else ac_cv_path_SED=$SED fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_SED" >&5 $as_echo "$ac_cv_path_SED" >&6; } SED="$ac_cv_path_SED" rm -f conftest.sed { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether NLS is requested" >&5 $as_echo_n "checking whether NLS is requested... " >&6; } # Check whether --enable-nls was given. if test "${enable_nls+set}" = set; then : enableval=$enable_nls; USE_NLS=$enableval else USE_NLS=yes fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $USE_NLS" >&5 $as_echo "$USE_NLS" >&6; } GETTEXT_MACRO_VERSION=0.19 # Prepare PATH_SEPARATOR. # The user is always right. if test "${PATH_SEPARATOR+set}" != set; then # Determine PATH_SEPARATOR by trying to find /bin/sh in a PATH which # contains only /bin. Note that ksh looks also at the FPATH variable, # so we have to set that as well for the test. PATH_SEPARATOR=: (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 \ && { (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 \ || PATH_SEPARATOR=';' } fi # Find out how to test for executable files. Don't use a zero-byte file, # as systems may use methods other than mode bits to determine executability. cat >conf$$.file <<_ASEOF #! /bin/sh exit 0 _ASEOF chmod +x conf$$.file if test -x conf$$.file >/dev/null 2>&1; then ac_executable_p="test -x" else ac_executable_p="test -f" fi rm -f conf$$.file # Extract the first word of "msgfmt", so it can be a program name with args. set dummy msgfmt; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_path_MSGFMT+:} false; then : $as_echo_n "(cached) " >&6 else case "$MSGFMT" in [\\/]* | ?:[\\/]*) ac_cv_path_MSGFMT="$MSGFMT" # Let the user override the test with a path. ;; *) ac_save_IFS="$IFS"; IFS=$PATH_SEPARATOR for ac_dir in $PATH; do IFS="$ac_save_IFS" test -z "$ac_dir" && ac_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if $ac_executable_p "$ac_dir/$ac_word$ac_exec_ext"; then echo "$as_me: trying $ac_dir/$ac_word..." >&5 if $ac_dir/$ac_word --statistics /dev/null >&5 2>&1 && (if $ac_dir/$ac_word --statistics /dev/null 2>&1 >/dev/null | grep usage >/dev/null; then exit 1; else exit 0; fi); then ac_cv_path_MSGFMT="$ac_dir/$ac_word$ac_exec_ext" break 2 fi fi done done IFS="$ac_save_IFS" test -z "$ac_cv_path_MSGFMT" && ac_cv_path_MSGFMT=":" ;; esac fi MSGFMT="$ac_cv_path_MSGFMT" if test "$MSGFMT" != ":"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MSGFMT" >&5 $as_echo "$MSGFMT" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi # Extract the first word of "gmsgfmt", so it can be a program name with args. set dummy gmsgfmt; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_path_GMSGFMT+:} false; then : $as_echo_n "(cached) " >&6 else case $GMSGFMT in [\\/]* | ?:[\\/]*) ac_cv_path_GMSGFMT="$GMSGFMT" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_path_GMSGFMT="$as_dir/$ac_word$ac_exec_ext" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS test -z "$ac_cv_path_GMSGFMT" && ac_cv_path_GMSGFMT="$MSGFMT" ;; esac fi GMSGFMT=$ac_cv_path_GMSGFMT if test -n "$GMSGFMT"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $GMSGFMT" >&5 $as_echo "$GMSGFMT" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi case `$MSGFMT --version | sed 1q | sed -e 's,^[^0-9]*,,'` in '' | 0.[0-9] | 0.[0-9].* | 0.1[0-4] | 0.1[0-4].*) MSGFMT_015=: ;; *) MSGFMT_015=$MSGFMT ;; esac case `$GMSGFMT --version | sed 1q | sed -e 's,^[^0-9]*,,'` in '' | 0.[0-9] | 0.[0-9].* | 0.1[0-4] | 0.1[0-4].*) GMSGFMT_015=: ;; *) GMSGFMT_015=$GMSGFMT ;; esac # Prepare PATH_SEPARATOR. # The user is always right. if test "${PATH_SEPARATOR+set}" != set; then # Determine PATH_SEPARATOR by trying to find /bin/sh in a PATH which # contains only /bin. Note that ksh looks also at the FPATH variable, # so we have to set that as well for the test. PATH_SEPARATOR=: (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 \ && { (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 \ || PATH_SEPARATOR=';' } fi # Find out how to test for executable files. Don't use a zero-byte file, # as systems may use methods other than mode bits to determine executability. cat >conf$$.file <<_ASEOF #! /bin/sh exit 0 _ASEOF chmod +x conf$$.file if test -x conf$$.file >/dev/null 2>&1; then ac_executable_p="test -x" else ac_executable_p="test -f" fi rm -f conf$$.file # Extract the first word of "xgettext", so it can be a program name with args. set dummy xgettext; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_path_XGETTEXT+:} false; then : $as_echo_n "(cached) " >&6 else case "$XGETTEXT" in [\\/]* | ?:[\\/]*) ac_cv_path_XGETTEXT="$XGETTEXT" # Let the user override the test with a path. ;; *) ac_save_IFS="$IFS"; IFS=$PATH_SEPARATOR for ac_dir in $PATH; do IFS="$ac_save_IFS" test -z "$ac_dir" && ac_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if $ac_executable_p "$ac_dir/$ac_word$ac_exec_ext"; then echo "$as_me: trying $ac_dir/$ac_word..." >&5 if $ac_dir/$ac_word --omit-header --copyright-holder= --msgid-bugs-address= /dev/null >&5 2>&1 && (if $ac_dir/$ac_word --omit-header --copyright-holder= --msgid-bugs-address= /dev/null 2>&1 >/dev/null | grep usage >/dev/null; then exit 1; else exit 0; fi); then ac_cv_path_XGETTEXT="$ac_dir/$ac_word$ac_exec_ext" break 2 fi fi done done IFS="$ac_save_IFS" test -z "$ac_cv_path_XGETTEXT" && ac_cv_path_XGETTEXT=":" ;; esac fi XGETTEXT="$ac_cv_path_XGETTEXT" if test "$XGETTEXT" != ":"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $XGETTEXT" >&5 $as_echo "$XGETTEXT" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi rm -f messages.po case `$XGETTEXT --version | sed 1q | sed -e 's,^[^0-9]*,,'` in '' | 0.[0-9] | 0.[0-9].* | 0.1[0-4] | 0.1[0-4].*) XGETTEXT_015=: ;; *) XGETTEXT_015=$XGETTEXT ;; esac # Prepare PATH_SEPARATOR. # The user is always right. if test "${PATH_SEPARATOR+set}" != set; then # Determine PATH_SEPARATOR by trying to find /bin/sh in a PATH which # contains only /bin. Note that ksh looks also at the FPATH variable, # so we have to set that as well for the test. PATH_SEPARATOR=: (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 \ && { (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 \ || PATH_SEPARATOR=';' } fi # Find out how to test for executable files. Don't use a zero-byte file, # as systems may use methods other than mode bits to determine executability. cat >conf$$.file <<_ASEOF #! /bin/sh exit 0 _ASEOF chmod +x conf$$.file if test -x conf$$.file >/dev/null 2>&1; then ac_executable_p="test -x" else ac_executable_p="test -f" fi rm -f conf$$.file # Extract the first word of "msgmerge", so it can be a program name with args. set dummy msgmerge; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_path_MSGMERGE+:} false; then : $as_echo_n "(cached) " >&6 else case "$MSGMERGE" in [\\/]* | ?:[\\/]*) ac_cv_path_MSGMERGE="$MSGMERGE" # Let the user override the test with a path. ;; *) ac_save_IFS="$IFS"; IFS=$PATH_SEPARATOR for ac_dir in $PATH; do IFS="$ac_save_IFS" test -z "$ac_dir" && ac_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if $ac_executable_p "$ac_dir/$ac_word$ac_exec_ext"; then echo "$as_me: trying $ac_dir/$ac_word..." >&5 if $ac_dir/$ac_word --update -q /dev/null /dev/null >&5 2>&1; then ac_cv_path_MSGMERGE="$ac_dir/$ac_word$ac_exec_ext" break 2 fi fi done done IFS="$ac_save_IFS" test -z "$ac_cv_path_MSGMERGE" && ac_cv_path_MSGMERGE=":" ;; esac fi MSGMERGE="$ac_cv_path_MSGMERGE" if test "$MSGMERGE" != ":"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MSGMERGE" >&5 $as_echo "$MSGMERGE" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$localedir" || localedir='${datadir}/locale' test -n "${XGETTEXT_EXTRA_OPTIONS+set}" || XGETTEXT_EXTRA_OPTIONS= ac_config_commands="$ac_config_commands po-directories" if test "X$prefix" = "XNONE"; then acl_final_prefix="$ac_default_prefix" else acl_final_prefix="$prefix" fi if test "X$exec_prefix" = "XNONE"; then acl_final_exec_prefix='${prefix}' else acl_final_exec_prefix="$exec_prefix" fi acl_save_prefix="$prefix" prefix="$acl_final_prefix" eval acl_final_exec_prefix=\"$acl_final_exec_prefix\" prefix="$acl_save_prefix" # Make sure we can run config.sub. $SHELL "$ac_aux_dir/config.sub" sun4 >/dev/null 2>&1 || as_fn_error $? "cannot run $SHELL $ac_aux_dir/config.sub" "$LINENO" 5 { $as_echo "$as_me:${as_lineno-$LINENO}: checking build system type" >&5 $as_echo_n "checking build system type... " >&6; } if ${ac_cv_build+:} false; then : $as_echo_n "(cached) " >&6 else ac_build_alias=$build_alias test "x$ac_build_alias" = x && ac_build_alias=`$SHELL "$ac_aux_dir/config.guess"` test "x$ac_build_alias" = x && as_fn_error $? "cannot guess build type; you must specify one" "$LINENO" 5 ac_cv_build=`$SHELL "$ac_aux_dir/config.sub" $ac_build_alias` || as_fn_error $? "$SHELL $ac_aux_dir/config.sub $ac_build_alias failed" "$LINENO" 5 fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_build" >&5 $as_echo "$ac_cv_build" >&6; } case $ac_cv_build in *-*-*) ;; *) as_fn_error $? "invalid value of canonical build" "$LINENO" 5;; esac build=$ac_cv_build ac_save_IFS=$IFS; IFS='-' set x $ac_cv_build shift build_cpu=$1 build_vendor=$2 shift; shift # Remember, the first character of IFS is used to create $*, # except with old shells: build_os=$* IFS=$ac_save_IFS case $build_os in *\ *) build_os=`echo "$build_os" | sed 's/ /-/g'`;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: checking host system type" >&5 $as_echo_n "checking host system type... " >&6; } if ${ac_cv_host+:} false; then : $as_echo_n "(cached) " >&6 else if test "x$host_alias" = x; then ac_cv_host=$ac_cv_build else ac_cv_host=`$SHELL "$ac_aux_dir/config.sub" $host_alias` || as_fn_error $? "$SHELL $ac_aux_dir/config.sub $host_alias failed" "$LINENO" 5 fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_host" >&5 $as_echo "$ac_cv_host" >&6; } case $ac_cv_host in *-*-*) ;; *) as_fn_error $? "invalid value of canonical host" "$LINENO" 5;; esac host=$ac_cv_host ac_save_IFS=$IFS; IFS='-' set x $ac_cv_host shift host_cpu=$1 host_vendor=$2 shift; shift # Remember, the first character of IFS is used to create $*, # except with old shells: host_os=$* IFS=$ac_save_IFS case $host_os in *\ *) host_os=`echo "$host_os" | sed 's/ /-/g'`;; esac # Check whether --with-gnu-ld was given. if test "${with_gnu_ld+set}" = set; then : withval=$with_gnu_ld; test "$withval" = no || with_gnu_ld=yes else with_gnu_ld=no fi # Prepare PATH_SEPARATOR. # The user is always right. if test "${PATH_SEPARATOR+set}" != set; then # Determine PATH_SEPARATOR by trying to find /bin/sh in a PATH which # contains only /bin. Note that ksh looks also at the FPATH variable, # so we have to set that as well for the test. PATH_SEPARATOR=: (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 \ && { (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 \ || PATH_SEPARATOR=';' } fi ac_prog=ld if test "$GCC" = yes; then # Check if gcc -print-prog-name=ld gives a path. { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ld used by $CC" >&5 $as_echo_n "checking for ld used by $CC... " >&6; } case $host in *-*-mingw*) # gcc leaves a trailing carriage return which upsets mingw ac_prog=`($CC -print-prog-name=ld) 2>&5 | tr -d '\015'` ;; *) ac_prog=`($CC -print-prog-name=ld) 2>&5` ;; esac case $ac_prog in # Accept absolute paths. [\\/]* | ?:[\\/]*) re_direlt='/[^/][^/]*/\.\./' # Canonicalize the pathname of ld ac_prog=`echo "$ac_prog"| sed 's%\\\\%/%g'` while echo "$ac_prog" | grep "$re_direlt" > /dev/null 2>&1; do ac_prog=`echo $ac_prog| sed "s%$re_direlt%/%"` done test -z "$LD" && LD="$ac_prog" ;; "") # If it fails, then pretend we aren't using GCC. ac_prog=ld ;; *) # If it is relative, then search for the first ld in PATH. with_gnu_ld=unknown ;; esac elif test "$with_gnu_ld" = yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for GNU ld" >&5 $as_echo_n "checking for GNU ld... " >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: checking for non-GNU ld" >&5 $as_echo_n "checking for non-GNU ld... " >&6; } fi if ${acl_cv_path_LD+:} false; then : $as_echo_n "(cached) " >&6 else if test -z "$LD"; then acl_save_ifs="$IFS"; IFS=$PATH_SEPARATOR for ac_dir in $PATH; do IFS="$acl_save_ifs" test -z "$ac_dir" && ac_dir=. if test -f "$ac_dir/$ac_prog" || test -f "$ac_dir/$ac_prog$ac_exeext"; then acl_cv_path_LD="$ac_dir/$ac_prog" # Check to see if the program is GNU ld. I'd rather use --version, # but apparently some variants of GNU ld only accept -v. # Break only if it was the GNU/non-GNU ld that we prefer. case `"$acl_cv_path_LD" -v 2>&1 &5 $as_echo "$LD" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -z "$LD" && as_fn_error $? "no acceptable ld found in \$PATH" "$LINENO" 5 { $as_echo "$as_me:${as_lineno-$LINENO}: checking if the linker ($LD) is GNU ld" >&5 $as_echo_n "checking if the linker ($LD) is GNU ld... " >&6; } if ${acl_cv_prog_gnu_ld+:} false; then : $as_echo_n "(cached) " >&6 else # I'd rather use --version here, but apparently some GNU lds only accept -v. case `$LD -v 2>&1 &5 $as_echo "$acl_cv_prog_gnu_ld" >&6; } with_gnu_ld=$acl_cv_prog_gnu_ld { $as_echo "$as_me:${as_lineno-$LINENO}: checking for shared library run path origin" >&5 $as_echo_n "checking for shared library run path origin... " >&6; } if ${acl_cv_rpath+:} false; then : $as_echo_n "(cached) " >&6 else CC="$CC" GCC="$GCC" LDFLAGS="$LDFLAGS" LD="$LD" with_gnu_ld="$with_gnu_ld" \ ${CONFIG_SHELL-/bin/sh} "$ac_aux_dir/config.rpath" "$host" > conftest.sh . ./conftest.sh rm -f ./conftest.sh acl_cv_rpath=done fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $acl_cv_rpath" >&5 $as_echo "$acl_cv_rpath" >&6; } wl="$acl_cv_wl" acl_libext="$acl_cv_libext" acl_shlibext="$acl_cv_shlibext" acl_libname_spec="$acl_cv_libname_spec" acl_library_names_spec="$acl_cv_library_names_spec" acl_hardcode_libdir_flag_spec="$acl_cv_hardcode_libdir_flag_spec" acl_hardcode_libdir_separator="$acl_cv_hardcode_libdir_separator" acl_hardcode_direct="$acl_cv_hardcode_direct" acl_hardcode_minus_L="$acl_cv_hardcode_minus_L" # Check whether --enable-rpath was given. if test "${enable_rpath+set}" = set; then : enableval=$enable_rpath; : else enable_rpath=yes fi acl_libdirstem=lib acl_libdirstem2= case "$host_os" in solaris*) { $as_echo "$as_me:${as_lineno-$LINENO}: checking for 64-bit host" >&5 $as_echo_n "checking for 64-bit host... " >&6; } if ${gl_cv_solaris_64bit+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #ifdef _LP64 sixtyfour bits #endif _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | $EGREP "sixtyfour bits" >/dev/null 2>&1; then : gl_cv_solaris_64bit=yes else gl_cv_solaris_64bit=no fi rm -f conftest* fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_solaris_64bit" >&5 $as_echo "$gl_cv_solaris_64bit" >&6; } if test $gl_cv_solaris_64bit = yes; then acl_libdirstem=lib/64 case "$host_cpu" in sparc*) acl_libdirstem2=lib/sparcv9 ;; i*86 | x86_64) acl_libdirstem2=lib/amd64 ;; esac fi ;; *) searchpath=`(LC_ALL=C $CC -print-search-dirs) 2>/dev/null | sed -n -e 's,^libraries: ,,p' | sed -e 's,^=,,'` if test -n "$searchpath"; then acl_save_IFS="${IFS= }"; IFS=":" for searchdir in $searchpath; do if test -d "$searchdir"; then case "$searchdir" in */lib64/ | */lib64 ) acl_libdirstem=lib64 ;; */../ | */.. ) # Better ignore directories of this form. They are misleading. ;; *) searchdir=`cd "$searchdir" && pwd` case "$searchdir" in */lib64 ) acl_libdirstem=lib64 ;; esac ;; esac fi done IFS="$acl_save_IFS" fi ;; esac test -n "$acl_libdirstem2" || acl_libdirstem2="$acl_libdirstem" use_additional=yes acl_save_prefix="$prefix" prefix="$acl_final_prefix" acl_save_exec_prefix="$exec_prefix" exec_prefix="$acl_final_exec_prefix" eval additional_includedir=\"$includedir\" eval additional_libdir=\"$libdir\" exec_prefix="$acl_save_exec_prefix" prefix="$acl_save_prefix" # Check whether --with-libiconv-prefix was given. if test "${with_libiconv_prefix+set}" = set; then : withval=$with_libiconv_prefix; if test "X$withval" = "Xno"; then use_additional=no else if test "X$withval" = "X"; then acl_save_prefix="$prefix" prefix="$acl_final_prefix" acl_save_exec_prefix="$exec_prefix" exec_prefix="$acl_final_exec_prefix" eval additional_includedir=\"$includedir\" eval additional_libdir=\"$libdir\" exec_prefix="$acl_save_exec_prefix" prefix="$acl_save_prefix" else additional_includedir="$withval/include" additional_libdir="$withval/$acl_libdirstem" if test "$acl_libdirstem2" != "$acl_libdirstem" \ && ! test -d "$withval/$acl_libdirstem"; then additional_libdir="$withval/$acl_libdirstem2" fi fi fi fi LIBICONV= LTLIBICONV= INCICONV= LIBICONV_PREFIX= HAVE_LIBICONV= rpathdirs= ltrpathdirs= names_already_handled= names_next_round='iconv ' while test -n "$names_next_round"; do names_this_round="$names_next_round" names_next_round= for name in $names_this_round; do already_handled= for n in $names_already_handled; do if test "$n" = "$name"; then already_handled=yes break fi done if test -z "$already_handled"; then names_already_handled="$names_already_handled $name" uppername=`echo "$name" | sed -e 'y|abcdefghijklmnopqrstuvwxyz./+-|ABCDEFGHIJKLMNOPQRSTUVWXYZ____|'` eval value=\"\$HAVE_LIB$uppername\" if test -n "$value"; then if test "$value" = yes; then eval value=\"\$LIB$uppername\" test -z "$value" || LIBICONV="${LIBICONV}${LIBICONV:+ }$value" eval value=\"\$LTLIB$uppername\" test -z "$value" || LTLIBICONV="${LTLIBICONV}${LTLIBICONV:+ }$value" else : fi else found_dir= found_la= found_so= found_a= eval libname=\"$acl_libname_spec\" # typically: libname=lib$name if test -n "$acl_shlibext"; then shrext=".$acl_shlibext" # typically: shrext=.so else shrext= fi if test $use_additional = yes; then dir="$additional_libdir" if test -n "$acl_shlibext"; then if test -f "$dir/$libname$shrext"; then found_dir="$dir" found_so="$dir/$libname$shrext" else if test "$acl_library_names_spec" = '$libname$shrext$versuffix'; then ver=`(cd "$dir" && \ for f in "$libname$shrext".*; do echo "$f"; done \ | sed -e "s,^$libname$shrext\\\\.,," \ | sort -t '.' -n -r -k1,1 -k2,2 -k3,3 -k4,4 -k5,5 \ | sed 1q ) 2>/dev/null` if test -n "$ver" && test -f "$dir/$libname$shrext.$ver"; then found_dir="$dir" found_so="$dir/$libname$shrext.$ver" fi else eval library_names=\"$acl_library_names_spec\" for f in $library_names; do if test -f "$dir/$f"; then found_dir="$dir" found_so="$dir/$f" break fi done fi fi fi if test "X$found_dir" = "X"; then if test -f "$dir/$libname.$acl_libext"; then found_dir="$dir" found_a="$dir/$libname.$acl_libext" fi fi if test "X$found_dir" != "X"; then if test -f "$dir/$libname.la"; then found_la="$dir/$libname.la" fi fi fi if test "X$found_dir" = "X"; then for x in $LDFLAGS $LTLIBICONV; do acl_save_prefix="$prefix" prefix="$acl_final_prefix" acl_save_exec_prefix="$exec_prefix" exec_prefix="$acl_final_exec_prefix" eval x=\"$x\" exec_prefix="$acl_save_exec_prefix" prefix="$acl_save_prefix" case "$x" in -L*) dir=`echo "X$x" | sed -e 's/^X-L//'` if test -n "$acl_shlibext"; then if test -f "$dir/$libname$shrext"; then found_dir="$dir" found_so="$dir/$libname$shrext" else if test "$acl_library_names_spec" = '$libname$shrext$versuffix'; then ver=`(cd "$dir" && \ for f in "$libname$shrext".*; do echo "$f"; done \ | sed -e "s,^$libname$shrext\\\\.,," \ | sort -t '.' -n -r -k1,1 -k2,2 -k3,3 -k4,4 -k5,5 \ | sed 1q ) 2>/dev/null` if test -n "$ver" && test -f "$dir/$libname$shrext.$ver"; then found_dir="$dir" found_so="$dir/$libname$shrext.$ver" fi else eval library_names=\"$acl_library_names_spec\" for f in $library_names; do if test -f "$dir/$f"; then found_dir="$dir" found_so="$dir/$f" break fi done fi fi fi if test "X$found_dir" = "X"; then if test -f "$dir/$libname.$acl_libext"; then found_dir="$dir" found_a="$dir/$libname.$acl_libext" fi fi if test "X$found_dir" != "X"; then if test -f "$dir/$libname.la"; then found_la="$dir/$libname.la" fi fi ;; esac if test "X$found_dir" != "X"; then break fi done fi if test "X$found_dir" != "X"; then LTLIBICONV="${LTLIBICONV}${LTLIBICONV:+ }-L$found_dir -l$name" if test "X$found_so" != "X"; then if test "$enable_rpath" = no \ || test "X$found_dir" = "X/usr/$acl_libdirstem" \ || test "X$found_dir" = "X/usr/$acl_libdirstem2"; then LIBICONV="${LIBICONV}${LIBICONV:+ }$found_so" else haveit= for x in $ltrpathdirs; do if test "X$x" = "X$found_dir"; then haveit=yes break fi done if test -z "$haveit"; then ltrpathdirs="$ltrpathdirs $found_dir" fi if test "$acl_hardcode_direct" = yes; then LIBICONV="${LIBICONV}${LIBICONV:+ }$found_so" else if test -n "$acl_hardcode_libdir_flag_spec" && test "$acl_hardcode_minus_L" = no; then LIBICONV="${LIBICONV}${LIBICONV:+ }$found_so" haveit= for x in $rpathdirs; do if test "X$x" = "X$found_dir"; then haveit=yes break fi done if test -z "$haveit"; then rpathdirs="$rpathdirs $found_dir" fi else haveit= for x in $LDFLAGS $LIBICONV; do acl_save_prefix="$prefix" prefix="$acl_final_prefix" acl_save_exec_prefix="$exec_prefix" exec_prefix="$acl_final_exec_prefix" eval x=\"$x\" exec_prefix="$acl_save_exec_prefix" prefix="$acl_save_prefix" if test "X$x" = "X-L$found_dir"; then haveit=yes break fi done if test -z "$haveit"; then LIBICONV="${LIBICONV}${LIBICONV:+ }-L$found_dir" fi if test "$acl_hardcode_minus_L" != no; then LIBICONV="${LIBICONV}${LIBICONV:+ }$found_so" else LIBICONV="${LIBICONV}${LIBICONV:+ }-l$name" fi fi fi fi else if test "X$found_a" != "X"; then LIBICONV="${LIBICONV}${LIBICONV:+ }$found_a" else LIBICONV="${LIBICONV}${LIBICONV:+ }-L$found_dir -l$name" fi fi additional_includedir= case "$found_dir" in */$acl_libdirstem | */$acl_libdirstem/) basedir=`echo "X$found_dir" | sed -e 's,^X,,' -e "s,/$acl_libdirstem/"'*$,,'` if test "$name" = 'iconv'; then LIBICONV_PREFIX="$basedir" fi additional_includedir="$basedir/include" ;; */$acl_libdirstem2 | */$acl_libdirstem2/) basedir=`echo "X$found_dir" | sed -e 's,^X,,' -e "s,/$acl_libdirstem2/"'*$,,'` if test "$name" = 'iconv'; then LIBICONV_PREFIX="$basedir" fi additional_includedir="$basedir/include" ;; esac if test "X$additional_includedir" != "X"; then if test "X$additional_includedir" != "X/usr/include"; then haveit= if test "X$additional_includedir" = "X/usr/local/include"; then if test -n "$GCC"; then case $host_os in linux* | gnu* | k*bsd*-gnu) haveit=yes;; esac fi fi if test -z "$haveit"; then for x in $CPPFLAGS $INCICONV; do acl_save_prefix="$prefix" prefix="$acl_final_prefix" acl_save_exec_prefix="$exec_prefix" exec_prefix="$acl_final_exec_prefix" eval x=\"$x\" exec_prefix="$acl_save_exec_prefix" prefix="$acl_save_prefix" if test "X$x" = "X-I$additional_includedir"; then haveit=yes break fi done if test -z "$haveit"; then if test -d "$additional_includedir"; then INCICONV="${INCICONV}${INCICONV:+ }-I$additional_includedir" fi fi fi fi fi if test -n "$found_la"; then save_libdir="$libdir" case "$found_la" in */* | *\\*) . "$found_la" ;; *) . "./$found_la" ;; esac libdir="$save_libdir" for dep in $dependency_libs; do case "$dep" in -L*) additional_libdir=`echo "X$dep" | sed -e 's/^X-L//'` if test "X$additional_libdir" != "X/usr/$acl_libdirstem" \ && test "X$additional_libdir" != "X/usr/$acl_libdirstem2"; then haveit= if test "X$additional_libdir" = "X/usr/local/$acl_libdirstem" \ || test "X$additional_libdir" = "X/usr/local/$acl_libdirstem2"; then if test -n "$GCC"; then case $host_os in linux* | gnu* | k*bsd*-gnu) haveit=yes;; esac fi fi if test -z "$haveit"; then haveit= for x in $LDFLAGS $LIBICONV; do acl_save_prefix="$prefix" prefix="$acl_final_prefix" acl_save_exec_prefix="$exec_prefix" exec_prefix="$acl_final_exec_prefix" eval x=\"$x\" exec_prefix="$acl_save_exec_prefix" prefix="$acl_save_prefix" if test "X$x" = "X-L$additional_libdir"; then haveit=yes break fi done if test -z "$haveit"; then if test -d "$additional_libdir"; then LIBICONV="${LIBICONV}${LIBICONV:+ }-L$additional_libdir" fi fi haveit= for x in $LDFLAGS $LTLIBICONV; do acl_save_prefix="$prefix" prefix="$acl_final_prefix" acl_save_exec_prefix="$exec_prefix" exec_prefix="$acl_final_exec_prefix" eval x=\"$x\" exec_prefix="$acl_save_exec_prefix" prefix="$acl_save_prefix" if test "X$x" = "X-L$additional_libdir"; then haveit=yes break fi done if test -z "$haveit"; then if test -d "$additional_libdir"; then LTLIBICONV="${LTLIBICONV}${LTLIBICONV:+ }-L$additional_libdir" fi fi fi fi ;; -R*) dir=`echo "X$dep" | sed -e 's/^X-R//'` if test "$enable_rpath" != no; then haveit= for x in $rpathdirs; do if test "X$x" = "X$dir"; then haveit=yes break fi done if test -z "$haveit"; then rpathdirs="$rpathdirs $dir" fi haveit= for x in $ltrpathdirs; do if test "X$x" = "X$dir"; then haveit=yes break fi done if test -z "$haveit"; then ltrpathdirs="$ltrpathdirs $dir" fi fi ;; -l*) names_next_round="$names_next_round "`echo "X$dep" | sed -e 's/^X-l//'` ;; *.la) names_next_round="$names_next_round "`echo "X$dep" | sed -e 's,^X.*/,,' -e 's,^lib,,' -e 's,\.la$,,'` ;; *) LIBICONV="${LIBICONV}${LIBICONV:+ }$dep" LTLIBICONV="${LTLIBICONV}${LTLIBICONV:+ }$dep" ;; esac done fi else LIBICONV="${LIBICONV}${LIBICONV:+ }-l$name" LTLIBICONV="${LTLIBICONV}${LTLIBICONV:+ }-l$name" fi fi fi done done if test "X$rpathdirs" != "X"; then if test -n "$acl_hardcode_libdir_separator"; then alldirs= for found_dir in $rpathdirs; do alldirs="${alldirs}${alldirs:+$acl_hardcode_libdir_separator}$found_dir" done acl_save_libdir="$libdir" libdir="$alldirs" eval flag=\"$acl_hardcode_libdir_flag_spec\" libdir="$acl_save_libdir" LIBICONV="${LIBICONV}${LIBICONV:+ }$flag" else for found_dir in $rpathdirs; do acl_save_libdir="$libdir" libdir="$found_dir" eval flag=\"$acl_hardcode_libdir_flag_spec\" libdir="$acl_save_libdir" LIBICONV="${LIBICONV}${LIBICONV:+ }$flag" done fi fi if test "X$ltrpathdirs" != "X"; then for found_dir in $ltrpathdirs; do LTLIBICONV="${LTLIBICONV}${LTLIBICONV:+ }-R$found_dir" done fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for CFPreferencesCopyAppValue" >&5 $as_echo_n "checking for CFPreferencesCopyAppValue... " >&6; } if ${gt_cv_func_CFPreferencesCopyAppValue+:} false; then : $as_echo_n "(cached) " >&6 else gt_save_LIBS="$LIBS" LIBS="$LIBS -Wl,-framework -Wl,CoreFoundation" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main () { CFPreferencesCopyAppValue(NULL, NULL) ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : gt_cv_func_CFPreferencesCopyAppValue=yes else gt_cv_func_CFPreferencesCopyAppValue=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS="$gt_save_LIBS" fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $gt_cv_func_CFPreferencesCopyAppValue" >&5 $as_echo "$gt_cv_func_CFPreferencesCopyAppValue" >&6; } if test $gt_cv_func_CFPreferencesCopyAppValue = yes; then $as_echo "#define HAVE_CFPREFERENCESCOPYAPPVALUE 1" >>confdefs.h fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for CFLocaleCopyCurrent" >&5 $as_echo_n "checking for CFLocaleCopyCurrent... " >&6; } if ${gt_cv_func_CFLocaleCopyCurrent+:} false; then : $as_echo_n "(cached) " >&6 else gt_save_LIBS="$LIBS" LIBS="$LIBS -Wl,-framework -Wl,CoreFoundation" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main () { CFLocaleCopyCurrent(); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : gt_cv_func_CFLocaleCopyCurrent=yes else gt_cv_func_CFLocaleCopyCurrent=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS="$gt_save_LIBS" fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $gt_cv_func_CFLocaleCopyCurrent" >&5 $as_echo "$gt_cv_func_CFLocaleCopyCurrent" >&6; } if test $gt_cv_func_CFLocaleCopyCurrent = yes; then $as_echo "#define HAVE_CFLOCALECOPYCURRENT 1" >>confdefs.h fi INTL_MACOSX_LIBS= if test $gt_cv_func_CFPreferencesCopyAppValue = yes || test $gt_cv_func_CFLocaleCopyCurrent = yes; then INTL_MACOSX_LIBS="-Wl,-framework -Wl,CoreFoundation" fi LIBINTL= LTLIBINTL= POSUB= case " $gt_needs " in *" need-formatstring-macros "*) gt_api_version=3 ;; *" need-ngettext "*) gt_api_version=2 ;; *) gt_api_version=1 ;; esac gt_func_gnugettext_libc="gt_cv_func_gnugettext${gt_api_version}_libc" gt_func_gnugettext_libintl="gt_cv_func_gnugettext${gt_api_version}_libintl" if test "$USE_NLS" = "yes"; then gt_use_preinstalled_gnugettext=no if test $gt_api_version -ge 3; then gt_revision_test_code=' #ifndef __GNU_GETTEXT_SUPPORTED_REVISION #define __GNU_GETTEXT_SUPPORTED_REVISION(major) ((major) == 0 ? 0 : -1) #endif typedef int array [2 * (__GNU_GETTEXT_SUPPORTED_REVISION(0) >= 1) - 1]; ' else gt_revision_test_code= fi if test $gt_api_version -ge 2; then gt_expression_test_code=' + * ngettext ("", "", 0)' else gt_expression_test_code= fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for GNU gettext in libc" >&5 $as_echo_n "checking for GNU gettext in libc... " >&6; } if eval \${$gt_func_gnugettext_libc+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include $gt_revision_test_code extern int _nl_msg_cat_cntr; extern int *_nl_domain_bindings; int main () { bindtextdomain ("", ""); return * gettext ("")$gt_expression_test_code + _nl_msg_cat_cntr + *_nl_domain_bindings ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : eval "$gt_func_gnugettext_libc=yes" else eval "$gt_func_gnugettext_libc=no" fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext fi eval ac_res=\$$gt_func_gnugettext_libc { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } if { eval "gt_val=\$$gt_func_gnugettext_libc"; test "$gt_val" != "yes"; }; then am_save_CPPFLAGS="$CPPFLAGS" for element in $INCICONV; do haveit= for x in $CPPFLAGS; do acl_save_prefix="$prefix" prefix="$acl_final_prefix" acl_save_exec_prefix="$exec_prefix" exec_prefix="$acl_final_exec_prefix" eval x=\"$x\" exec_prefix="$acl_save_exec_prefix" prefix="$acl_save_prefix" if test "X$x" = "X$element"; then haveit=yes break fi done if test -z "$haveit"; then CPPFLAGS="${CPPFLAGS}${CPPFLAGS:+ }$element" fi done { $as_echo "$as_me:${as_lineno-$LINENO}: checking for iconv" >&5 $as_echo_n "checking for iconv... " >&6; } if ${am_cv_func_iconv+:} false; then : $as_echo_n "(cached) " >&6 else am_cv_func_iconv="no, consider installing GNU libiconv" am_cv_lib_iconv=no cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include int main () { iconv_t cd = iconv_open("",""); iconv(cd,NULL,NULL,NULL,NULL); iconv_close(cd); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : am_cv_func_iconv=yes fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext if test "$am_cv_func_iconv" != yes; then am_save_LIBS="$LIBS" LIBS="$LIBS $LIBICONV" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include int main () { iconv_t cd = iconv_open("",""); iconv(cd,NULL,NULL,NULL,NULL); iconv_close(cd); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : am_cv_lib_iconv=yes am_cv_func_iconv=yes fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS="$am_save_LIBS" fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_func_iconv" >&5 $as_echo "$am_cv_func_iconv" >&6; } if test "$am_cv_func_iconv" = yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for working iconv" >&5 $as_echo_n "checking for working iconv... " >&6; } if ${am_cv_func_iconv_works+:} false; then : $as_echo_n "(cached) " >&6 else am_save_LIBS="$LIBS" if test $am_cv_lib_iconv = yes; then LIBS="$LIBS $LIBICONV" fi if test "$cross_compiling" = yes; then : case "$host_os" in aix* | hpux*) am_cv_func_iconv_works="guessing no" ;; *) am_cv_func_iconv_works="guessing yes" ;; esac else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include int main () { int result = 0; /* Test against AIX 5.1 bug: Failures are not distinguishable from successful returns. */ { iconv_t cd_utf8_to_88591 = iconv_open ("ISO8859-1", "UTF-8"); if (cd_utf8_to_88591 != (iconv_t)(-1)) { static const char input[] = "\342\202\254"; /* EURO SIGN */ char buf[10]; const char *inptr = input; size_t inbytesleft = strlen (input); char *outptr = buf; size_t outbytesleft = sizeof (buf); size_t res = iconv (cd_utf8_to_88591, (char **) &inptr, &inbytesleft, &outptr, &outbytesleft); if (res == 0) result |= 1; iconv_close (cd_utf8_to_88591); } } /* Test against Solaris 10 bug: Failures are not distinguishable from successful returns. */ { iconv_t cd_ascii_to_88591 = iconv_open ("ISO8859-1", "646"); if (cd_ascii_to_88591 != (iconv_t)(-1)) { static const char input[] = "\263"; char buf[10]; const char *inptr = input; size_t inbytesleft = strlen (input); char *outptr = buf; size_t outbytesleft = sizeof (buf); size_t res = iconv (cd_ascii_to_88591, (char **) &inptr, &inbytesleft, &outptr, &outbytesleft); if (res == 0) result |= 2; iconv_close (cd_ascii_to_88591); } } /* Test against AIX 6.1..7.1 bug: Buffer overrun. */ { iconv_t cd_88591_to_utf8 = iconv_open ("UTF-8", "ISO-8859-1"); if (cd_88591_to_utf8 != (iconv_t)(-1)) { static const char input[] = "\304"; static char buf[2] = { (char)0xDE, (char)0xAD }; const char *inptr = input; size_t inbytesleft = 1; char *outptr = buf; size_t outbytesleft = 1; size_t res = iconv (cd_88591_to_utf8, (char **) &inptr, &inbytesleft, &outptr, &outbytesleft); if (res != (size_t)(-1) || outptr - buf > 1 || buf[1] != (char)0xAD) result |= 4; iconv_close (cd_88591_to_utf8); } } #if 0 /* This bug could be worked around by the caller. */ /* Test against HP-UX 11.11 bug: Positive return value instead of 0. */ { iconv_t cd_88591_to_utf8 = iconv_open ("utf8", "iso88591"); if (cd_88591_to_utf8 != (iconv_t)(-1)) { static const char input[] = "\304rger mit b\366sen B\374bchen ohne Augenma\337"; char buf[50]; const char *inptr = input; size_t inbytesleft = strlen (input); char *outptr = buf; size_t outbytesleft = sizeof (buf); size_t res = iconv (cd_88591_to_utf8, (char **) &inptr, &inbytesleft, &outptr, &outbytesleft); if ((int)res > 0) result |= 8; iconv_close (cd_88591_to_utf8); } } #endif /* Test against HP-UX 11.11 bug: No converter from EUC-JP to UTF-8 is provided. */ if (/* Try standardized names. */ iconv_open ("UTF-8", "EUC-JP") == (iconv_t)(-1) /* Try IRIX, OSF/1 names. */ && iconv_open ("UTF-8", "eucJP") == (iconv_t)(-1) /* Try AIX names. */ && iconv_open ("UTF-8", "IBM-eucJP") == (iconv_t)(-1) /* Try HP-UX names. */ && iconv_open ("utf8", "eucJP") == (iconv_t)(-1)) result |= 16; return result; } _ACEOF if ac_fn_c_try_run "$LINENO"; then : am_cv_func_iconv_works=yes else am_cv_func_iconv_works=no fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi LIBS="$am_save_LIBS" fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_func_iconv_works" >&5 $as_echo "$am_cv_func_iconv_works" >&6; } case "$am_cv_func_iconv_works" in *no) am_func_iconv=no am_cv_lib_iconv=no ;; *) am_func_iconv=yes ;; esac else am_func_iconv=no am_cv_lib_iconv=no fi if test "$am_func_iconv" = yes; then $as_echo "#define HAVE_ICONV 1" >>confdefs.h fi if test "$am_cv_lib_iconv" = yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to link with libiconv" >&5 $as_echo_n "checking how to link with libiconv... " >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: result: $LIBICONV" >&5 $as_echo "$LIBICONV" >&6; } else CPPFLAGS="$am_save_CPPFLAGS" LIBICONV= LTLIBICONV= fi use_additional=yes acl_save_prefix="$prefix" prefix="$acl_final_prefix" acl_save_exec_prefix="$exec_prefix" exec_prefix="$acl_final_exec_prefix" eval additional_includedir=\"$includedir\" eval additional_libdir=\"$libdir\" exec_prefix="$acl_save_exec_prefix" prefix="$acl_save_prefix" # Check whether --with-libintl-prefix was given. if test "${with_libintl_prefix+set}" = set; then : withval=$with_libintl_prefix; if test "X$withval" = "Xno"; then use_additional=no else if test "X$withval" = "X"; then acl_save_prefix="$prefix" prefix="$acl_final_prefix" acl_save_exec_prefix="$exec_prefix" exec_prefix="$acl_final_exec_prefix" eval additional_includedir=\"$includedir\" eval additional_libdir=\"$libdir\" exec_prefix="$acl_save_exec_prefix" prefix="$acl_save_prefix" else additional_includedir="$withval/include" additional_libdir="$withval/$acl_libdirstem" if test "$acl_libdirstem2" != "$acl_libdirstem" \ && ! test -d "$withval/$acl_libdirstem"; then additional_libdir="$withval/$acl_libdirstem2" fi fi fi fi LIBINTL= LTLIBINTL= INCINTL= LIBINTL_PREFIX= HAVE_LIBINTL= rpathdirs= ltrpathdirs= names_already_handled= names_next_round='intl ' while test -n "$names_next_round"; do names_this_round="$names_next_round" names_next_round= for name in $names_this_round; do already_handled= for n in $names_already_handled; do if test "$n" = "$name"; then already_handled=yes break fi done if test -z "$already_handled"; then names_already_handled="$names_already_handled $name" uppername=`echo "$name" | sed -e 'y|abcdefghijklmnopqrstuvwxyz./+-|ABCDEFGHIJKLMNOPQRSTUVWXYZ____|'` eval value=\"\$HAVE_LIB$uppername\" if test -n "$value"; then if test "$value" = yes; then eval value=\"\$LIB$uppername\" test -z "$value" || LIBINTL="${LIBINTL}${LIBINTL:+ }$value" eval value=\"\$LTLIB$uppername\" test -z "$value" || LTLIBINTL="${LTLIBINTL}${LTLIBINTL:+ }$value" else : fi else found_dir= found_la= found_so= found_a= eval libname=\"$acl_libname_spec\" # typically: libname=lib$name if test -n "$acl_shlibext"; then shrext=".$acl_shlibext" # typically: shrext=.so else shrext= fi if test $use_additional = yes; then dir="$additional_libdir" if test -n "$acl_shlibext"; then if test -f "$dir/$libname$shrext"; then found_dir="$dir" found_so="$dir/$libname$shrext" else if test "$acl_library_names_spec" = '$libname$shrext$versuffix'; then ver=`(cd "$dir" && \ for f in "$libname$shrext".*; do echo "$f"; done \ | sed -e "s,^$libname$shrext\\\\.,," \ | sort -t '.' -n -r -k1,1 -k2,2 -k3,3 -k4,4 -k5,5 \ | sed 1q ) 2>/dev/null` if test -n "$ver" && test -f "$dir/$libname$shrext.$ver"; then found_dir="$dir" found_so="$dir/$libname$shrext.$ver" fi else eval library_names=\"$acl_library_names_spec\" for f in $library_names; do if test -f "$dir/$f"; then found_dir="$dir" found_so="$dir/$f" break fi done fi fi fi if test "X$found_dir" = "X"; then if test -f "$dir/$libname.$acl_libext"; then found_dir="$dir" found_a="$dir/$libname.$acl_libext" fi fi if test "X$found_dir" != "X"; then if test -f "$dir/$libname.la"; then found_la="$dir/$libname.la" fi fi fi if test "X$found_dir" = "X"; then for x in $LDFLAGS $LTLIBINTL; do acl_save_prefix="$prefix" prefix="$acl_final_prefix" acl_save_exec_prefix="$exec_prefix" exec_prefix="$acl_final_exec_prefix" eval x=\"$x\" exec_prefix="$acl_save_exec_prefix" prefix="$acl_save_prefix" case "$x" in -L*) dir=`echo "X$x" | sed -e 's/^X-L//'` if test -n "$acl_shlibext"; then if test -f "$dir/$libname$shrext"; then found_dir="$dir" found_so="$dir/$libname$shrext" else if test "$acl_library_names_spec" = '$libname$shrext$versuffix'; then ver=`(cd "$dir" && \ for f in "$libname$shrext".*; do echo "$f"; done \ | sed -e "s,^$libname$shrext\\\\.,," \ | sort -t '.' -n -r -k1,1 -k2,2 -k3,3 -k4,4 -k5,5 \ | sed 1q ) 2>/dev/null` if test -n "$ver" && test -f "$dir/$libname$shrext.$ver"; then found_dir="$dir" found_so="$dir/$libname$shrext.$ver" fi else eval library_names=\"$acl_library_names_spec\" for f in $library_names; do if test -f "$dir/$f"; then found_dir="$dir" found_so="$dir/$f" break fi done fi fi fi if test "X$found_dir" = "X"; then if test -f "$dir/$libname.$acl_libext"; then found_dir="$dir" found_a="$dir/$libname.$acl_libext" fi fi if test "X$found_dir" != "X"; then if test -f "$dir/$libname.la"; then found_la="$dir/$libname.la" fi fi ;; esac if test "X$found_dir" != "X"; then break fi done fi if test "X$found_dir" != "X"; then LTLIBINTL="${LTLIBINTL}${LTLIBINTL:+ }-L$found_dir -l$name" if test "X$found_so" != "X"; then if test "$enable_rpath" = no \ || test "X$found_dir" = "X/usr/$acl_libdirstem" \ || test "X$found_dir" = "X/usr/$acl_libdirstem2"; then LIBINTL="${LIBINTL}${LIBINTL:+ }$found_so" else haveit= for x in $ltrpathdirs; do if test "X$x" = "X$found_dir"; then haveit=yes break fi done if test -z "$haveit"; then ltrpathdirs="$ltrpathdirs $found_dir" fi if test "$acl_hardcode_direct" = yes; then LIBINTL="${LIBINTL}${LIBINTL:+ }$found_so" else if test -n "$acl_hardcode_libdir_flag_spec" && test "$acl_hardcode_minus_L" = no; then LIBINTL="${LIBINTL}${LIBINTL:+ }$found_so" haveit= for x in $rpathdirs; do if test "X$x" = "X$found_dir"; then haveit=yes break fi done if test -z "$haveit"; then rpathdirs="$rpathdirs $found_dir" fi else haveit= for x in $LDFLAGS $LIBINTL; do acl_save_prefix="$prefix" prefix="$acl_final_prefix" acl_save_exec_prefix="$exec_prefix" exec_prefix="$acl_final_exec_prefix" eval x=\"$x\" exec_prefix="$acl_save_exec_prefix" prefix="$acl_save_prefix" if test "X$x" = "X-L$found_dir"; then haveit=yes break fi done if test -z "$haveit"; then LIBINTL="${LIBINTL}${LIBINTL:+ }-L$found_dir" fi if test "$acl_hardcode_minus_L" != no; then LIBINTL="${LIBINTL}${LIBINTL:+ }$found_so" else LIBINTL="${LIBINTL}${LIBINTL:+ }-l$name" fi fi fi fi else if test "X$found_a" != "X"; then LIBINTL="${LIBINTL}${LIBINTL:+ }$found_a" else LIBINTL="${LIBINTL}${LIBINTL:+ }-L$found_dir -l$name" fi fi additional_includedir= case "$found_dir" in */$acl_libdirstem | */$acl_libdirstem/) basedir=`echo "X$found_dir" | sed -e 's,^X,,' -e "s,/$acl_libdirstem/"'*$,,'` if test "$name" = 'intl'; then LIBINTL_PREFIX="$basedir" fi additional_includedir="$basedir/include" ;; */$acl_libdirstem2 | */$acl_libdirstem2/) basedir=`echo "X$found_dir" | sed -e 's,^X,,' -e "s,/$acl_libdirstem2/"'*$,,'` if test "$name" = 'intl'; then LIBINTL_PREFIX="$basedir" fi additional_includedir="$basedir/include" ;; esac if test "X$additional_includedir" != "X"; then if test "X$additional_includedir" != "X/usr/include"; then haveit= if test "X$additional_includedir" = "X/usr/local/include"; then if test -n "$GCC"; then case $host_os in linux* | gnu* | k*bsd*-gnu) haveit=yes;; esac fi fi if test -z "$haveit"; then for x in $CPPFLAGS $INCINTL; do acl_save_prefix="$prefix" prefix="$acl_final_prefix" acl_save_exec_prefix="$exec_prefix" exec_prefix="$acl_final_exec_prefix" eval x=\"$x\" exec_prefix="$acl_save_exec_prefix" prefix="$acl_save_prefix" if test "X$x" = "X-I$additional_includedir"; then haveit=yes break fi done if test -z "$haveit"; then if test -d "$additional_includedir"; then INCINTL="${INCINTL}${INCINTL:+ }-I$additional_includedir" fi fi fi fi fi if test -n "$found_la"; then save_libdir="$libdir" case "$found_la" in */* | *\\*) . "$found_la" ;; *) . "./$found_la" ;; esac libdir="$save_libdir" for dep in $dependency_libs; do case "$dep" in -L*) additional_libdir=`echo "X$dep" | sed -e 's/^X-L//'` if test "X$additional_libdir" != "X/usr/$acl_libdirstem" \ && test "X$additional_libdir" != "X/usr/$acl_libdirstem2"; then haveit= if test "X$additional_libdir" = "X/usr/local/$acl_libdirstem" \ || test "X$additional_libdir" = "X/usr/local/$acl_libdirstem2"; then if test -n "$GCC"; then case $host_os in linux* | gnu* | k*bsd*-gnu) haveit=yes;; esac fi fi if test -z "$haveit"; then haveit= for x in $LDFLAGS $LIBINTL; do acl_save_prefix="$prefix" prefix="$acl_final_prefix" acl_save_exec_prefix="$exec_prefix" exec_prefix="$acl_final_exec_prefix" eval x=\"$x\" exec_prefix="$acl_save_exec_prefix" prefix="$acl_save_prefix" if test "X$x" = "X-L$additional_libdir"; then haveit=yes break fi done if test -z "$haveit"; then if test -d "$additional_libdir"; then LIBINTL="${LIBINTL}${LIBINTL:+ }-L$additional_libdir" fi fi haveit= for x in $LDFLAGS $LTLIBINTL; do acl_save_prefix="$prefix" prefix="$acl_final_prefix" acl_save_exec_prefix="$exec_prefix" exec_prefix="$acl_final_exec_prefix" eval x=\"$x\" exec_prefix="$acl_save_exec_prefix" prefix="$acl_save_prefix" if test "X$x" = "X-L$additional_libdir"; then haveit=yes break fi done if test -z "$haveit"; then if test -d "$additional_libdir"; then LTLIBINTL="${LTLIBINTL}${LTLIBINTL:+ }-L$additional_libdir" fi fi fi fi ;; -R*) dir=`echo "X$dep" | sed -e 's/^X-R//'` if test "$enable_rpath" != no; then haveit= for x in $rpathdirs; do if test "X$x" = "X$dir"; then haveit=yes break fi done if test -z "$haveit"; then rpathdirs="$rpathdirs $dir" fi haveit= for x in $ltrpathdirs; do if test "X$x" = "X$dir"; then haveit=yes break fi done if test -z "$haveit"; then ltrpathdirs="$ltrpathdirs $dir" fi fi ;; -l*) names_next_round="$names_next_round "`echo "X$dep" | sed -e 's/^X-l//'` ;; *.la) names_next_round="$names_next_round "`echo "X$dep" | sed -e 's,^X.*/,,' -e 's,^lib,,' -e 's,\.la$,,'` ;; *) LIBINTL="${LIBINTL}${LIBINTL:+ }$dep" LTLIBINTL="${LTLIBINTL}${LTLIBINTL:+ }$dep" ;; esac done fi else LIBINTL="${LIBINTL}${LIBINTL:+ }-l$name" LTLIBINTL="${LTLIBINTL}${LTLIBINTL:+ }-l$name" fi fi fi done done if test "X$rpathdirs" != "X"; then if test -n "$acl_hardcode_libdir_separator"; then alldirs= for found_dir in $rpathdirs; do alldirs="${alldirs}${alldirs:+$acl_hardcode_libdir_separator}$found_dir" done acl_save_libdir="$libdir" libdir="$alldirs" eval flag=\"$acl_hardcode_libdir_flag_spec\" libdir="$acl_save_libdir" LIBINTL="${LIBINTL}${LIBINTL:+ }$flag" else for found_dir in $rpathdirs; do acl_save_libdir="$libdir" libdir="$found_dir" eval flag=\"$acl_hardcode_libdir_flag_spec\" libdir="$acl_save_libdir" LIBINTL="${LIBINTL}${LIBINTL:+ }$flag" done fi fi if test "X$ltrpathdirs" != "X"; then for found_dir in $ltrpathdirs; do LTLIBINTL="${LTLIBINTL}${LTLIBINTL:+ }-R$found_dir" done fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for GNU gettext in libintl" >&5 $as_echo_n "checking for GNU gettext in libintl... " >&6; } if eval \${$gt_func_gnugettext_libintl+:} false; then : $as_echo_n "(cached) " >&6 else gt_save_CPPFLAGS="$CPPFLAGS" CPPFLAGS="$CPPFLAGS $INCINTL" gt_save_LIBS="$LIBS" LIBS="$LIBS $LIBINTL" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include $gt_revision_test_code extern int _nl_msg_cat_cntr; extern #ifdef __cplusplus "C" #endif const char *_nl_expand_alias (const char *); int main () { bindtextdomain ("", ""); return * gettext ("")$gt_expression_test_code + _nl_msg_cat_cntr + *_nl_expand_alias ("") ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : eval "$gt_func_gnugettext_libintl=yes" else eval "$gt_func_gnugettext_libintl=no" fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext if { eval "gt_val=\$$gt_func_gnugettext_libintl"; test "$gt_val" != yes; } && test -n "$LIBICONV"; then LIBS="$LIBS $LIBICONV" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include $gt_revision_test_code extern int _nl_msg_cat_cntr; extern #ifdef __cplusplus "C" #endif const char *_nl_expand_alias (const char *); int main () { bindtextdomain ("", ""); return * gettext ("")$gt_expression_test_code + _nl_msg_cat_cntr + *_nl_expand_alias ("") ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : LIBINTL="$LIBINTL $LIBICONV" LTLIBINTL="$LTLIBINTL $LTLIBICONV" eval "$gt_func_gnugettext_libintl=yes" fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext fi CPPFLAGS="$gt_save_CPPFLAGS" LIBS="$gt_save_LIBS" fi eval ac_res=\$$gt_func_gnugettext_libintl { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } fi if { eval "gt_val=\$$gt_func_gnugettext_libc"; test "$gt_val" = "yes"; } \ || { { eval "gt_val=\$$gt_func_gnugettext_libintl"; test "$gt_val" = "yes"; } \ && test "$PACKAGE" != gettext-runtime \ && test "$PACKAGE" != gettext-tools; }; then gt_use_preinstalled_gnugettext=yes else LIBINTL= LTLIBINTL= INCINTL= fi if test -n "$INTL_MACOSX_LIBS"; then if test "$gt_use_preinstalled_gnugettext" = "yes" \ || test "$nls_cv_use_gnu_gettext" = "yes"; then LIBINTL="$LIBINTL $INTL_MACOSX_LIBS" LTLIBINTL="$LTLIBINTL $INTL_MACOSX_LIBS" fi fi if test "$gt_use_preinstalled_gnugettext" = "yes" \ || test "$nls_cv_use_gnu_gettext" = "yes"; then $as_echo "#define ENABLE_NLS 1" >>confdefs.h else USE_NLS=no fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to use NLS" >&5 $as_echo_n "checking whether to use NLS... " >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: result: $USE_NLS" >&5 $as_echo "$USE_NLS" >&6; } if test "$USE_NLS" = "yes"; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking where the gettext function comes from" >&5 $as_echo_n "checking where the gettext function comes from... " >&6; } if test "$gt_use_preinstalled_gnugettext" = "yes"; then if { eval "gt_val=\$$gt_func_gnugettext_libintl"; test "$gt_val" = "yes"; }; then gt_source="external libintl" else gt_source="libc" fi else gt_source="included intl directory" fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $gt_source" >&5 $as_echo "$gt_source" >&6; } fi if test "$USE_NLS" = "yes"; then if test "$gt_use_preinstalled_gnugettext" = "yes"; then if { eval "gt_val=\$$gt_func_gnugettext_libintl"; test "$gt_val" = "yes"; }; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to link with libintl" >&5 $as_echo_n "checking how to link with libintl... " >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: result: $LIBINTL" >&5 $as_echo "$LIBINTL" >&6; } for element in $INCINTL; do haveit= for x in $CPPFLAGS; do acl_save_prefix="$prefix" prefix="$acl_final_prefix" acl_save_exec_prefix="$exec_prefix" exec_prefix="$acl_final_exec_prefix" eval x=\"$x\" exec_prefix="$acl_save_exec_prefix" prefix="$acl_save_prefix" if test "X$x" = "X$element"; then haveit=yes break fi done if test -z "$haveit"; then CPPFLAGS="${CPPFLAGS}${CPPFLAGS:+ }$element" fi done fi $as_echo "#define HAVE_GETTEXT 1" >>confdefs.h $as_echo "#define HAVE_DCGETTEXT 1" >>confdefs.h fi POSUB=po fi INTLLIBS="$LIBINTL" # Check whether --enable-argv0switch was given. if test "${enable_argv0switch+set}" = set; then : enableval=$enable_argv0switch; argv0switch="${enableval}" else argv0switch="no" fi if test "x${argv0switch}" = "xyes"; then $as_echo "#define WITH_ARGV0 1" >>confdefs.h fi # Extract the first word of "doxygen", so it can be a program name with args. set dummy doxygen; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_use_doxygen+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$use_doxygen"; then ac_cv_prog_use_doxygen="$use_doxygen" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in ${SYSPATH} do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_use_doxygen="yes" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS test -z "$ac_cv_prog_use_doxygen" && ac_cv_prog_use_doxygen="no" fi fi use_doxygen=$ac_cv_prog_use_doxygen if test -n "$use_doxygen"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $use_doxygen" >&5 $as_echo "$use_doxygen" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi # Check whether --with-docdir was given. if test "${with_docdir+set}" = set; then : withval=$with_docdir; else with_docdir=./DoxyDocs fi if test "x${with_docdir}" != "xno"; then DOXYGEN_DOCDIR="${with_docdir}" fi if test "x$use_doxygen" = "xyes"; then HAVE_DOXYGEN_TRUE= HAVE_DOXYGEN_FALSE='#' else HAVE_DOXYGEN_TRUE='#' HAVE_DOXYGEN_FALSE= fi # Check whether --with-systemd was given. if test "${with_systemd+set}" = set; then : withval=$with_systemd; fi if test "x${with_systemd}" != "xyes"; then true fi if test "x$with_systemd" = "xyes"; then USE_SYSTEMD_TRUE= USE_SYSTEMD_FALSE='#' else USE_SYSTEMD_TRUE='#' USE_SYSTEMD_FALSE= fi $as_echo "#define CM_DEFAULT_CIPHER /**/" >>confdefs.h cat >>confdefs.h <<_ACEOF #define CM_DEFAULT_CIPHER "${CM_DEFAULT_CIPHER}" _ACEOF ac_config_files="$ac_config_files Makefile delegates.h man/Makefile man/fr/Makefile po/Makefile.in sysinit/Makefile testing/Makefile doxygen.conf" ac_config_headers="$ac_config_headers config.h" cat >confcache <<\_ACEOF # This file is a shell script that caches the results of configure # tests run on this system so they can be shared between configure # scripts and configure runs, see configure's option --config-cache. # It is not useful on other systems. If it contains results you don't # want to keep, you may remove or edit it. # # config.status only pays attention to the cache file if you give it # the --recheck option to rerun configure. # # `ac_cv_env_foo' variables (set or unset) will be overridden when # loading this file, other *unset* `ac_cv_foo' will be assigned the # following values. _ACEOF # The following way of writing the cache mishandles newlines in values, # but we know of no workaround that is simple, portable, and efficient. # So, we kill variables containing newlines. # Ultrix sh set writes to stderr and can't be redirected directly, # and sets the high bit in the cache file unless we assign to the vars. ( for ac_var in `(set) 2>&1 | sed -n 's/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'`; do eval ac_val=\$$ac_var case $ac_val in #( *${as_nl}*) case $ac_var in #( *_cv_*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5 $as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;; esac case $ac_var in #( _ | IFS | as_nl) ;; #( BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #( *) { eval $ac_var=; unset $ac_var;} ;; esac ;; esac done (set) 2>&1 | case $as_nl`(ac_space=' '; set) 2>&1` in #( *${as_nl}ac_space=\ *) # `set' does not quote correctly, so add quotes: double-quote # substitution turns \\\\ into \\, and sed turns \\ into \. sed -n \ "s/'/'\\\\''/g; s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\\2'/p" ;; #( *) # `set' quotes correctly as required by POSIX, so do not add quotes. sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p" ;; esac | sort ) | sed ' /^ac_cv_env_/b end t clear :clear s/^\([^=]*\)=\(.*[{}].*\)$/test "${\1+set}" = set || &/ t end s/^\([^=]*\)=\(.*\)$/\1=${\1=\2}/ :end' >>confcache if diff "$cache_file" confcache >/dev/null 2>&1; then :; else if test -w "$cache_file"; then if test "x$cache_file" != "x/dev/null"; then { $as_echo "$as_me:${as_lineno-$LINENO}: updating cache $cache_file" >&5 $as_echo "$as_me: updating cache $cache_file" >&6;} if test ! -f "$cache_file" || test -h "$cache_file"; then cat confcache >"$cache_file" else case $cache_file in #( */* | ?:*) mv -f confcache "$cache_file"$$ && mv -f "$cache_file"$$ "$cache_file" ;; #( *) mv -f confcache "$cache_file" ;; esac fi fi else { $as_echo "$as_me:${as_lineno-$LINENO}: not updating unwritable cache $cache_file" >&5 $as_echo "$as_me: not updating unwritable cache $cache_file" >&6;} fi fi rm -f confcache test "x$prefix" = xNONE && prefix=$ac_default_prefix # Let make expand exec_prefix. test "x$exec_prefix" = xNONE && exec_prefix='${prefix}' DEFS=-DHAVE_CONFIG_H ac_libobjs= ac_ltlibobjs= U= for ac_i in : $LIBOBJS; do test "x$ac_i" = x: && continue # 1. Remove the extension, and $U if already installed. ac_script='s/\$U\././;s/\.o$//;s/\.obj$//' ac_i=`$as_echo "$ac_i" | sed "$ac_script"` # 2. Prepend LIBOBJDIR. When used with automake>=1.10 LIBOBJDIR # will be set to the directory where LIBOBJS objects are built. as_fn_append ac_libobjs " \${LIBOBJDIR}$ac_i\$U.$ac_objext" as_fn_append ac_ltlibobjs " \${LIBOBJDIR}$ac_i"'$U.lo' done LIBOBJS=$ac_libobjs LTLIBOBJS=$ac_ltlibobjs { $as_echo "$as_me:${as_lineno-$LINENO}: checking that generated files are newer than configure" >&5 $as_echo_n "checking that generated files are newer than configure... " >&6; } if test -n "$am_sleep_pid"; then # Hide warnings about reused PIDs. wait $am_sleep_pid 2>/dev/null fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: done" >&5 $as_echo "done" >&6; } if test -n "$EXEEXT"; then am__EXEEXT_TRUE= am__EXEEXT_FALSE='#' else am__EXEEXT_TRUE='#' am__EXEEXT_FALSE= fi if test -z "${BUILD_LUKSCOMPAT_TRUE}" && test -z "${BUILD_LUKSCOMPAT_FALSE}"; then as_fn_error $? "conditional \"BUILD_LUKSCOMPAT\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${HAVE_DOXYGEN_TRUE}" && test -z "${HAVE_DOXYGEN_FALSE}"; then as_fn_error $? "conditional \"HAVE_DOXYGEN\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${USE_SYSTEMD_TRUE}" && test -z "${USE_SYSTEMD_FALSE}"; then as_fn_error $? "conditional \"USE_SYSTEMD\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi : "${CONFIG_STATUS=./config.status}" ac_write_fail=0 ac_clean_files_save=$ac_clean_files ac_clean_files="$ac_clean_files $CONFIG_STATUS" { $as_echo "$as_me:${as_lineno-$LINENO}: creating $CONFIG_STATUS" >&5 $as_echo "$as_me: creating $CONFIG_STATUS" >&6;} as_write_fail=0 cat >$CONFIG_STATUS <<_ASEOF || as_write_fail=1 #! $SHELL # Generated by $as_me. # Run this file to recreate the current configuration. # Compiler output produced by configure, useful for debugging # configure, is in config.log if it exists. debug=false ac_cs_recheck=false ac_cs_silent=false SHELL=\${CONFIG_SHELL-$SHELL} export SHELL _ASEOF cat >>$CONFIG_STATUS <<\_ASEOF || as_write_fail=1 ## -------------------- ## ## M4sh Initialization. ## ## -------------------- ## # Be more Bourne compatible DUALCASE=1; export DUALCASE # for MKS sh if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then : emulate sh NULLCMD=: # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which # is contrary to our usage. Disable this feature. alias -g '${1+"$@"}'='"$@"' setopt NO_GLOB_SUBST else case `(set -o) 2>/dev/null` in #( *posix*) : set -o posix ;; #( *) : ;; esac fi as_nl=' ' export as_nl # Printing a long string crashes Solaris 7 /usr/bin/printf. as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo # Prefer a ksh shell builtin over an external printf program on Solaris, # but without wasting forks for bash or zsh. if test -z "$BASH_VERSION$ZSH_VERSION" \ && (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then as_echo='print -r --' as_echo_n='print -rn --' elif (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then as_echo='printf %s\n' as_echo_n='printf %s' else if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"' as_echo_n='/usr/ucb/echo -n' else as_echo_body='eval expr "X$1" : "X\\(.*\\)"' as_echo_n_body='eval arg=$1; case $arg in #( *"$as_nl"*) expr "X$arg" : "X\\(.*\\)$as_nl"; arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;; esac; expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl" ' export as_echo_n_body as_echo_n='sh -c $as_echo_n_body as_echo' fi export as_echo_body as_echo='sh -c $as_echo_body as_echo' fi # The user is always right. if test "${PATH_SEPARATOR+set}" != set; then PATH_SEPARATOR=: (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && { (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 || PATH_SEPARATOR=';' } fi # IFS # We need space, tab and new line, in precisely that order. Quoting is # there to prevent editors from complaining about space-tab. # (If _AS_PATH_WALK were called with IFS unset, it would disable word # splitting by setting IFS to empty value.) IFS=" "" $as_nl" # Find who we are. Look in the path if we contain no directory separator. as_myself= case $0 in #(( *[\\/]* ) as_myself=$0 ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break done IFS=$as_save_IFS ;; esac # We did not find ourselves, most probably we were run as `sh COMMAND' # in which case we are not to be found in the path. if test "x$as_myself" = x; then as_myself=$0 fi if test ! -f "$as_myself"; then $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 exit 1 fi # Unset variables that we do not need and which cause bugs (e.g. in # pre-3.0 UWIN ksh). But do not cause bugs in bash 2.01; the "|| exit 1" # suppresses any "Segmentation fault" message there. '((' could # trigger a bug in pdksh 5.2.14. for as_var in BASH_ENV ENV MAIL MAILPATH do eval test x\${$as_var+set} = xset \ && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || : done PS1='$ ' PS2='> ' PS4='+ ' # NLS nuisances. LC_ALL=C export LC_ALL LANGUAGE=C export LANGUAGE # CDPATH. (unset CDPATH) >/dev/null 2>&1 && unset CDPATH # as_fn_error STATUS ERROR [LINENO LOG_FD] # ---------------------------------------- # Output "`basename $0`: error: ERROR" to stderr. If LINENO and LOG_FD are # provided, also output the error to LOG_FD, referencing LINENO. Then exit the # script with STATUS, using 1 if that was 0. as_fn_error () { as_status=$1; test $as_status -eq 0 && as_status=1 if test "$4"; then as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack $as_echo "$as_me:${as_lineno-$LINENO}: error: $2" >&$4 fi $as_echo "$as_me: error: $2" >&2 as_fn_exit $as_status } # as_fn_error # as_fn_set_status STATUS # ----------------------- # Set $? to STATUS, without forking. as_fn_set_status () { return $1 } # as_fn_set_status # as_fn_exit STATUS # ----------------- # Exit the shell with STATUS, even in a "trap 0" or "set -e" context. as_fn_exit () { set +e as_fn_set_status $1 exit $1 } # as_fn_exit # as_fn_unset VAR # --------------- # Portably unset VAR. as_fn_unset () { { eval $1=; unset $1;} } as_unset=as_fn_unset # as_fn_append VAR VALUE # ---------------------- # Append the text in VALUE to the end of the definition contained in VAR. Take # advantage of any shell optimizations that allow amortized linear growth over # repeated appends, instead of the typical quadratic growth present in naive # implementations. if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null; then : eval 'as_fn_append () { eval $1+=\$2 }' else as_fn_append () { eval $1=\$$1\$2 } fi # as_fn_append # as_fn_arith ARG... # ------------------ # Perform arithmetic evaluation on the ARGs, and store the result in the # global $as_val. Take advantage of shells that can avoid forks. The arguments # must be portable across $(()) and expr. if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null; then : eval 'as_fn_arith () { as_val=$(( $* )) }' else as_fn_arith () { as_val=`expr "$@" || test $? -eq 1` } fi # as_fn_arith if expr a : '\(a\)' >/dev/null 2>&1 && test "X`expr 00001 : '.*\(...\)'`" = X001; then as_expr=expr else as_expr=false fi if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then as_basename=basename else as_basename=false fi if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then as_dirname=dirname else as_dirname=false fi as_me=`$as_basename -- "$0" || $as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ X"$0" : 'X\(//\)$' \| \ X"$0" : 'X\(/\)' \| . 2>/dev/null || $as_echo X/"$0" | sed '/^.*\/\([^/][^/]*\)\/*$/{ s//\1/ q } /^X\/\(\/\/\)$/{ s//\1/ q } /^X\/\(\/\).*/{ s//\1/ q } s/.*/./; q'` # Avoid depending upon Character Ranges. as_cr_letters='abcdefghijklmnopqrstuvwxyz' as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' as_cr_Letters=$as_cr_letters$as_cr_LETTERS as_cr_digits='0123456789' as_cr_alnum=$as_cr_Letters$as_cr_digits ECHO_C= ECHO_N= ECHO_T= case `echo -n x` in #((((( -n*) case `echo 'xy\c'` in *c*) ECHO_T=' ';; # ECHO_T is single tab character. xy) ECHO_C='\c';; *) echo `echo ksh88 bug on AIX 6.1` > /dev/null ECHO_T=' ';; esac;; *) ECHO_N='-n';; esac rm -f conf$$ conf$$.exe conf$$.file if test -d conf$$.dir; then rm -f conf$$.dir/conf$$.file else rm -f conf$$.dir mkdir conf$$.dir 2>/dev/null fi if (echo >conf$$.file) 2>/dev/null; then if ln -s conf$$.file conf$$ 2>/dev/null; then as_ln_s='ln -s' # ... but there are two gotchas: # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail. # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable. # In both cases, we have to default to `cp -pR'. ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || as_ln_s='cp -pR' elif ln conf$$.file conf$$ 2>/dev/null; then as_ln_s=ln else as_ln_s='cp -pR' fi else as_ln_s='cp -pR' fi rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file rmdir conf$$.dir 2>/dev/null # as_fn_mkdir_p # ------------- # Create "$as_dir" as a directory, including parents if necessary. as_fn_mkdir_p () { case $as_dir in #( -*) as_dir=./$as_dir;; esac test -d "$as_dir" || eval $as_mkdir_p || { as_dirs= while :; do case $as_dir in #( *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'( *) as_qdir=$as_dir;; esac as_dirs="'$as_qdir' $as_dirs" as_dir=`$as_dirname -- "$as_dir" || $as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$as_dir" : 'X\(//\)[^/]' \| \ X"$as_dir" : 'X\(//\)$' \| \ X"$as_dir" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$as_dir" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` test -d "$as_dir" && break done test -z "$as_dirs" || eval "mkdir $as_dirs" } || test -d "$as_dir" || as_fn_error $? "cannot create directory $as_dir" } # as_fn_mkdir_p if mkdir -p . 2>/dev/null; then as_mkdir_p='mkdir -p "$as_dir"' else test -d ./-p && rmdir ./-p as_mkdir_p=false fi # as_fn_executable_p FILE # ----------------------- # Test if FILE is an executable regular file. as_fn_executable_p () { test -f "$1" && test -x "$1" } # as_fn_executable_p as_test_x='test -x' as_executable_p=as_fn_executable_p # Sed expression to map a string onto a valid CPP name. as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" # Sed expression to map a string onto a valid variable name. as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" exec 6>&1 ## ----------------------------------- ## ## Main body of $CONFIG_STATUS script. ## ## ----------------------------------- ## _ASEOF test $as_write_fail = 0 && chmod +x $CONFIG_STATUS || ac_write_fail=1 cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # Save the log message, to keep $0 and so on meaningful, and to # report actual input values of CONFIG_FILES etc. instead of their # values after options handling. ac_log=" This file was extended by cryptmount $as_me 5.2, which was generated by GNU Autoconf 2.69. Invocation command line was CONFIG_FILES = $CONFIG_FILES CONFIG_HEADERS = $CONFIG_HEADERS CONFIG_LINKS = $CONFIG_LINKS CONFIG_COMMANDS = $CONFIG_COMMANDS $ $0 $@ on `(hostname || uname -n) 2>/dev/null | sed 1q` " _ACEOF case $ac_config_files in *" "*) set x $ac_config_files; shift; ac_config_files=$*;; esac case $ac_config_headers in *" "*) set x $ac_config_headers; shift; ac_config_headers=$*;; esac cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 # Files that config.status was made for. config_files="$ac_config_files" config_headers="$ac_config_headers" config_commands="$ac_config_commands" _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 ac_cs_usage="\ \`$as_me' instantiates files and other configuration actions from templates according to the current configuration. Unless the files and actions are specified as TAGs, all are instantiated by default. Usage: $0 [OPTION]... [TAG]... -h, --help print this help, then exit -V, --version print version number and configuration settings, then exit --config print configuration, then exit -q, --quiet, --silent do not print progress messages -d, --debug don't remove temporary files --recheck update $as_me by reconfiguring in the same conditions --file=FILE[:TEMPLATE] instantiate the configuration file FILE --header=FILE[:TEMPLATE] instantiate the configuration header FILE Configuration files: $config_files Configuration headers: $config_headers Configuration commands: $config_commands Report bugs to ." _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`" ac_cs_version="\\ cryptmount config.status 5.2 configured by $0, generated by GNU Autoconf 2.69, with options \\"\$ac_cs_config\\" Copyright (C) 2012 Free Software Foundation, Inc. This config.status script is free software; the Free Software Foundation gives unlimited permission to copy, distribute and modify it." ac_pwd='$ac_pwd' srcdir='$srcdir' INSTALL='$INSTALL' MKDIR_P='$MKDIR_P' AWK='$AWK' test -n "\$AWK" || AWK=awk _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # The default lists apply if the user does not specify any file. ac_need_defaults=: while test $# != 0 do case $1 in --*=?*) ac_option=`expr "X$1" : 'X\([^=]*\)='` ac_optarg=`expr "X$1" : 'X[^=]*=\(.*\)'` ac_shift=: ;; --*=) ac_option=`expr "X$1" : 'X\([^=]*\)='` ac_optarg= ac_shift=: ;; *) ac_option=$1 ac_optarg=$2 ac_shift=shift ;; esac case $ac_option in # Handling of the options. -recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r) ac_cs_recheck=: ;; --version | --versio | --versi | --vers | --ver | --ve | --v | -V ) $as_echo "$ac_cs_version"; exit ;; --config | --confi | --conf | --con | --co | --c ) $as_echo "$ac_cs_config"; exit ;; --debug | --debu | --deb | --de | --d | -d ) debug=: ;; --file | --fil | --fi | --f ) $ac_shift case $ac_optarg in *\'*) ac_optarg=`$as_echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;; '') as_fn_error $? "missing file argument" ;; esac as_fn_append CONFIG_FILES " '$ac_optarg'" ac_need_defaults=false;; --header | --heade | --head | --hea ) $ac_shift case $ac_optarg in *\'*) ac_optarg=`$as_echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;; esac as_fn_append CONFIG_HEADERS " '$ac_optarg'" ac_need_defaults=false;; --he | --h) # Conflict between --help and --header as_fn_error $? "ambiguous option: \`$1' Try \`$0 --help' for more information.";; --help | --hel | -h ) $as_echo "$ac_cs_usage"; exit ;; -q | -quiet | --quiet | --quie | --qui | --qu | --q \ | -silent | --silent | --silen | --sile | --sil | --si | --s) ac_cs_silent=: ;; # This is an error. -*) as_fn_error $? "unrecognized option: \`$1' Try \`$0 --help' for more information." ;; *) as_fn_append ac_config_targets " $1" ac_need_defaults=false ;; esac shift done ac_configure_extra_args= if $ac_cs_silent; then exec 6>/dev/null ac_configure_extra_args="$ac_configure_extra_args --silent" fi _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 if \$ac_cs_recheck; then set X $SHELL '$0' $ac_configure_args \$ac_configure_extra_args --no-create --no-recursion shift \$as_echo "running CONFIG_SHELL=$SHELL \$*" >&6 CONFIG_SHELL='$SHELL' export CONFIG_SHELL exec "\$@" fi _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 exec 5>>config.log { echo sed 'h;s/./-/g;s/^.../## /;s/...$/ ##/;p;x;p;x' <<_ASBOX ## Running $as_me. ## _ASBOX $as_echo "$ac_log" } >&5 _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 # # INIT-COMMANDS # # Capture the value of obsolete ALL_LINGUAS because we need it to compute # POFILES, UPDATEPOFILES, DUMMYPOFILES, GMOFILES, CATALOGS. But hide it # from automake < 1.5. eval 'OBSOLETE_ALL_LINGUAS''="$ALL_LINGUAS"' # Capture the value of LINGUAS because we need it to compute CATALOGS. LINGUAS="${LINGUAS-%UNSET%}" _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # Handling of arguments. for ac_config_target in $ac_config_targets do case $ac_config_target in "po-directories") CONFIG_COMMANDS="$CONFIG_COMMANDS po-directories" ;; "Makefile") CONFIG_FILES="$CONFIG_FILES Makefile" ;; "delegates.h") CONFIG_FILES="$CONFIG_FILES delegates.h" ;; "man/Makefile") CONFIG_FILES="$CONFIG_FILES man/Makefile" ;; "man/fr/Makefile") CONFIG_FILES="$CONFIG_FILES man/fr/Makefile" ;; "po/Makefile.in") CONFIG_FILES="$CONFIG_FILES po/Makefile.in" ;; "sysinit/Makefile") CONFIG_FILES="$CONFIG_FILES sysinit/Makefile" ;; "testing/Makefile") CONFIG_FILES="$CONFIG_FILES testing/Makefile" ;; "doxygen.conf") CONFIG_FILES="$CONFIG_FILES doxygen.conf" ;; "config.h") CONFIG_HEADERS="$CONFIG_HEADERS config.h" ;; *) as_fn_error $? "invalid argument: \`$ac_config_target'" "$LINENO" 5;; esac done # If the user did not use the arguments to specify the items to instantiate, # then the envvar interface is used. Set only those that are not. # We use the long form for the default assignment because of an extremely # bizarre bug on SunOS 4.1.3. if $ac_need_defaults; then test "${CONFIG_FILES+set}" = set || CONFIG_FILES=$config_files test "${CONFIG_HEADERS+set}" = set || CONFIG_HEADERS=$config_headers test "${CONFIG_COMMANDS+set}" = set || CONFIG_COMMANDS=$config_commands fi # Have a temporary directory for convenience. Make it in the build tree # simply because there is no reason against having it here, and in addition, # creating and moving files from /tmp can sometimes cause problems. # Hook for its removal unless debugging. # Note that there is a small window in which the directory will not be cleaned: # after its creation but before its name has been assigned to `$tmp'. $debug || { tmp= ac_tmp= trap 'exit_status=$? : "${ac_tmp:=$tmp}" { test ! -d "$ac_tmp" || rm -fr "$ac_tmp"; } && exit $exit_status ' 0 trap 'as_fn_exit 1' 1 2 13 15 } # Create a (secure) tmp directory for tmp files. { tmp=`(umask 077 && mktemp -d "./confXXXXXX") 2>/dev/null` && test -d "$tmp" } || { tmp=./conf$$-$RANDOM (umask 077 && mkdir "$tmp") } || as_fn_error $? "cannot create a temporary directory in ." "$LINENO" 5 ac_tmp=$tmp # Set up the scripts for CONFIG_FILES section. # No need to generate them if there are no CONFIG_FILES. # This happens for instance with `./config.status config.h'. if test -n "$CONFIG_FILES"; then ac_cr=`echo X | tr X '\015'` # On cygwin, bash can eat \r inside `` if the user requested igncr. # But we know of no other shell where ac_cr would be empty at this # point, so we can use a bashism as a fallback. if test "x$ac_cr" = x; then eval ac_cr=\$\'\\r\' fi ac_cs_awk_cr=`$AWK 'BEGIN { print "a\rb" }' /dev/null` if test "$ac_cs_awk_cr" = "a${ac_cr}b"; then ac_cs_awk_cr='\\r' else ac_cs_awk_cr=$ac_cr fi echo 'BEGIN {' >"$ac_tmp/subs1.awk" && _ACEOF { echo "cat >conf$$subs.awk <<_ACEOF" && echo "$ac_subst_vars" | sed 's/.*/&!$&$ac_delim/' && echo "_ACEOF" } >conf$$subs.sh || as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 ac_delim_num=`echo "$ac_subst_vars" | grep -c '^'` ac_delim='%!_!# ' for ac_last_try in false false false false false :; do . ./conf$$subs.sh || as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 ac_delim_n=`sed -n "s/.*$ac_delim\$/X/p" conf$$subs.awk | grep -c X` if test $ac_delim_n = $ac_delim_num; then break elif $ac_last_try; then as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 else ac_delim="$ac_delim!$ac_delim _$ac_delim!! " fi done rm -f conf$$subs.sh cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 cat >>"\$ac_tmp/subs1.awk" <<\\_ACAWK && _ACEOF sed -n ' h s/^/S["/; s/!.*/"]=/ p g s/^[^!]*!// :repl t repl s/'"$ac_delim"'$// t delim :nl h s/\(.\{148\}\)..*/\1/ t more1 s/["\\]/\\&/g; s/^/"/; s/$/\\n"\\/ p n b repl :more1 s/["\\]/\\&/g; s/^/"/; s/$/"\\/ p g s/.\{148\}// t nl :delim h s/\(.\{148\}\)..*/\1/ t more2 s/["\\]/\\&/g; s/^/"/; s/$/"/ p b :more2 s/["\\]/\\&/g; s/^/"/; s/$/"\\/ p g s/.\{148\}// t delim ' >$CONFIG_STATUS || ac_write_fail=1 rm -f conf$$subs.awk cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 _ACAWK cat >>"\$ac_tmp/subs1.awk" <<_ACAWK && for (key in S) S_is_set[key] = 1 FS = "" } { line = $ 0 nfields = split(line, field, "@") substed = 0 len = length(field[1]) for (i = 2; i < nfields; i++) { key = field[i] keylen = length(key) if (S_is_set[key]) { value = S[key] line = substr(line, 1, len) "" value "" substr(line, len + keylen + 3) len += length(value) + length(field[++i]) substed = 1 } else len += 1 + keylen } print line } _ACAWK _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 if sed "s/$ac_cr//" < /dev/null > /dev/null 2>&1; then sed "s/$ac_cr\$//; s/$ac_cr/$ac_cs_awk_cr/g" else cat fi < "$ac_tmp/subs1.awk" > "$ac_tmp/subs.awk" \ || as_fn_error $? "could not setup config files machinery" "$LINENO" 5 _ACEOF # VPATH may cause trouble with some makes, so we remove sole $(srcdir), # ${srcdir} and @srcdir@ entries from VPATH if srcdir is ".", strip leading and # trailing colons and then remove the whole line if VPATH becomes empty # (actually we leave an empty line to preserve line numbers). if test "x$srcdir" = x.; then ac_vpsub='/^[ ]*VPATH[ ]*=[ ]*/{ h s/// s/^/:/ s/[ ]*$/:/ s/:\$(srcdir):/:/g s/:\${srcdir}:/:/g s/:@srcdir@:/:/g s/^:*// s/:*$// x s/\(=[ ]*\).*/\1/ G s/\n// s/^[^=]*=[ ]*$// }' fi cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 fi # test -n "$CONFIG_FILES" # Set up the scripts for CONFIG_HEADERS section. # No need to generate them if there are no CONFIG_HEADERS. # This happens for instance with `./config.status Makefile'. if test -n "$CONFIG_HEADERS"; then cat >"$ac_tmp/defines.awk" <<\_ACAWK || BEGIN { _ACEOF # Transform confdefs.h into an awk script `defines.awk', embedded as # here-document in config.status, that substitutes the proper values into # config.h.in to produce config.h. # Create a delimiter string that does not exist in confdefs.h, to ease # handling of long lines. ac_delim='%!_!# ' for ac_last_try in false false :; do ac_tt=`sed -n "/$ac_delim/p" confdefs.h` if test -z "$ac_tt"; then break elif $ac_last_try; then as_fn_error $? "could not make $CONFIG_HEADERS" "$LINENO" 5 else ac_delim="$ac_delim!$ac_delim _$ac_delim!! " fi done # For the awk script, D is an array of macro values keyed by name, # likewise P contains macro parameters if any. Preserve backslash # newline sequences. ac_word_re=[_$as_cr_Letters][_$as_cr_alnum]* sed -n ' s/.\{148\}/&'"$ac_delim"'/g t rset :rset s/^[ ]*#[ ]*define[ ][ ]*/ / t def d :def s/\\$// t bsnl s/["\\]/\\&/g s/^ \('"$ac_word_re"'\)\(([^()]*)\)[ ]*\(.*\)/P["\1"]="\2"\ D["\1"]=" \3"/p s/^ \('"$ac_word_re"'\)[ ]*\(.*\)/D["\1"]=" \2"/p d :bsnl s/["\\]/\\&/g s/^ \('"$ac_word_re"'\)\(([^()]*)\)[ ]*\(.*\)/P["\1"]="\2"\ D["\1"]=" \3\\\\\\n"\\/p t cont s/^ \('"$ac_word_re"'\)[ ]*\(.*\)/D["\1"]=" \2\\\\\\n"\\/p t cont d :cont n s/.\{148\}/&'"$ac_delim"'/g t clear :clear s/\\$// t bsnlc s/["\\]/\\&/g; s/^/"/; s/$/"/p d :bsnlc s/["\\]/\\&/g; s/^/"/; s/$/\\\\\\n"\\/p b cont ' >$CONFIG_STATUS || ac_write_fail=1 cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 for (key in D) D_is_set[key] = 1 FS = "" } /^[\t ]*#[\t ]*(define|undef)[\t ]+$ac_word_re([\t (]|\$)/ { line = \$ 0 split(line, arg, " ") if (arg[1] == "#") { defundef = arg[2] mac1 = arg[3] } else { defundef = substr(arg[1], 2) mac1 = arg[2] } split(mac1, mac2, "(") #) macro = mac2[1] prefix = substr(line, 1, index(line, defundef) - 1) if (D_is_set[macro]) { # Preserve the white space surrounding the "#". print prefix "define", macro P[macro] D[macro] next } else { # Replace #undef with comments. This is necessary, for example, # in the case of _POSIX_SOURCE, which is predefined and required # on some systems where configure will not decide to define it. if (defundef == "undef") { print "/*", prefix defundef, macro, "*/" next } } } { print } _ACAWK _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 as_fn_error $? "could not setup config headers machinery" "$LINENO" 5 fi # test -n "$CONFIG_HEADERS" eval set X " :F $CONFIG_FILES :H $CONFIG_HEADERS :C $CONFIG_COMMANDS" shift for ac_tag do case $ac_tag in :[FHLC]) ac_mode=$ac_tag; continue;; esac case $ac_mode$ac_tag in :[FHL]*:*);; :L* | :C*:*) as_fn_error $? "invalid tag \`$ac_tag'" "$LINENO" 5;; :[FH]-) ac_tag=-:-;; :[FH]*) ac_tag=$ac_tag:$ac_tag.in;; esac ac_save_IFS=$IFS IFS=: set x $ac_tag IFS=$ac_save_IFS shift ac_file=$1 shift case $ac_mode in :L) ac_source=$1;; :[FH]) ac_file_inputs= for ac_f do case $ac_f in -) ac_f="$ac_tmp/stdin";; *) # Look for the file first in the build tree, then in the source tree # (if the path is not absolute). The absolute path cannot be DOS-style, # because $ac_f cannot contain `:'. test -f "$ac_f" || case $ac_f in [\\/$]*) false;; *) test -f "$srcdir/$ac_f" && ac_f="$srcdir/$ac_f";; esac || as_fn_error 1 "cannot find input file: \`$ac_f'" "$LINENO" 5;; esac case $ac_f in *\'*) ac_f=`$as_echo "$ac_f" | sed "s/'/'\\\\\\\\''/g"`;; esac as_fn_append ac_file_inputs " '$ac_f'" done # Let's still pretend it is `configure' which instantiates (i.e., don't # use $as_me), people would be surprised to read: # /* config.h. Generated by config.status. */ configure_input='Generated from '` $as_echo "$*" | sed 's|^[^:]*/||;s|:[^:]*/|, |g' `' by configure.' if test x"$ac_file" != x-; then configure_input="$ac_file. $configure_input" { $as_echo "$as_me:${as_lineno-$LINENO}: creating $ac_file" >&5 $as_echo "$as_me: creating $ac_file" >&6;} fi # Neutralize special characters interpreted by sed in replacement strings. case $configure_input in #( *\&* | *\|* | *\\* ) ac_sed_conf_input=`$as_echo "$configure_input" | sed 's/[\\\\&|]/\\\\&/g'`;; #( *) ac_sed_conf_input=$configure_input;; esac case $ac_tag in *:-:* | *:-) cat >"$ac_tmp/stdin" \ || as_fn_error $? "could not create $ac_file" "$LINENO" 5 ;; esac ;; esac ac_dir=`$as_dirname -- "$ac_file" || $as_expr X"$ac_file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$ac_file" : 'X\(//\)[^/]' \| \ X"$ac_file" : 'X\(//\)$' \| \ X"$ac_file" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$ac_file" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` as_dir="$ac_dir"; as_fn_mkdir_p ac_builddir=. case "$ac_dir" in .) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'` # A ".." for each directory in $ac_dir_suffix. ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'` case $ac_top_builddir_sub in "") ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_top_build_prefix=$ac_top_builddir_sub/ ;; esac ;; esac ac_abs_top_builddir=$ac_pwd ac_abs_builddir=$ac_pwd$ac_dir_suffix # for backward compatibility: ac_top_builddir=$ac_top_build_prefix case $srcdir in .) # We are building in place. ac_srcdir=. ac_top_srcdir=$ac_top_builddir_sub ac_abs_top_srcdir=$ac_pwd ;; [\\/]* | ?:[\\/]* ) # Absolute name. ac_srcdir=$srcdir$ac_dir_suffix; ac_top_srcdir=$srcdir ac_abs_top_srcdir=$srcdir ;; *) # Relative name. ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix ac_top_srcdir=$ac_top_build_prefix$srcdir ac_abs_top_srcdir=$ac_pwd/$srcdir ;; esac ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix case $ac_mode in :F) # # CONFIG_FILE # case $INSTALL in [\\/$]* | ?:[\\/]* ) ac_INSTALL=$INSTALL ;; *) ac_INSTALL=$ac_top_build_prefix$INSTALL ;; esac ac_MKDIR_P=$MKDIR_P case $MKDIR_P in [\\/$]* | ?:[\\/]* ) ;; */*) ac_MKDIR_P=$ac_top_build_prefix$MKDIR_P ;; esac _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # If the template does not know about datarootdir, expand it. # FIXME: This hack should be removed a few years after 2.60. ac_datarootdir_hack=; ac_datarootdir_seen= ac_sed_dataroot=' /datarootdir/ { p q } /@datadir@/p /@docdir@/p /@infodir@/p /@localedir@/p /@mandir@/p' case `eval "sed -n \"\$ac_sed_dataroot\" $ac_file_inputs"` in *datarootdir*) ac_datarootdir_seen=yes;; *@datadir@*|*@docdir@*|*@infodir@*|*@localedir@*|*@mandir@*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&5 $as_echo "$as_me: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&2;} _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_datarootdir_hack=' s&@datadir@&$datadir&g s&@docdir@&$docdir&g s&@infodir@&$infodir&g s&@localedir@&$localedir&g s&@mandir@&$mandir&g s&\\\${datarootdir}&$datarootdir&g' ;; esac _ACEOF # Neutralize VPATH when `$srcdir' = `.'. # Shell code in configure.ac might set extrasub. # FIXME: do we really want to maintain this feature? cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_sed_extra="$ac_vpsub $extrasub _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 :t /@[a-zA-Z_][a-zA-Z_0-9]*@/!b s|@configure_input@|$ac_sed_conf_input|;t t s&@top_builddir@&$ac_top_builddir_sub&;t t s&@top_build_prefix@&$ac_top_build_prefix&;t t s&@srcdir@&$ac_srcdir&;t t s&@abs_srcdir@&$ac_abs_srcdir&;t t s&@top_srcdir@&$ac_top_srcdir&;t t s&@abs_top_srcdir@&$ac_abs_top_srcdir&;t t s&@builddir@&$ac_builddir&;t t s&@abs_builddir@&$ac_abs_builddir&;t t s&@abs_top_builddir@&$ac_abs_top_builddir&;t t s&@INSTALL@&$ac_INSTALL&;t t s&@MKDIR_P@&$ac_MKDIR_P&;t t $ac_datarootdir_hack " eval sed \"\$ac_sed_extra\" "$ac_file_inputs" | $AWK -f "$ac_tmp/subs.awk" \ >$ac_tmp/out || as_fn_error $? "could not create $ac_file" "$LINENO" 5 test -z "$ac_datarootdir_hack$ac_datarootdir_seen" && { ac_out=`sed -n '/\${datarootdir}/p' "$ac_tmp/out"`; test -n "$ac_out"; } && { ac_out=`sed -n '/^[ ]*datarootdir[ ]*:*=/p' \ "$ac_tmp/out"`; test -z "$ac_out"; } && { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file contains a reference to the variable \`datarootdir' which seems to be undefined. Please make sure it is defined" >&5 $as_echo "$as_me: WARNING: $ac_file contains a reference to the variable \`datarootdir' which seems to be undefined. Please make sure it is defined" >&2;} rm -f "$ac_tmp/stdin" case $ac_file in -) cat "$ac_tmp/out" && rm -f "$ac_tmp/out";; *) rm -f "$ac_file" && mv "$ac_tmp/out" "$ac_file";; esac \ || as_fn_error $? "could not create $ac_file" "$LINENO" 5 ;; :H) # # CONFIG_HEADER # if test x"$ac_file" != x-; then { $as_echo "/* $configure_input */" \ && eval '$AWK -f "$ac_tmp/defines.awk"' "$ac_file_inputs" } >"$ac_tmp/config.h" \ || as_fn_error $? "could not create $ac_file" "$LINENO" 5 if diff "$ac_file" "$ac_tmp/config.h" >/dev/null 2>&1; then { $as_echo "$as_me:${as_lineno-$LINENO}: $ac_file is unchanged" >&5 $as_echo "$as_me: $ac_file is unchanged" >&6;} else rm -f "$ac_file" mv "$ac_tmp/config.h" "$ac_file" \ || as_fn_error $? "could not create $ac_file" "$LINENO" 5 fi else $as_echo "/* $configure_input */" \ && eval '$AWK -f "$ac_tmp/defines.awk"' "$ac_file_inputs" \ || as_fn_error $? "could not create -" "$LINENO" 5 fi # Compute "$ac_file"'s index in $config_headers. _am_arg="$ac_file" _am_stamp_count=1 for _am_header in $config_headers :; do case $_am_header in $_am_arg | $_am_arg:* ) break ;; * ) _am_stamp_count=`expr $_am_stamp_count + 1` ;; esac done echo "timestamp for $_am_arg" >`$as_dirname -- "$_am_arg" || $as_expr X"$_am_arg" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$_am_arg" : 'X\(//\)[^/]' \| \ X"$_am_arg" : 'X\(//\)$' \| \ X"$_am_arg" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$_am_arg" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'`/stamp-h$_am_stamp_count ;; :C) { $as_echo "$as_me:${as_lineno-$LINENO}: executing $ac_file commands" >&5 $as_echo "$as_me: executing $ac_file commands" >&6;} ;; esac case $ac_file$ac_mode in "po-directories":C) for ac_file in $CONFIG_FILES; do # Support "outfile[:infile[:infile...]]" case "$ac_file" in *:*) ac_file=`echo "$ac_file"|sed 's%:.*%%'` ;; esac # PO directories have a Makefile.in generated from Makefile.in.in. case "$ac_file" in */Makefile.in) # Adjust a relative srcdir. ac_dir=`echo "$ac_file"|sed 's%/[^/][^/]*$%%'` ac_dir_suffix=/`echo "$ac_dir"|sed 's%^\./%%'` ac_dots=`echo "$ac_dir_suffix"|sed 's%/[^/]*%../%g'` # In autoconf-2.13 it is called $ac_given_srcdir. # In autoconf-2.50 it is called $srcdir. test -n "$ac_given_srcdir" || ac_given_srcdir="$srcdir" case "$ac_given_srcdir" in .) top_srcdir=`echo $ac_dots|sed 's%/$%%'` ;; /*) top_srcdir="$ac_given_srcdir" ;; *) top_srcdir="$ac_dots$ac_given_srcdir" ;; esac # Treat a directory as a PO directory if and only if it has a # POTFILES.in file. This allows packages to have multiple PO # directories under different names or in different locations. if test -f "$ac_given_srcdir/$ac_dir/POTFILES.in"; then rm -f "$ac_dir/POTFILES" test -n "$as_me" && echo "$as_me: creating $ac_dir/POTFILES" || echo "creating $ac_dir/POTFILES" gt_tab=`printf '\t'` cat "$ac_given_srcdir/$ac_dir/POTFILES.in" | sed -e "/^#/d" -e "/^[ ${gt_tab}]*\$/d" -e "s,.*, $top_srcdir/& \\\\," | sed -e "\$s/\(.*\) \\\\/\1/" > "$ac_dir/POTFILES" POMAKEFILEDEPS="POTFILES.in" # ALL_LINGUAS, POFILES, UPDATEPOFILES, DUMMYPOFILES, GMOFILES depend # on $ac_dir but don't depend on user-specified configuration # parameters. if test -f "$ac_given_srcdir/$ac_dir/LINGUAS"; then # The LINGUAS file contains the set of available languages. if test -n "$OBSOLETE_ALL_LINGUAS"; then test -n "$as_me" && echo "$as_me: setting ALL_LINGUAS in configure.in is obsolete" || echo "setting ALL_LINGUAS in configure.in is obsolete" fi ALL_LINGUAS_=`sed -e "/^#/d" -e "s/#.*//" "$ac_given_srcdir/$ac_dir/LINGUAS"` # Hide the ALL_LINGUAS assignment from automake < 1.5. eval 'ALL_LINGUAS''=$ALL_LINGUAS_' POMAKEFILEDEPS="$POMAKEFILEDEPS LINGUAS" else # The set of available languages was given in configure.in. # Hide the ALL_LINGUAS assignment from automake < 1.5. eval 'ALL_LINGUAS''=$OBSOLETE_ALL_LINGUAS' fi # Compute POFILES # as $(foreach lang, $(ALL_LINGUAS), $(srcdir)/$(lang).po) # Compute UPDATEPOFILES # as $(foreach lang, $(ALL_LINGUAS), $(lang).po-update) # Compute DUMMYPOFILES # as $(foreach lang, $(ALL_LINGUAS), $(lang).nop) # Compute GMOFILES # as $(foreach lang, $(ALL_LINGUAS), $(srcdir)/$(lang).gmo) case "$ac_given_srcdir" in .) srcdirpre= ;; *) srcdirpre='$(srcdir)/' ;; esac POFILES= UPDATEPOFILES= DUMMYPOFILES= GMOFILES= for lang in $ALL_LINGUAS; do POFILES="$POFILES $srcdirpre$lang.po" UPDATEPOFILES="$UPDATEPOFILES $lang.po-update" DUMMYPOFILES="$DUMMYPOFILES $lang.nop" GMOFILES="$GMOFILES $srcdirpre$lang.gmo" done # CATALOGS depends on both $ac_dir and the user's LINGUAS # environment variable. INST_LINGUAS= if test -n "$ALL_LINGUAS"; then for presentlang in $ALL_LINGUAS; do useit=no if test "%UNSET%" != "$LINGUAS"; then desiredlanguages="$LINGUAS" else desiredlanguages="$ALL_LINGUAS" fi for desiredlang in $desiredlanguages; do # Use the presentlang catalog if desiredlang is # a. equal to presentlang, or # b. a variant of presentlang (because in this case, # presentlang can be used as a fallback for messages # which are not translated in the desiredlang catalog). case "$desiredlang" in "$presentlang"*) useit=yes;; esac done if test $useit = yes; then INST_LINGUAS="$INST_LINGUAS $presentlang" fi done fi CATALOGS= if test -n "$INST_LINGUAS"; then for lang in $INST_LINGUAS; do CATALOGS="$CATALOGS $lang.gmo" done fi test -n "$as_me" && echo "$as_me: creating $ac_dir/Makefile" || echo "creating $ac_dir/Makefile" sed -e "/^POTFILES =/r $ac_dir/POTFILES" -e "/^# Makevars/r $ac_given_srcdir/$ac_dir/Makevars" -e "s|@POFILES@|$POFILES|g" -e "s|@UPDATEPOFILES@|$UPDATEPOFILES|g" -e "s|@DUMMYPOFILES@|$DUMMYPOFILES|g" -e "s|@GMOFILES@|$GMOFILES|g" -e "s|@CATALOGS@|$CATALOGS|g" -e "s|@POMAKEFILEDEPS@|$POMAKEFILEDEPS|g" "$ac_dir/Makefile.in" > "$ac_dir/Makefile" for f in "$ac_given_srcdir/$ac_dir"/Rules-*; do if test -f "$f"; then case "$f" in *.orig | *.bak | *~) ;; *) cat "$f" >> "$ac_dir/Makefile" ;; esac fi done fi ;; esac done ;; esac done # for ac_tag as_fn_exit 0 _ACEOF ac_clean_files=$ac_clean_files_save test $ac_write_fail = 0 || as_fn_error $? "write failure creating $CONFIG_STATUS" "$LINENO" 5 # configure is writing to config.log, and then calls config.status. # config.status does its own redirection, appending to config.log. # Unfortunately, on DOS this fails, as config.log is still kept open # by configure, so config.status won't be able to write to it; its # output is simply discarded. So we exec the FD to /dev/null, # effectively closing config.log, so it can be properly (re)opened and # appended to by config.status. When coming back to configure, we # need to make the FD available again. if test "$no_create" != yes; then ac_cs_success=: ac_config_status_args= test "$silent" = yes && ac_config_status_args="$ac_config_status_args --quiet" exec 5>/dev/null $SHELL $CONFIG_STATUS $ac_config_status_args || ac_cs_success=false exec 5>>config.log # Use ||, not &&, to avoid exiting from the if with $? = 1, which # would make configure fail if this is the last instruction. $ac_cs_success || as_fn_exit 1 fi if test -n "$ac_unrecognized_opts" && test "$enable_option_checking" != no; then { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: unrecognized options: $ac_unrecognized_opts" >&5 $as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2;} fi eval msg_conf="${CM_SYSCONF_DIR}" if test "${ERSATZ_MOUNT}" -ne 0; then msg_mount="(internal)"; else msg_mount="${PATH_MOUNT}"; fi if test "${ERSATZ_UMOUNT}" -ne 0; then msg_umount="(internal)"; else msg_umount="${PATH_UMOUNT}"; fi if test "${WITH_FSCK}" -ne 0; then msg_fsck="${PATH_FSCK}"; else msg_fsck="(disabled)"; fi msg_gcry="${libgcrypt}" if test "x${libgcrypt}" = "xyes"; then if test "x${sslcompat}" = "xyes"; then msg_gcry="${msg_gcry} (with OpenSSL emulator)"; else msg_gcry="${msg_gcry} (without OpenSSL emulator)"; fi fi msg_luks="${use_lukscompat}" { $as_echo "$as_me:${as_lineno-$LINENO}: cryptmount-${PACKAGE_VERSION} is now configured with: Source location: $srcdir Installation prefix: $prefix Configuration directory: $msg_conf Run-state directory: ${CM_SYSRUN_DIR} Filesystem mounting: $msg_mount Filesystem unmounting: $msg_umount Filesystem checking: $msg_fsck Crypto-swap support: $use_cswap libgcrypt support: $msg_gcry libudev support (EXPERIMENTAL): $udevlib LUKS support: $msg_luks " >&5 $as_echo "$as_me: cryptmount-${PACKAGE_VERSION} is now configured with: Source location: $srcdir Installation prefix: $prefix Configuration directory: $msg_conf Run-state directory: ${CM_SYSRUN_DIR} Filesystem mounting: $msg_mount Filesystem unmounting: $msg_umount Filesystem checking: $msg_fsck Crypto-swap support: $use_cswap libgcrypt support: $msg_gcry libudev support (EXPERIMENTAL): $udevlib LUKS support: $msg_luks " >&6;} cryptmount-5.2/utils.c0000644000175000017500000007244212612754537012056 00000000000000/* * Miscellaneous utility functions for cryptmount * (C)Copyright 2005-2015, RW Penney */ /* This file is part of cryptmount cryptmount is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. cryptmount is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. */ #include #include #include #include #include #include #include #include #include #include #if HAVE_TERMIOS # include #endif #include #include "cryptmount.h" #include "utils.h" #ifdef TESTING # include "cmtesting.h" #endif cm_string_t *cm_str_init(const char *val) /** Construct a new string object from a plain char* string */ { cm_string_t *str; if (val != NULL) { const size_t len = strlen(val); str = cm_str_alloc((len + 1)); memcpy(str->buffer, val, len + 1); str->size = len; } else { str = cm_str_alloc(32); } return str; } cm_string_t *cm_str_alloc(size_t bufflen) /** Construct a new string object of a specified size (including null) */ { cm_string_t *str; str = (cm_string_t*)malloc(sizeof(cm_string_t)); str->buffer = (char*)malloc(bufflen); if (bufflen > 0) str->buffer[0] = '\0'; str->bufflen = bufflen; str->size = 0; return str; } cm_string_t *cm_str_realloc(cm_string_t *str, size_t bufflen) /** Ensure that string object can contain at least bufflen bytes */ { if (str->bufflen < bufflen) { const size_t newbuff = 32 * (1 + (bufflen + 31) / 32); str->buffer = (char*)realloc(str->buffer, newbuff); str->bufflen = newbuff; } return str; } cm_string_t *cm_str_append(cm_string_t *str, const cm_string_t *addend) /** Concatenate addend onto str, reserving additional memory as needed */ { const size_t totlen = (str->size + addend->size); cm_str_realloc(str, (totlen + 1)); memcpy((void*)(str->buffer + str->size), addend->buffer, addend->size + 1); str->size = totlen; return str; } cm_string_t *cm_str_append_char(cm_string_t *str, const char addend) /** Concatenate addend onto str, reserving additional memory as needed */ { cm_str_realloc(str, (str->size + 2)); str->buffer[str->size] = addend; ++str->size; str->buffer[str->size] = '\0'; return str; } cm_string_t *cm_str_append_str(cm_string_t *str, const char *addend) /** Concatenate addend onto str, reserving additional memory as needed */ { const size_t addlen = (addend != NULL ? strlen(addend) : 0); cm_str_realloc(str, (str->size + addlen + 1)); memcpy((void*)(str->buffer + str->size), addend, addlen + 1); str->size += addlen; return str; } char *cm_str_strip(cm_string_t *str) /** Extract character buffer from string object, and dispose of container */ { char *buff = str->buffer; free((void*)str); return buff; } void cm_str_free(cm_string_t *str) /** Relinquish storage associated with string object */ { if (str == NULL) return; free((void*)str->buffer); free((void*)str); } #ifdef TESTING /*! \addtogroup unit_tests * @{ */ int ut_test_strings() /* Check enhanced basic class */ { cm_string_t *str, *str2; CM_TEST_START("String class methods"); str = cm_str_init("not much"); CM_ASSERT_STR_EQUAL("not much", str->buffer); cm_str_append_char(str, ' '); CM_ASSERT_STR_EQUAL("not much ", str->buffer); cm_str_append_str(str, "to see"); CM_ASSERT_STR_EQUAL("not much to see", str->buffer); str2 = cm_str_init(" here"); cm_str_append(str, str2); CM_ASSERT_STR_EQUAL("not much to see here", str->buffer); CM_ASSERT_EQUAL(20, str->size); if (str->bufflen <= str->size) CM_TEST_FAIL(); cm_str_free(str); cm_str_free(str2); CM_TEST_OK(); } /** @} */ #endif /* TESTING */ /** * Create full pathname of config file. * * The resulting path is allocated within \a buff, * whose length is returned. * * The path is calculated at runtime to allow * the built-in testing mechanisms to override the location * of configuration files via a command-line option, * when compiled with -DTESTING=1. */ int cm_path(char **buff, cm_path_prefix_t prefix_code, const char *file) { size_t pfxlen, sfxlen; const char *pfx = NULL; if (buff == NULL || file == NULL) return 0; #ifdef TESTING pfx = (test_ctxtptr->argconfigdir != NULL ? test_ctxtptr->argconfigdir : "/nowhere"); #else switch (prefix_code) { case CM_SYSCONF_PFX: pfx = CM_SYSCONF_DIR; break; case CM_SYSRUN_PFX: pfx = CM_SYSRUN_DIR; break; default: pfx = CM_SYSCONF_DIR; break; } #endif pfxlen = strlen(pfx); sfxlen = strlen(file); *buff = (char*)realloc((void*)(*buff), (pfxlen + sfxlen + 2)); snprintf(*buff, (pfxlen + sfxlen + 2), "%s/%s", pfx, file); return (int)(pfxlen + sfxlen + 1); } char *cm_strdup(const char *orig) /** Make duplicate of existing string, allocating memory for copy */ { char *cpy; if (orig == NULL) return NULL; cpy = (char*)malloc((size_t)(strlen(orig) + 1)); return strcpy(cpy, orig); } int cm_strcasecmp(const char *s1, const char *s2) /** Find legigraphical order of s1 & s2, ignoring case */ { if (s1 == NULL || s2 == NULL) return (s1 != NULL) - (s2 != NULL); while (*s1 != '\0' && *s2 != '\0' && tolower(*s1) == tolower(*s2)) { ++s1; ++s2; } return (tolower(*s1) - tolower(*s2)); } int cm_startswith(const char **str, const char *prefix) /** Check whether *prefix appears at start of **str */ { int valid=1; if (str == NULL) return 0; if (*str == NULL || prefix == NULL) return (*str == NULL && prefix == NULL); while (valid && *prefix != '\0') { valid &= (*prefix == **str); ++prefix; ++*str; } return valid; } #ifdef TESTING /*! \addtogroup unit_tests * @{ */ int ut_test_strops() /* Check basic string operations */ { const char *refstr="alphabet", *refp; CM_TEST_START("String operations"); CM_ASSERT_EQUAL(cm_strcasecmp("alpha", "alpha"), 0); CM_ASSERT_EQUAL(cm_strcasecmp("alpha", "ALPHA"), 0); CM_ASSERT_EQUAL(cm_strcasecmp("alpha", "beta"), -1); CM_ASSERT_EQUAL(cm_strcasecmp("alpha", "BETA"), -1); CM_ASSERT_EQUAL(cm_strcasecmp("beta", "alpha"), +1); CM_ASSERT_EQUAL(cm_strcasecmp("beta", "ALPHA"), +1); refp = refstr; CM_ASSERT_EQUAL(cm_startswith(&refp, "alpha"), 1); CM_ASSERT_EQUAL(strcmp(refp, "bet"), 0); refp = refstr; CM_ASSERT_EQUAL(cm_startswith(&refp, "alpa"), 0); CM_TEST_OK(); } /** @} */ #endif /* TESTING */ void *sec_realloc(void *ptr, size_t size) /** Slightly more secure version of realloc() */ { size_t cnt, *memarr; cnt = (size + 2 * sizeof(size_t) - 1) / sizeof(size_t); memarr = (size_t*)calloc(cnt, sizeof(size_t)); if (memarr == NULL) { fprintf(stderr, _("Unable to allocate memory\n")); abort(); return NULL; } /* Prepend usable memory chunk with record of size of chunk: */ memarr[0] = (cnt - 1) * sizeof(size_t); if (ptr != NULL) { size_t oldsz; /* Copy (usable) part of old memory block into new: */ oldsz = *(((size_t*)ptr) - 1); if (oldsz > size) oldsz = size; memcpy((void*)(memarr + 1), (const void*)ptr, oldsz); /* Dispose of old memory block: */ sec_free(ptr); } return (void*)(memarr + 1); } void mem_cleanse(uint8_t *addr, size_t sz) /** Overwrite memory with (weak) pseudo-random numbers */ { size_t i; static unsigned long salt=0x917c; salt ^= (unsigned long)addr; for (i=0; iname!=NULL; ++rndsrc) { struct stat sbuff; ssize_t nread; int fd = -1; if (stat(rndsrc->name, &sbuff) != 0) continue; if ((unsigned)major(sbuff.st_rdev) != rndsrc->devmaj || (unsigned)minor(sbuff.st_rdev) != rndsrc->devmin) continue; fd = open(rndsrc->name, O_RDONLY | O_NONBLOCK); if (fd < 0) continue; if (first) { nread = read(fd, pool, POOL_SIZE); if (nread > 0) total_entropy += nread; first = 0; } else { nread = read(fd, devbuff, NOISE_CHUNK); if (nread > 0) { total_entropy += nread; memmove(pool + nread, pool, (POOL_SIZE - nread)); memcpy(pool, devbuff, nread); } } close(fd); } sec_free(devbuff); if (total_entropy < 32) { fprintf(stderr, _("Too few random-number sources found\n")); eflag = WRN_LOWENTROPY; } /* Generate key-bytes by recursive hashing of entropy pool: */ pos = 0; while (pos < len) { cm_sha1_ctxt_t *mdcontext = cm_sha1_init(); /* Fold-in various sources of entropy: */ cm_sha1_block(mdcontext, pool, POOL_SIZE); cm_sha1_block(mdcontext, (uint8_t*)&pid, sizeof(pid)); clk = times(&tbuff); cm_sha1_block(mdcontext, (uint8_t*)&clk, sizeof(clk)); cm_sha1_block(mdcontext, (uint8_t*)&seed, sizeof(seed)); cm_sha1_block(mdcontext, (uint8_t*)&tbuff, sizeof(tbuff)); cm_sha1_final(mdcontext, &mdval, &mdlen); step = ((pos + mdlen) > len ? (len - pos) : mdlen); memcpy((void*)(buff + pos),(const void*)mdval, step); pos += step; memmove(pool + mdlen, pool, (POOL_SIZE - mdlen)); memcpy(pool, mdval, mdlen); seed = seed * 151 + 1279; cm_sha1_free(mdcontext); sec_free(mdval); } sec_free((void*)pool); return eflag; } ssize_t cm_ttygetpasswd(const char *prompt, char **buff) /* Read password from standard input terminal */ { ssize_t pwlen=0; #if HAVE_TERMIOS struct termios oldttystate, newttystate; int echook=1; char tmppass[2048]; #else char *tmppass=NULL; #endif #if HAVE_TERMIOS if (tcgetattr(fileno(stdin), &oldttystate) != 0) echook = 0; newttystate = oldttystate; newttystate.c_lflag &= ~ECHO; if (tcsetattr(fileno(stdin), TCSAFLUSH, &newttystate) != 0) echook = 0; if (tcgetattr(fileno(stdin), &newttystate) != 0 || (newttystate.c_lflag & ECHO) != 0) echook = 0; if (echook) { printf("%s", prompt); if (fgets(tmppass, (int)sizeof(tmppass), stdin) == NULL) { fprintf(stderr, _("Cannot read stdin")); return -1; } pwlen = strlen(tmppass); if (pwlen > 0 && tmppass[pwlen-1] == '\n') { tmppass[--pwlen] = '\0'; } *buff = (char*)sec_realloc((void*)*buff, (size_t)(pwlen+1)); strcpy(*buff, tmppass); mem_cleanse((uint8_t*)tmppass, sizeof(tmppass)); tcsetattr(fileno(stdin), TCSAFLUSH, &oldttystate); printf("\n"); } else { fprintf(stderr, _("Failed to turn off keyboard echoing on terminal\n")); pwlen = -1; } #else tmppass = getpass(prompt); pwlen = strlen(tmppass); *buff = sec_realloc((void*)*buff, (size_t)(pwlen+1)); strcpy(*buff, tmppass); mem_cleanse((uint8_t*)tmppass, (size_t)(pwlen+1)); #endif /* !HAVE_TERMIOS */ return pwlen; } int km_get_passwd(const char *ident, const km_pw_context_t *pw_ctxt, char **passwd, int isnew, int verify) /* Read password from terminal, possibly asking for confirmation */ { enum { BUFFSZ=2048 }; char *tmppass=NULL; ssize_t plen=0; int eflag=ERR_NOERROR; if (pw_ctxt != NULL && pw_ctxt->verify) verify |= 1; if (pw_ctxt == NULL || pw_ctxt->fd_pw_source == NULL) { #ifndef TESTING /* Read (+confirm) password from terminal: */ char prompt[BUFFSZ]; snprintf(prompt, sizeof(prompt), (isnew ? _("Enter new password for target \"%s\": ") : _("Enter password for target \"%s\": ")), ident); if (cm_ttygetpasswd(prompt, passwd) < 0) { eflag = ERR_BADPASSWD; goto bail_out; } if (verify) { snprintf(prompt, sizeof(prompt), _("Confirm password: ")); plen = cm_ttygetpasswd(prompt, &tmppass); if (strcmp(*passwd, tmppass) != 0) { fprintf(stderr, _("Password mismatch\n")); sec_free(*passwd); *passwd = NULL; eflag = ERR_BADPASSWD; } } #else /* TESTING */ /* Read passwords passed in via command-line arguments: */ const char *argpw; argpw = (pw_ctxt != NULL ? pw_ctxt->argpasswd[(isnew ? 1 : 0)] : NULL); *passwd = (char*)sec_realloc((void*)*passwd, (size_t)1024); strncpy(*passwd, (argpw != NULL ? argpw : ""), (size_t)1024); #endif } else { /* Read password (once only) from input stream: */ tmppass = (char*)sec_realloc(tmppass, (size_t)BUFFSZ); if (fgets(tmppass, BUFFSZ, pw_ctxt->fd_pw_source) == NULL) { eflag = ERR_BADFILE; goto bail_out; } /* Remove trailing carriage-return(s): */ plen = strlen(tmppass); while (plen > 0 && tmppass[plen-1] == '\n') tmppass[--plen] = '\0'; *passwd = (char*)sec_realloc(*passwd, (plen + 1)); strcpy(*passwd, tmppass); } bail_out: sec_free((void*)tmppass); return eflag; } int cm_confirm(const char *msg) /* Invite user to pause before taking dangerous action */ { char *affirmativeResponse=_("yes"); char response[64]; int rlen; if (msg != NULL) { printf("%s\n", msg); } fprintf(stdout, _("Are you sure? (Type \"%s\" to proceed): "), affirmativeResponse); if (fgets(response, (int)sizeof(response), stdin) == NULL) { fprintf(stderr, _("Cannot read stdin\n")); return 0; } rlen = strlen(response); if (rlen > 0 && response[rlen-1] == '\n') response[--rlen] = '\0'; return (cm_strcasecmp(response, affirmativeResponse) == 0); } unsigned km_aug_keysz(unsigned keylen, unsigned blksz) /* Calculate size of augmented cipher-key after appending checksum etc */ { return blksz * ((keylen + 2 * sizeof(uint32_t) + blksz - 1) / blksz); } uint8_t *km_aug_key(const uint8_t *key, unsigned keylen, unsigned blocksz, size_t *buffsz) /* Augment cipher key with checksum prior to encryption & storage */ { uint8_t *buff=NULL; uint32_t chksum, *kptr=NULL; size_t idx, cnt; *buffsz = km_aug_keysz(keylen, blocksz); buff = (uint8_t*)sec_realloc(buff, *buffsz); /* Copy key into zero-padded buffer: */ memset(buff, 0, (size_t)*buffsz); memcpy(buff, key, (size_t)keylen); /* Compute crude EOR checksum (invariant to byte-ordering): */ cnt = (keylen + sizeof(chksum) - 1) / sizeof(chksum); chksum = 0; kptr = (uint32_t*)buff; for (idx=0; idxmsglen = 0; ctxt->buffpos = 0; ctxt->H[0] = SHA1_H0; ctxt->H[1] = SHA1_H1; ctxt->H[2] = SHA1_H2; ctxt->H[3] = SHA1_H3; ctxt->H[4] = SHA1_H4; for (idx=0; idx<16; ++idx) ctxt->buff[idx] = 0; return ctxt; } void cm_sha1_block(cm_sha1_ctxt_t *ctxt, const uint8_t *buff, size_t len) { uint32_t W[80], A, B, C, D, E, q; unsigned idx, round; while (len > 0) { /* Accumulate bytes into buffer (respecting endianess): */ idx = ctxt->buffpos >> 2; round = 3 - (ctxt->buffpos & 0x03); ctxt->buff[idx] |= ((uint32_t)*buff) << (round * 8); ctxt->msglen += 8; ++ctxt->buffpos; ++buff; --len; if (ctxt->buffpos >= 64) { /* Whole 512-bit string is ready - apply SHA1 update to block: */ for (idx=0; idx<16; ++idx) W[idx] = ctxt->buff[idx]; for (idx=16; idx<80; ++idx) { q = W[idx-3] ^ W[idx-8] ^ W[idx-14] ^ W[idx-16]; W[idx] = ((q & 0x7fffffff)) << 1 | ((q & 0x80000000) >> 31); } A = ctxt->H[0]; B = ctxt->H[1]; C = ctxt->H[2]; D = ctxt->H[3]; E = ctxt->H[4]; for (round=0; round<80; ++round) { q = (((A & 0x07ffffff) << 5) | ((A & 0xf8000000) >> 27)) + E + W[round]; switch (round / 20) { case 0: q += ((B & C) | ((~B) & D)) + SHA1_K0; break; case 1: q += (B ^ C ^ D) + SHA1_K1; break; case 2: q += ((B & C) | (B & D) | (C & D)) + SHA1_K2; break; case 3: q += (B ^ C ^ D) + SHA1_K3; break; } E = D; D = C; C = ((B & 0xfffffffc) >> 2) | ((B & 0x03) << 30); B = A; A = q; } ctxt->H[0] += A; ctxt->H[1] += B; ctxt->H[2] += C; ctxt->H[3] += D; ctxt->H[4] += E; ctxt->buffpos = 0; for (idx=0; idx<16; ++idx) ctxt->buff[idx] = 0; } } } void cm_sha1_final(cm_sha1_ctxt_t *ctxt, uint8_t **mdval, size_t *mdlen) { uint8_t *cptr, buff[64], mrk=0x80; unsigned idx, padlen; uint32_t msglen; /* Add closing sequence onto message string: */ msglen = ctxt->msglen; for (idx=0; idx<64; ++idx) buff[idx] = 0; padlen = (ctxt->buffpos < 56 ? 55 - ctxt->buffpos : 119 - ctxt->buffpos); cm_sha1_block(ctxt, &mrk, (size_t)1); if (padlen > 0) cm_sha1_block(ctxt, buff, (size_t)padlen); buff[4] = (msglen & 0xff000000) >> 24; buff[5] = (msglen & 0xff0000) >> 16; buff[6] = (msglen & 0xff00) >> 8; buff[7] = msglen & 0xff; cm_sha1_block(ctxt, buff, (size_t)8); /* Transcribe internal state into array of bytes: */ *mdval = (uint8_t*)sec_realloc(NULL, (size_t)CM_SHA1_SIZE); *mdlen = CM_SHA1_SIZE; cptr = *mdval; for (idx=0; idx<5; ++idx) { cptr[0] = (uint8_t)((ctxt->H[idx] >> 24) & 0xff); cptr[1] = (uint8_t)((ctxt->H[idx] >> 16) & 0xff); cptr[2] = (uint8_t)((ctxt->H[idx] >> 8) & 0xff); cptr[3] = (uint8_t)(ctxt->H[idx] & 0xff); cptr += 4; } } void cm_sha1_free(cm_sha1_ctxt_t *ctxt) { sec_free((void*)ctxt); } #ifdef TESTING /*! \addtogroup unit_tests * @{ */ int ut_test_sha1() /* Check internal SHA1 hashing algorithm against known test-vectors */ { cm_sha1_ctxt_t *ctxt; uint8_t *mdval; unsigned b, q, idx; size_t mdlen; struct { const char *input, *hash; } cases[] = { { "", "da39a3ee5e6b4b0d3255bfef95601890afd80709" }, { "a", "86f7e437faa5a7fce15d1ddcb9eaeaea377667b8" }, { "alpha", "be76331b95dfc399cd776d2fc68021e0db03cc4f" }, { "alphabetti spaghetti", "c5fe3361dfdf6f17706cbe3ab0cc6419d057c329" }, { "163dac44e979cdaef82868a26abf392e3ee58e11f00b02d31daa20ed458e", "0fc6075902f1cc2c9e19819830bb294c820f016f" }, { "Cryptography - theory and practice, by Douglas R Stinson, Chapman & Hall/CRC", "2e0e07901c8460bc57b0097a66c7086ed5e97808" }, { NULL, NULL } }; CM_TEST_START("Internal SHA1"); CM_ASSERT_EQUAL(CM_SHA1_SIZE, 5 * sizeof(uint32_t)); idx = 0; while (cases[idx].input != NULL) { ctxt = cm_sha1_init(); cm_sha1_block(ctxt, (const uint8_t*)cases[idx].input, strlen(cases[idx].input)); cm_sha1_final(ctxt, &mdval, &mdlen); cm_sha1_free(ctxt); for (b=0; b 0) { permsalt = (uint8_t*)sec_realloc((void*)permsalt, saltlen); memcpy((void*)permsalt, (const void*)salt, saltlen); } else { if (saltlen == 0) saltlen = 16; permsalt = (uint8_t*)sec_realloc((void*)permsalt, saltlen); for (idx=0; idx 0) { cm_sha1_block(mdcontext, *key, pos); } } else { /* Mix-in result of previous iteration: */ cm_sha1_block(mdcontext, mdval_prev, mdlen); } /* Mix-in password: */ cm_sha1_block(mdcontext, (const uint8_t*)passwd, pwlen); cm_sha1_final(mdcontext, &mdval, &mdlen); /* Merge (subset of) hash-code bytes into output key: */ if (cnt == 0) { sz = ((pos + mdlen) > keylen ? (keylen - pos) : mdlen); memcpy((void*)(*key + pos), (const void*)mdval, sz); } else { /* Mix with results from previous iterations: */ for (idx=0; idx 0) sec_free(mdval_prev); mdval_prev = mdval; mdval = NULL; } pos += sz; sec_free(mdval_prev); mdval_prev = NULL; } sec_free(permsalt); } #ifdef TESTING /*! \addtogroup unit_tests * @{ */ int ut_pwfort() /* Check that password-fortification behaves sensibly */ { unsigned idx, pos, r=0; struct fwdbck { char *passwd; uint8_t *fwd, *bck; } *fbs; struct tcase { const char *passwd; const char *salt; uint8_t front[4], back[4]; } tcases[] = { { "Mary", "alpha", { 0x46, 0x94, 0x0f, 0xb1 }, { 0x8e, 0x0c, 0x6a, 0x6b } }, { "had", "beta", { 0x99, 0xd7, 0x51, 0x0f }, { 0x72, 0x23, 0x89, 0x2c } }, { "a", "gamma", { 0x6a, 0xcf, 0x38, 0xa5 }, { 0x57, 0x95, 0x6f, 0xcc } }, { "little", "delta", { 0xe6, 0x53, 0x17, 0x26 }, { 0x4c, 0x87, 0x05, 0xd7 } }, { "lamb", "epsilon", { 0xc2, 0x16, 0xf6, 0x11 }, { 0xf6, 0xaa, 0x02, 0x5d } }, { NULL, NULL, {}, {} } }; uint8_t *key=NULL; const unsigned n_fbs = 64, n_its = 32; const size_t pwlen = 13, saltlen = 17, keylen = 1024; CM_TEST_START("Password fortification"); /* Generate set of keys from pseudo-random passwords: */ fbs = (struct fwdbck*)malloc(n_fbs * sizeof(struct fwdbck)); for (idx=0; idx 0) { CM_ASSERT_DIFFERENT(0, memcmp((const void*)fbs[idx].fwd, (const void*)fbs[idx-1].fwd, keylen)); } } /* Check that keys generated in reverse order match: */ for (idx=n_fbs; idx-->0; ) { cm_pwd_fortify(fbs[idx].passwd, n_its, NULL, saltlen, &fbs[idx].bck, keylen); CM_ASSERT_EQUAL(0, memcmp((const void*)fbs[idx].fwd, (const void*)fbs[idx].bck, keylen)); /* Check that key doesn't contain trivial repetitions: */ pos = 0; while ((pos + 2 *CM_SHA1_SIZE) < keylen) { CM_ASSERT_DIFFERENT(0, memcmp((const void*)(fbs[idx].fwd + pos), (const void*)(fbs[idx].fwd + pos + CM_SHA1_SIZE), (size_t)CM_SHA1_SIZE)); pos += CM_SHA1_SIZE; } sec_free((void*)fbs[idx].fwd); sec_free((void*)fbs[idx].bck); free((void*)fbs[idx].passwd); } free((void*)fbs); /* Check known test cases: */ for (idx=0; tcases[idx].passwd!=NULL; ++idx) { cm_pwd_fortify(tcases[idx].passwd, n_its, (uint8_t*)tcases[idx].salt, strlen(tcases[idx].salt), &key, keylen); #if 0 fprintf(stderr, "%s: ", tcases[idx].passwd); for (pos=0; pos, 1996 # # This file is free software; the Free Software Foundation gives # unlimited permission to copy and/or distribute it, with or without # modifications, as long as this notice is preserved. # # The first argument passed to this file is the canonical host specification, # CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM # or # CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM # The environment variables CC, GCC, LDFLAGS, LD, with_gnu_ld # should be set by the caller. # # The set of defined variables is at the end of this script. # Known limitations: # - On IRIX 6.5 with CC="cc", the run time search patch must not be longer # than 256 bytes, otherwise the compiler driver will dump core. The only # known workaround is to choose shorter directory names for the build # directory and/or the installation directory. # All known linkers require a `.a' archive for static linking (except MSVC, # which needs '.lib'). libext=a shrext=.so host="$1" host_cpu=`echo "$host" | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\1/'` host_vendor=`echo "$host" | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\2/'` host_os=`echo "$host" | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\3/'` # Code taken from libtool.m4's _LT_CC_BASENAME. for cc_temp in $CC""; do case $cc_temp in compile | *[\\/]compile | ccache | *[\\/]ccache ) ;; distcc | *[\\/]distcc | purify | *[\\/]purify ) ;; \-*) ;; *) break;; esac done cc_basename=`echo "$cc_temp" | sed -e 's%^.*/%%'` # Code taken from libtool.m4's AC_LIBTOOL_PROG_COMPILER_PIC. wl= if test "$GCC" = yes; then wl='-Wl,' else case "$host_os" in aix*) wl='-Wl,' ;; darwin*) case $cc_basename in xlc*) wl='-Wl,' ;; esac ;; mingw* | pw32* | os2*) ;; hpux9* | hpux10* | hpux11*) wl='-Wl,' ;; irix5* | irix6* | nonstopux*) wl='-Wl,' ;; newsos6) ;; linux*) case $cc_basename in icc* | ecc*) wl='-Wl,' ;; pgcc | pgf77 | pgf90) wl='-Wl,' ;; ccc*) wl='-Wl,' ;; como) wl='-lopt=' ;; *) case `$CC -V 2>&1 | sed 5q` in *Sun\ C*) wl='-Wl,' ;; esac ;; esac ;; osf3* | osf4* | osf5*) wl='-Wl,' ;; sco3.2v5*) ;; solaris*) wl='-Wl,' ;; sunos4*) wl='-Qoption ld ' ;; sysv4 | sysv4.2uw2* | sysv4.3* | sysv5*) wl='-Wl,' ;; sysv4*MP*) ;; unicos*) wl='-Wl,' ;; uts4*) ;; esac fi # Code taken from libtool.m4's AC_LIBTOOL_PROG_LD_SHLIBS. hardcode_libdir_flag_spec= hardcode_libdir_separator= hardcode_direct=no hardcode_minus_L=no case "$host_os" in cygwin* | mingw* | pw32*) # FIXME: the MSVC++ port hasn't been tested in a loooong time # When not using gcc, we currently assume that we are using # Microsoft Visual C++. if test "$GCC" != yes; then with_gnu_ld=no fi ;; interix*) # we just hope/assume this is gcc and not c89 (= MSVC++) with_gnu_ld=yes ;; openbsd*) with_gnu_ld=no ;; esac ld_shlibs=yes if test "$with_gnu_ld" = yes; then # Set some defaults for GNU ld with shared library support. These # are reset later if shared libraries are not supported. Putting them # here allows them to be overridden if necessary. # Unlike libtool, we use -rpath here, not --rpath, since the documented # option of GNU ld is called -rpath, not --rpath. hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' case "$host_os" in aix3* | aix4* | aix5*) # On AIX/PPC, the GNU linker is very broken if test "$host_cpu" != ia64; then ld_shlibs=no fi ;; amigaos*) hardcode_libdir_flag_spec='-L$libdir' hardcode_minus_L=yes # Samuel A. Falvo II reports # that the semantics of dynamic libraries on AmigaOS, at least up # to version 4, is to share data among multiple programs linked # with the same dynamic library. Since this doesn't match the # behavior of shared libraries on other platforms, we cannot use # them. ld_shlibs=no ;; beos*) if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then : else ld_shlibs=no fi ;; cygwin* | mingw* | pw32*) # hardcode_libdir_flag_spec is actually meaningless, as there is # no search path for DLLs. hardcode_libdir_flag_spec='-L$libdir' if $LD --help 2>&1 | grep 'auto-import' > /dev/null; then : else ld_shlibs=no fi ;; interix3*) hardcode_direct=no hardcode_libdir_flag_spec='${wl}-rpath,$libdir' ;; linux*) if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then : else ld_shlibs=no fi ;; netbsd*) ;; solaris*) if $LD -v 2>&1 | grep 'BFD 2\.8' > /dev/null; then ld_shlibs=no elif $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then : else ld_shlibs=no fi ;; sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX*) case `$LD -v 2>&1` in *\ [01].* | *\ 2.[0-9].* | *\ 2.1[0-5].*) ld_shlibs=no ;; *) if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then hardcode_libdir_flag_spec='`test -z "$SCOABSPATH" && echo ${wl}-rpath,$libdir`' else ld_shlibs=no fi ;; esac ;; sunos4*) hardcode_direct=yes ;; *) if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then : else ld_shlibs=no fi ;; esac if test "$ld_shlibs" = no; then hardcode_libdir_flag_spec= fi else case "$host_os" in aix3*) # Note: this linker hardcodes the directories in LIBPATH if there # are no directories specified by -L. hardcode_minus_L=yes if test "$GCC" = yes; then # Neither direct hardcoding nor static linking is supported with a # broken collect2. hardcode_direct=unsupported fi ;; aix4* | aix5*) if test "$host_cpu" = ia64; then # On IA64, the linker does run time linking by default, so we don't # have to do anything special. aix_use_runtimelinking=no else aix_use_runtimelinking=no # Test if we are trying to use run time linking or normal # AIX style linking. If -brtl is somewhere in LDFLAGS, we # need to do runtime linking. case $host_os in aix4.[23]|aix4.[23].*|aix5*) for ld_flag in $LDFLAGS; do if (test $ld_flag = "-brtl" || test $ld_flag = "-Wl,-brtl"); then aix_use_runtimelinking=yes break fi done ;; esac fi hardcode_direct=yes hardcode_libdir_separator=':' if test "$GCC" = yes; then case $host_os in aix4.[012]|aix4.[012].*) collect2name=`${CC} -print-prog-name=collect2` if test -f "$collect2name" && \ strings "$collect2name" | grep resolve_lib_name >/dev/null then # We have reworked collect2 hardcode_direct=yes else # We have old collect2 hardcode_direct=unsupported hardcode_minus_L=yes hardcode_libdir_flag_spec='-L$libdir' hardcode_libdir_separator= fi ;; esac fi # Begin _LT_AC_SYS_LIBPATH_AIX. echo 'int main () { return 0; }' > conftest.c ${CC} ${LDFLAGS} conftest.c -o conftest aix_libpath=`dump -H conftest 2>/dev/null | sed -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0 *\(.*\)$/\1/; p; } }'` if test -z "$aix_libpath"; then aix_libpath=`dump -HX64 conftest 2>/dev/null | sed -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0 *\(.*\)$/\1/; p; } }'` fi if test -z "$aix_libpath"; then aix_libpath="/usr/lib:/lib" fi rm -f conftest.c conftest # End _LT_AC_SYS_LIBPATH_AIX. if test "$aix_use_runtimelinking" = yes; then hardcode_libdir_flag_spec='${wl}-blibpath:$libdir:'"$aix_libpath" else if test "$host_cpu" = ia64; then hardcode_libdir_flag_spec='${wl}-R $libdir:/usr/lib:/lib' else hardcode_libdir_flag_spec='${wl}-blibpath:$libdir:'"$aix_libpath" fi fi ;; amigaos*) hardcode_libdir_flag_spec='-L$libdir' hardcode_minus_L=yes # see comment about different semantics on the GNU ld section ld_shlibs=no ;; bsdi[45]*) ;; cygwin* | mingw* | pw32*) # When not using gcc, we currently assume that we are using # Microsoft Visual C++. # hardcode_libdir_flag_spec is actually meaningless, as there is # no search path for DLLs. hardcode_libdir_flag_spec=' ' libext=lib ;; darwin* | rhapsody*) hardcode_direct=no if test "$GCC" = yes ; then : else case $cc_basename in xlc*) ;; *) ld_shlibs=no ;; esac fi ;; dgux*) hardcode_libdir_flag_spec='-L$libdir' ;; freebsd1*) ld_shlibs=no ;; freebsd2.2*) hardcode_libdir_flag_spec='-R$libdir' hardcode_direct=yes ;; freebsd2*) hardcode_direct=yes hardcode_minus_L=yes ;; freebsd* | kfreebsd*-gnu | dragonfly*) hardcode_libdir_flag_spec='-R$libdir' hardcode_direct=yes ;; hpux9*) hardcode_libdir_flag_spec='${wl}+b ${wl}$libdir' hardcode_libdir_separator=: hardcode_direct=yes # hardcode_minus_L: Not really in the search PATH, # but as the default location of the library. hardcode_minus_L=yes ;; hpux10*) if test "$with_gnu_ld" = no; then hardcode_libdir_flag_spec='${wl}+b ${wl}$libdir' hardcode_libdir_separator=: hardcode_direct=yes # hardcode_minus_L: Not really in the search PATH, # but as the default location of the library. hardcode_minus_L=yes fi ;; hpux11*) if test "$with_gnu_ld" = no; then hardcode_libdir_flag_spec='${wl}+b ${wl}$libdir' hardcode_libdir_separator=: case $host_cpu in hppa*64*|ia64*) hardcode_direct=no ;; *) hardcode_direct=yes # hardcode_minus_L: Not really in the search PATH, # but as the default location of the library. hardcode_minus_L=yes ;; esac fi ;; irix5* | irix6* | nonstopux*) hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' hardcode_libdir_separator=: ;; netbsd*) hardcode_libdir_flag_spec='-R$libdir' hardcode_direct=yes ;; newsos6) hardcode_direct=yes hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' hardcode_libdir_separator=: ;; openbsd*) hardcode_direct=yes if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then hardcode_libdir_flag_spec='${wl}-rpath,$libdir' else case "$host_os" in openbsd[01].* | openbsd2.[0-7] | openbsd2.[0-7].*) hardcode_libdir_flag_spec='-R$libdir' ;; *) hardcode_libdir_flag_spec='${wl}-rpath,$libdir' ;; esac fi ;; os2*) hardcode_libdir_flag_spec='-L$libdir' hardcode_minus_L=yes ;; osf3*) hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' hardcode_libdir_separator=: ;; osf4* | osf5*) if test "$GCC" = yes; then hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' else # Both cc and cxx compiler support -rpath directly hardcode_libdir_flag_spec='-rpath $libdir' fi hardcode_libdir_separator=: ;; solaris*) hardcode_libdir_flag_spec='-R$libdir' ;; sunos4*) hardcode_libdir_flag_spec='-L$libdir' hardcode_direct=yes hardcode_minus_L=yes ;; sysv4) case $host_vendor in sni) hardcode_direct=yes # is this really true??? ;; siemens) hardcode_direct=no ;; motorola) hardcode_direct=no #Motorola manual says yes, but my tests say they lie ;; esac ;; sysv4.3*) ;; sysv4*MP*) if test -d /usr/nec; then ld_shlibs=yes fi ;; sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[01].[10]* | unixware7*) ;; sysv5* | sco3.2v5* | sco5v6*) hardcode_libdir_flag_spec='`test -z "$SCOABSPATH" && echo ${wl}-R,$libdir`' hardcode_libdir_separator=':' ;; uts4*) hardcode_libdir_flag_spec='-L$libdir' ;; *) ld_shlibs=no ;; esac fi # Check dynamic linker characteristics # Code taken from libtool.m4's AC_LIBTOOL_SYS_DYNAMIC_LINKER. libname_spec='lib$name' case "$host_os" in aix3*) ;; aix4* | aix5*) ;; amigaos*) ;; beos*) ;; bsdi[45]*) ;; cygwin* | mingw* | pw32*) shrext=.dll ;; darwin* | rhapsody*) shrext=.dylib ;; dgux*) ;; freebsd1*) ;; kfreebsd*-gnu) ;; freebsd* | dragonfly*) ;; gnu*) ;; hpux9* | hpux10* | hpux11*) case $host_cpu in ia64*) shrext=.so ;; hppa*64*) shrext=.sl ;; *) shrext=.sl ;; esac ;; interix3*) ;; irix5* | irix6* | nonstopux*) case "$host_os" in irix5* | nonstopux*) libsuff= shlibsuff= ;; *) case $LD in *-32|*"-32 "|*-melf32bsmip|*"-melf32bsmip ") libsuff= shlibsuff= ;; *-n32|*"-n32 "|*-melf32bmipn32|*"-melf32bmipn32 ") libsuff=32 shlibsuff=N32 ;; *-64|*"-64 "|*-melf64bmip|*"-melf64bmip ") libsuff=64 shlibsuff=64 ;; *) libsuff= shlibsuff= ;; esac ;; esac ;; linux*oldld* | linux*aout* | linux*coff*) ;; linux*) ;; knetbsd*-gnu) ;; netbsd*) ;; newsos6) ;; nto-qnx*) ;; openbsd*) ;; os2*) libname_spec='$name' shrext=.dll ;; osf3* | osf4* | osf5*) ;; solaris*) ;; sunos4*) ;; sysv4 | sysv4.3*) ;; sysv4*MP*) ;; sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*) ;; uts4*) ;; esac sed_quote_subst='s/\(["`$\\]\)/\\\1/g' escaped_wl=`echo "X$wl" | sed -e 's/^X//' -e "$sed_quote_subst"` shlibext=`echo "$shrext" | sed -e 's,^\.,,'` escaped_hardcode_libdir_flag_spec=`echo "X$hardcode_libdir_flag_spec" | sed -e 's/^X//' -e "$sed_quote_subst"` LC_ALL=C sed -e 's/^\([a-zA-Z0-9_]*\)=/acl_cv_\1=/' < .\" -------------------------------- .SH COPYRIGHT NOTICE .B cryptmount is Copyright 2005-2015 RW Penney .br and is supplied with NO WARRANTY. Licencing terms are as described in the file "COPYING" within the cryptmount source distribution. .\" vim: set ts=4 sw=4 et: cryptmount-5.2/man/makeman.defs0000644000175000017500000000170212612472523013560 00000000000000# cryptmount makefile-rules for man-pages # $Revision: $, $Date: $ # RW Penney, April 2006 # transform manpages in Makefile rather than configure, # because otherwise '${prefix}' may not be fully expanded: mantransform="s,@PACKAGE_VERSION\@,${PACKAGE_VERSION},g; \ s,@CM_SYSCONF_DIR\@,${CM_SYSCONF_DIR},g; \ s,@CM_SYSRUN_DIR\@,${CM_SYSRUN_DIR},g; \ s,@CM_DEFAULT_CIPHER\@,${CM_DEFAULT_CIPHER},g; \ s,@DFLT_KEYHASH\@,${DFLT_KEYHASH},g; \ s,@DFLT_KEYCIPHER\@,${DFLT_KEYCIPHER},g; \ s,@CM_DEFAULT_SUPATH\@,${CM_DEFAULT_SUPATH},g; \ /^___DELETE_CSWAP_${WITH_CSWAP}/,/^___END_CSWAP_${WTIH_CSWAP}/d; \ /^___DELETE_FSCK_${WITH_FSCK}/,/^___END_FSCK_${WTIH_FSCK}/d; \ /^___/d" cmtab.5: cmtab.5.in ${top_builddir}/config.status sed ${mantransform} $< > $@ cryptmount.8: cryptmount.8.in ${top_builddir}/config.status sed ${mantransform} $< > $@ cryptmount-setup.8: cryptmount-setup.8.in ${top_builddir}/config.status sed ${mantransform} $< > $@ cryptmount-5.2/man/Makefile.am0000644000175000017500000000032612150047355013337 00000000000000man_MANS = cmtab.5 cryptmount.8 cryptmount-setup.8 EXTRA_DIST = makeman.defs cmtab.5.in cryptmount.8.in cryptmount-setup.8.in SUBDIRS = fr include ${top_srcdir}/man/makeman.defs clean-local: -rm -f ${man_MANS} cryptmount-5.2/man/Makefile.in0000644000175000017500000005605712613124571013364 00000000000000# Makefile.in generated by automake 1.14.1 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2013 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)' am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ subdir = man DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \ $(top_srcdir)/mkinstalldirs ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = depcomp = am__depfiles_maybe = SOURCES = DIST_SOURCES = RECURSIVE_TARGETS = all-recursive check-recursive cscopelist-recursive \ ctags-recursive dvi-recursive html-recursive info-recursive \ install-data-recursive install-dvi-recursive \ install-exec-recursive install-html-recursive \ install-info-recursive install-pdf-recursive \ install-ps-recursive install-recursive installcheck-recursive \ installdirs-recursive pdf-recursive ps-recursive \ tags-recursive uninstall-recursive am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; am__vpath_adj = case $$p in \ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ *) f=$$p;; \ esac; am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; am__install_max = 40 am__nobase_strip_setup = \ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` am__nobase_strip = \ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" am__nobase_list = $(am__nobase_strip_setup); \ for p in $$list; do echo "$$p $$p"; done | \ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ if (++n[$$2] == $(am__install_max)) \ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ END { for (dir in files) print dir, files[dir] }' am__base_list = \ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' am__uninstall_files_from_dir = { \ test -z "$$files" \ || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ $(am__cd) "$$dir" && rm -f $$files; }; \ } man5dir = $(mandir)/man5 am__installdirs = "$(DESTDIR)$(man5dir)" "$(DESTDIR)$(man8dir)" man8dir = $(mandir)/man8 NROFF = nroff MANS = $(man_MANS) RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive \ distclean-recursive maintainer-clean-recursive am__recursive_targets = \ $(RECURSIVE_TARGETS) \ $(RECURSIVE_CLEAN_TARGETS) \ $(am__extra_recursive_targets) AM_RECURSIVE_TARGETS = $(am__recursive_targets:-recursive=) TAGS CTAGS \ distdir am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) # Read a list of newline-separated strings from the standard input, # and print each of them once, without duplicates. Input order is # *not* preserved. am__uniquify_input = $(AWK) '\ BEGIN { nonempty = 0; } \ { items[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in items) print i; }; } \ ' # Make sure the list of sources is unique. This is necessary because, # e.g., the same source file might be shared among _SOURCES variables # for different programs/libraries. am__define_uniq_tagged_files = \ list='$(am__tagged_files)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | $(am__uniquify_input)` ETAGS = etags CTAGS = ctags DIST_SUBDIRS = $(SUBDIRS) DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) am__relativize = \ dir0=`pwd`; \ sed_first='s,^\([^/]*\)/.*$$,\1,'; \ sed_rest='s,^[^/]*/*,,'; \ sed_last='s,^.*/\([^/]*\)$$,\1,'; \ sed_butlast='s,/*[^/]*$$,,'; \ while test -n "$$dir1"; do \ first=`echo "$$dir1" | sed -e "$$sed_first"`; \ if test "$$first" != "."; then \ if test "$$first" = ".."; then \ dir2=`echo "$$dir0" | sed -e "$$sed_last"`/"$$dir2"; \ dir0=`echo "$$dir0" | sed -e "$$sed_butlast"`; \ else \ first2=`echo "$$dir2" | sed -e "$$sed_first"`; \ if test "$$first2" = "$$first"; then \ dir2=`echo "$$dir2" | sed -e "$$sed_rest"`; \ else \ dir2="../$$dir2"; \ fi; \ dir0="$$dir0"/"$$first"; \ fi; \ fi; \ dir1=`echo "$$dir1" | sed -e "$$sed_rest"`; \ done; \ reldir="$$dir2" ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CFLAGS = @CFLAGS@ CM_DEFAULT_CIPHER = @CM_DEFAULT_CIPHER@ CM_DEFAULT_SUPATH = @CM_DEFAULT_SUPATH@ CM_SYSCONF_DIR = @CM_SYSCONF_DIR@ CM_SYSRUN_DIR = @CM_SYSRUN_DIR@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DOXYGEN_DOCDIR = @DOXYGEN_DOCDIR@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ ERSATZ_MOUNT = @ERSATZ_MOUNT@ ERSATZ_UMOUNT = @ERSATZ_UMOUNT@ EXEEXT = @EXEEXT@ GETTEXT_MACRO_VERSION = @GETTEXT_MACRO_VERSION@ GMSGFMT = @GMSGFMT@ GMSGFMT_015 = @GMSGFMT_015@ GREP = @GREP@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ INTLLIBS = @INTLLIBS@ INTL_MACOSX_LIBS = @INTL_MACOSX_LIBS@ LDFLAGS = @LDFLAGS@ LIBICONV = @LIBICONV@ LIBINTL = @LIBINTL@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBS_GCRY = @LIBS_GCRY@ LIBS_LUKS = @LIBS_LUKS@ LTLIBICONV = @LTLIBICONV@ LTLIBINTL = @LTLIBINTL@ LTLIBOBJS = @LTLIBOBJS@ MAKEINFO = @MAKEINFO@ MKDIR_P = @MKDIR_P@ MSGFMT = @MSGFMT@ MSGFMT_015 = @MSGFMT_015@ MSGMERGE = @MSGMERGE@ OBJEXT = @OBJEXT@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_FSCK = @PATH_FSCK@ PATH_MKSWAP = @PATH_MKSWAP@ PATH_MOUNT = @PATH_MOUNT@ PATH_SEPARATOR = @PATH_SEPARATOR@ PATH_UMOUNT = @PATH_UMOUNT@ PKG_CONFIG = @PKG_CONFIG@ PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ POSUB = @POSUB@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ USE_NLS = @USE_NLS@ VERSION = @VERSION@ WITH_CSWAP = @WITH_CSWAP@ WITH_FSCK = @WITH_FSCK@ XGETTEXT = @XGETTEXT@ XGETTEXT_015 = @XGETTEXT_015@ XGETTEXT_EXTRA_OPTIONS = @XGETTEXT_EXTRA_OPTIONS@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_CC = @ac_ct_CC@ am__leading_dot = @am__leading_dot@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libcryptsetup_CFLAGS = @libcryptsetup_CFLAGS@ libcryptsetup_LIBS = @libcryptsetup_LIBS@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ use_doxygen = @use_doxygen@ man_MANS = cmtab.5 cryptmount.8 cryptmount-setup.8 EXTRA_DIST = makeman.defs cmtab.5.in cryptmount.8.in cryptmount-setup.8.in SUBDIRS = fr all: all-recursive .SUFFIXES: $(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu --ignore-deps man/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu --ignore-deps man/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): install-man5: $(man_MANS) @$(NORMAL_INSTALL) @list1=''; \ list2='$(man_MANS)'; \ test -n "$(man5dir)" \ && test -n "`echo $$list1$$list2`" \ || exit 0; \ echo " $(MKDIR_P) '$(DESTDIR)$(man5dir)'"; \ $(MKDIR_P) "$(DESTDIR)$(man5dir)" || exit 1; \ { for i in $$list1; do echo "$$i"; done; \ if test -n "$$list2"; then \ for i in $$list2; do echo "$$i"; done \ | sed -n '/\.5[a-z]*$$/p'; \ fi; \ } | while read p; do \ if test -f $$p; then d=; else d="$(srcdir)/"; fi; \ echo "$$d$$p"; echo "$$p"; \ done | \ sed -e 'n;s,.*/,,;p;h;s,.*\.,,;s,^[^5][0-9a-z]*$$,5,;x' \ -e 's,\.[0-9a-z]*$$,,;$(transform);G;s,\n,.,' | \ sed 'N;N;s,\n, ,g' | { \ list=; while read file base inst; do \ if test "$$base" = "$$inst"; then list="$$list $$file"; else \ echo " $(INSTALL_DATA) '$$file' '$(DESTDIR)$(man5dir)/$$inst'"; \ $(INSTALL_DATA) "$$file" "$(DESTDIR)$(man5dir)/$$inst" || exit $$?; \ fi; \ done; \ for i in $$list; do echo "$$i"; done | $(am__base_list) | \ while read files; do \ test -z "$$files" || { \ echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(man5dir)'"; \ $(INSTALL_DATA) $$files "$(DESTDIR)$(man5dir)" || exit $$?; }; \ done; } uninstall-man5: @$(NORMAL_UNINSTALL) @list=''; test -n "$(man5dir)" || exit 0; \ files=`{ for i in $$list; do echo "$$i"; done; \ l2='$(man_MANS)'; for i in $$l2; do echo "$$i"; done | \ sed -n '/\.5[a-z]*$$/p'; \ } | sed -e 's,.*/,,;h;s,.*\.,,;s,^[^5][0-9a-z]*$$,5,;x' \ -e 's,\.[0-9a-z]*$$,,;$(transform);G;s,\n,.,'`; \ dir='$(DESTDIR)$(man5dir)'; $(am__uninstall_files_from_dir) install-man8: $(man_MANS) @$(NORMAL_INSTALL) @list1=''; \ list2='$(man_MANS)'; \ test -n "$(man8dir)" \ && test -n "`echo $$list1$$list2`" \ || exit 0; \ echo " $(MKDIR_P) '$(DESTDIR)$(man8dir)'"; \ $(MKDIR_P) "$(DESTDIR)$(man8dir)" || exit 1; \ { for i in $$list1; do echo "$$i"; done; \ if test -n "$$list2"; then \ for i in $$list2; do echo "$$i"; done \ | sed -n '/\.8[a-z]*$$/p'; \ fi; \ } | while read p; do \ if test -f $$p; then d=; else d="$(srcdir)/"; fi; \ echo "$$d$$p"; echo "$$p"; \ done | \ sed -e 'n;s,.*/,,;p;h;s,.*\.,,;s,^[^8][0-9a-z]*$$,8,;x' \ -e 's,\.[0-9a-z]*$$,,;$(transform);G;s,\n,.,' | \ sed 'N;N;s,\n, ,g' | { \ list=; while read file base inst; do \ if test "$$base" = "$$inst"; then list="$$list $$file"; else \ echo " $(INSTALL_DATA) '$$file' '$(DESTDIR)$(man8dir)/$$inst'"; \ $(INSTALL_DATA) "$$file" "$(DESTDIR)$(man8dir)/$$inst" || exit $$?; \ fi; \ done; \ for i in $$list; do echo "$$i"; done | $(am__base_list) | \ while read files; do \ test -z "$$files" || { \ echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(man8dir)'"; \ $(INSTALL_DATA) $$files "$(DESTDIR)$(man8dir)" || exit $$?; }; \ done; } uninstall-man8: @$(NORMAL_UNINSTALL) @list=''; test -n "$(man8dir)" || exit 0; \ files=`{ for i in $$list; do echo "$$i"; done; \ l2='$(man_MANS)'; for i in $$l2; do echo "$$i"; done | \ sed -n '/\.8[a-z]*$$/p'; \ } | sed -e 's,.*/,,;h;s,.*\.,,;s,^[^8][0-9a-z]*$$,8,;x' \ -e 's,\.[0-9a-z]*$$,,;$(transform);G;s,\n,.,'`; \ dir='$(DESTDIR)$(man8dir)'; $(am__uninstall_files_from_dir) # This directory's subdirectories are mostly independent; you can cd # into them and run 'make' without going through this Makefile. # To change the values of 'make' variables: instead of editing Makefiles, # (1) if the variable is set in 'config.status', edit 'config.status' # (which will cause the Makefiles to be regenerated when you run 'make'); # (2) otherwise, pass the desired values on the 'make' command line. $(am__recursive_targets): @fail=; \ if $(am__make_keepgoing); then \ failcom='fail=yes'; \ else \ failcom='exit 1'; \ fi; \ dot_seen=no; \ target=`echo $@ | sed s/-recursive//`; \ case "$@" in \ distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \ *) list='$(SUBDIRS)' ;; \ esac; \ for subdir in $$list; do \ echo "Making $$target in $$subdir"; \ if test "$$subdir" = "."; then \ dot_seen=yes; \ local_target="$$target-am"; \ else \ local_target="$$target"; \ fi; \ ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ || eval $$failcom; \ done; \ if test "$$dot_seen" = "no"; then \ $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \ fi; test -z "$$fail" ID: $(am__tagged_files) $(am__define_uniq_tagged_files); mkid -fID $$unique tags: tags-recursive TAGS: tags tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) set x; \ here=`pwd`; \ if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \ include_option=--etags-include; \ empty_fix=.; \ else \ include_option=--include; \ empty_fix=; \ fi; \ list='$(SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ test ! -f $$subdir/TAGS || \ set "$$@" "$$include_option=$$here/$$subdir/TAGS"; \ fi; \ done; \ $(am__define_uniq_tagged_files); \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: ctags-recursive CTAGS: ctags ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) $(am__define_uniq_tagged_files); \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" cscopelist: cscopelist-recursive cscopelist-am: $(am__tagged_files) list='$(am__tagged_files)'; \ case "$(srcdir)" in \ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ *) sdir=$(subdir)/$(srcdir) ;; \ esac; \ for i in $$list; do \ if test -f "$$i"; then \ echo "$(subdir)/$$i"; \ else \ echo "$$sdir/$$i"; \ fi; \ done >> $(top_builddir)/cscope.files distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done @list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ $(am__make_dryrun) \ || test -d "$(distdir)/$$subdir" \ || $(MKDIR_P) "$(distdir)/$$subdir" \ || exit 1; \ dir1=$$subdir; dir2="$(distdir)/$$subdir"; \ $(am__relativize); \ new_distdir=$$reldir; \ dir1=$$subdir; dir2="$(top_distdir)"; \ $(am__relativize); \ new_top_distdir=$$reldir; \ echo " (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) top_distdir="$$new_top_distdir" distdir="$$new_distdir" \\"; \ echo " am__remove_distdir=: am__skip_length_check=: am__skip_mode_fix=: distdir)"; \ ($(am__cd) $$subdir && \ $(MAKE) $(AM_MAKEFLAGS) \ top_distdir="$$new_top_distdir" \ distdir="$$new_distdir" \ am__remove_distdir=: \ am__skip_length_check=: \ am__skip_mode_fix=: \ distdir) \ || exit 1; \ fi; \ done check-am: all-am check: check-recursive all-am: Makefile $(MANS) installdirs: installdirs-recursive installdirs-am: for dir in "$(DESTDIR)$(man5dir)" "$(DESTDIR)$(man8dir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done install: install-recursive install-exec: install-exec-recursive install-data: install-data-recursive uninstall: uninstall-recursive install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-recursive install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-recursive clean-am: clean-generic clean-local mostlyclean-am distclean: distclean-recursive -rm -f Makefile distclean-am: clean-am distclean-generic distclean-tags dvi: dvi-recursive dvi-am: html: html-recursive html-am: info: info-recursive info-am: install-data-am: install-man install-dvi: install-dvi-recursive install-dvi-am: install-exec-am: install-html: install-html-recursive install-html-am: install-info: install-info-recursive install-info-am: install-man: install-man5 install-man8 install-pdf: install-pdf-recursive install-pdf-am: install-ps: install-ps-recursive install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-recursive -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-recursive mostlyclean-am: mostlyclean-generic pdf: pdf-recursive pdf-am: ps: ps-recursive ps-am: uninstall-am: uninstall-man uninstall-man: uninstall-man5 uninstall-man8 .MAKE: $(am__recursive_targets) install-am install-strip .PHONY: $(am__recursive_targets) CTAGS GTAGS TAGS all all-am check \ check-am clean clean-generic clean-local cscopelist-am ctags \ ctags-am distclean distclean-generic distclean-tags distdir \ dvi dvi-am html html-am info info-am install install-am \ install-data install-data-am install-dvi install-dvi-am \ install-exec install-exec-am install-html install-html-am \ install-info install-info-am install-man install-man5 \ install-man8 install-pdf install-pdf-am install-ps \ install-ps-am install-strip installcheck installcheck-am \ installdirs installdirs-am maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-generic pdf \ pdf-am ps ps-am tags tags-am uninstall uninstall-am \ uninstall-man uninstall-man5 uninstall-man8 include ${top_srcdir}/man/makeman.defs clean-local: -rm -f ${man_MANS} # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: cryptmount-5.2/man/fr/0000755000175000017500000000000012613166774012004 500000000000000cryptmount-5.2/man/fr/cryptmount.8.in0000644000175000017500000002263212521500426014633 00000000000000.\" cryptmount (French) manual page .\" Copyright (c) 2006-2015 RW Penney .\" .TH CRYPTMOUNT 8 "2009-02-21" "@PACKAGE_VERSION@" "Manuel de l'utilisateur Linux" .SH NOM cryptmount \- monter/d\['e]monter un syst\[`e]me de fichiers chiffr\['e] .\" -------------------------------- .SH SYNOPSIS .BI "cryptmount \fICIBLE\fR [\fICIBLE ...\fR]" .LP .BI "cryptmount \-\-unmount \fICIBLE\fR [\fICIBLE ...\fR]" .LP .BI "cryptmount \-\-change\-password \fICIBLE\fR" .LP .BI "cryptmount \-\-generate\-key \fIsize\fP \fICIBLE\fR" ___DELETE_CSWAP_0 .LP .BI "cryptmount \-\-swapon \fICIBLE\fR" .LP .BI "cryptmount \-\-swapoff \fICIBLE\fR" ___END_CSWAP_0 .\" -------------------------------- .SH DESCRIPTION .B cryptmount permet \[`a] un utilisateur ordinaire d'acc\['e]der \[`a] un syst\[`e]me de fichiers chiffr\['e] sans avoir besoin des privil\[`e]ges du super-utilisateur, et aussi aide le super-utilisateur \[`a] cr\['e]er des nouveaux syst\[`e]mes de fichiers chiffr\['e]s. Apr\[`e]s avoir \['e]t\['e] configur\['e] la premi\[`e]re fois par le super-utilisateur, l'utilisateur a seulement besoin de donner le mot de passe du syst\[`e]me de fichiers pour que .B cryptmount configure automatiquement des cibles du device-mapper et p\['e]riph\['e]rique loop avant de monter le syst\[`e]me de fichiers. .B cryptmount a \['e]t\['e] \['e]crit en r\['e]ponse aux diff\['e]rences entre le nouveau device-mapper du linux-2.6 serie des noyeaux et, le plus ag\['e], cryptoloop qui a permis \[`a] des utilisateurs ordinaires d'acc\['e]der aux syst\[`e]mes de fichiers chiffr\['e]s directement avec .B mount (8). .\" -------------------------------- .SH OPTIONS .TP .B \-a \-\-all op\['e]rer sur toutes les cibles dans @CM_SYSCONF_DIR@/cmtab, par exemple si on veut monter toutes les cibles. .TP .B \-m \-\-mount monter une cible particuli\[`e]re. On demandera \[`a] l'utilisateur de donner un mot de passe pour r\['e]v\['e]ler la clef qui d\['e]chiffre le syst\[`e]me de fichiers. .TP .B \-u \-\-unmount d\['e]monter une cible particuli\[`e]re. On n'a pas besoin de donner un mot de passe, mais si un utilisateur ordinaire qui n'a pas mont\['e] ce syst\[`e]me de fichiers essaye de le d\['e]monter, cela se soldera par un \['e]chec. .TP .B \-l \-\-list donner une liste de toutes les cibles. .TP .B \-c \-\-change\-password changer le mot de passe qui prot\[`e]ge un syst\[`e]me de fichers. .TP .B \-\-generate\-key "\fItaille\fP" cr\['e]er une clef de d\['e]chiffrage pour un nouveau syst\[`e]me de fichiers. .IR taille\fP donne la longeur de la clef en octets. .TP .B \-e \-\-reuse\-key "\fIcible-actuel\fP" cr\['e]er une clef de d\['e]chiffrage pour un nouveau syst\[`e]me de fichiers, utilisant une clef existante d'un autre syst\[`e]me de fichiers. .TP .B \-f \-\-config\-fd "\fInum\fP" lire les information des cibles d'un descripteur de fichier num\['e]ro .IR num\fP en place du fichier de configuration de defaut. Cette option est reserv\['e]e seulement pour le super-utilisateur. .TP .B \-w \-\-passwd\-fd "\fInum\fP" lire les mots de passe d'un descripteur de fichier num\['e]ro .IR num\fP en place du terminal. .TP .B \-p \-\-prepare pr\['e]parer toutes les cibles du device-mapper et p\['e]riph\['e]rique loop n\['e]cessaires pour acc\['e]der \[`a] une cible, mais sans la monter. Cette commande permet au super-utilisateur d'installer un syst\[`e]me de fichiers sur un p\['e]riph\['e]rique chiffr\['e]. .TP .B \-r \-\-release lib\['e]rer toutes les cibles du device-mapper et p\['e]riph\['e]rique loop associ\['e]es \[`a] une cible particuli\[`e]re. Cette option est reserv\['e]e seulement pour le super-utilisateur. ___DELETE_CSWAP_0 .TP .B \-s \-\-swapon activer une cible pour la pagination sur disque chiffr\['e]. Cette option est reserv\['e]e seulement pour le super-utilisateur. .TP .B \-x \-\-swapoff d\['e]sactiver une cible pour la pagination sur disque chiffr\['e]. Cette option est reserv\['e]e seulement pour le super-utilisateur. ___END_CSWAP_0 .TP .B \-k \-\-key-managers donne une list de tous les gestionnaires des fichier-clefs. .TP .B \-v \-\-version donner le num\['e]ro version de la programme install\['e]e. .\" -------------------------------- .SH CODES DE RETOUR .B cryptmount donne un z\['e]ro si l'action a r\['e]ussi. Une autre valeur indique qu'une erreur a \['e]t\['e] comise: .TP .B 1 un argument n'est pas reconnu; .TP .B 2 le nom d'une cible n'est pas reconnu; .TP .B 3 l'excecution d'une programme a \['e]chou\['e]; .TP .B 100 l'utilisateur n'a pas assez de privil\[`e]ge; .TP .B 101 il y a un \['e]chec de le securit\['e] dans l'installation. .\" -------------------------------- .SH EXEMPLES Si vous voulez construire un nouveau syst\[`e]me de fichiers chiffr\['e] dirig\['e] par cryptmount, vous pouvez utiliser le programme 'cryptmount-setup' compris avec ce paquet, qui permet au super-utilisateur d'\['e]tablir interactivement une cible basique. Autrement, imaginez que l'on veuille construire un nouveau syst\[`e]me de fichiers chiffr\['e], que l'on appellera \[Fo]opaque\[Fc]. Si on a une partition libre du disque dur, par exemple /dev/hdb63, on peut utiliser cette partition directement pour contenir le syst\[`e]me de fichiers. Sinon, on peut conserver le syst\[`e]me de fichiers chiffr\['e] dans un fichier ordinaire, si on reserve de l'espace-disque avec par exemple la commande suivante: .nf dd if=/dev/zero of=/home/opaque.fs bs=1M count=512 .fi et ensuite, on doit remplacer toutes les instances de \[Fo]/dev/hdb63\[Fc] dans ce qui suit par \[Fo]/home/opaque.fs\[Fc]. D'abord, on doit cr\['e]er un inscription dans @CM_SYSCONF_DIR@/cmtab, qui d\['e]crit le chiffrage qui sera utilis\['e] pour prot\[`e]ger le syst\[`e]me de fichiers, ainsi: .nf opaque { dev=/dev/hdb63 dir=/home/crypt fstype=ext2 mountoptions=defaults cipher=twofish keyfile=@CM_SYSCONF_DIR@/opaque.key keyformat=builtin } .fi Ici, on utilisera l'algorithme "twofish" pour chiffrer le syst\[`e]me de fichiers lui-m\[^e]me, et le gestionnaire int\['e]gr\['e] ("builtin") va conserver le securit\['e] de la clef de d\['e]chiffrage dans @CM_SYSCONF_DIR@/opaque.key. Pour g\['e]n\['e]rer une clef de d\['e]chiffrage secr\[`e]te (dans @CM_SYSCONF_DIR@/opaque.key), on peut ex\['e]cuter, en tant que super-utilisateur: .nf cryptmount \-\-generate\-key 32 opaque .fi Cette commande produit une clef de 32 octets (256 bits), et on sait que le chiffre Twofish accepte les clefs de 256 bits. Si on ex\['e]cute la commande suivante, en tant que super-utilisateur: .nf cryptmount \-\-prepare opaque .fi on doit produire le mot de passe qu'on a donn\['e] lors de l'\['e]criture du @CM_SYSCONF_DIR@/opaque.key. Ceci permet \[`a] .B cryptmount de pr\['e]parer une cible device-mapper (/dev/mapper/opaque). Maintenant, les outils standards sont disponibles pour mettre un syst\[`e]me de fichiers sur /dev/mapper/opaque: .nf mke2fs /dev/mapper/opaque .fi Apr\[`e]s avoir ex\['e]cut\['e] .nf cryptmount \-\-release opaque mkdir /home/crypt .fi le syst\[`e]me de fichiers chiffr\['e] est pr\[^e]t. Les utilisateurs ordinaires pouvent monter le syst\[`e]me de fichiers en tapant .nf cryptmount \-m opaque .fi ou .nf cryptmount opaque .fi et pouvent d\['e]monter avec .nf cryptmount \-u opaque .fi .B cryptmount maintenit un rapport sur lequel utilisateur a mont\['e] chaque cible de mani\[`e]re \[`a] interdir \[`a] tout autre utilisateur (sauf le super-utilisateur) de d\['e]monter ce syst\[`e]me de fichiers. .\" -------------------------------- .SH MODIFIER MOT DE PASSE Apr\[`e]s avoir utilis\['e] un syst\[`e]me de fichiers pendant un certain temps, on peut vouloir changer le mot de passe. Par exemple, si on a une cible appel\['e]e "opaque", on peut ex\['e]cuter: .nf cryptmount \-\-change\-password opaque .fi On doit donner l'ancien mot de passe, et ensuite choisir un nouveau mot de passe qui va chiffrer la clef d'acc\[`e]s pour le syst\[`e]me de fichiers. (Le syst\[`e]me de fichier lui-m\[^e]me n'est pas modifi\['e].) .\" -------------------------------- .SH SYSTEMES DE FICHIERS `LUKS' On peut utiliser .B cryptmount pour acc\[`e]der facilement les syst\[`e]mes de fichiers en format LUKS cr\['e]e avec le paquet .B cryptsetup. Si on a d\['e]j\[`a] construi un partition LUKS, on doit seulment mettre un autre cible dans @CM_SYSCONF_DIR@/cmtab. Par example, si le partition /dev/hdb62 sur le disque dur contient un syst\[`e]me de fichiers du type `ext3', chiffr\['e]e avec LUKS, on peut ecrire: .nf LUKS { keyformat=luks dev=/dev/hdb62 keyfile=/dev/hdb62 dir=/home/luks-dir fstype=ext3 } .fi Apr\[`e]s avoir faire \[,c]a, c'est possible de monter cette syst\[`e]me de fichiers sous /home/luks-dir avec .nf cryptmount LUKS .fi .\" -------------------------------- .SH FICHIERS .I @CM_SYSCONF_DIR@/cmtab - fichier de configuration .LP .I @CM_SYSRUN_DIR@/cryptmount.status - rapport sur les cibles mont\['e]es .SH "VOIR AUSSI" .BR cmtab (5), .BR cryptmount-setup (8), .BR cryptsetup (8), .BR mount (8), .\" -------------------------------- .SH BOGUES L'auteur accueille les suggestions .B constructives \[`a] .\" -------------------------------- .SH COPYRIGHT NOTICE .B cryptmount est Copyright 2005-2015 RW Penney .br et il n'y a point de garantie. Les termes de sa licence sont d\['e]crits dans le fichier "COPYING" dans le paquet source de cryptmount. .\" -------------------------------- .SH TRADUCTION RW Penney, 2006-2014, avec beaucoup d'assistance de mon \['e]pouse. .\" vim: set ts=4 sw=4 et: cryptmount-5.2/man/fr/Makefile.am0000644000175000017500000000025112150047355013743 00000000000000mandir = @mandir@/fr man_MANS = cmtab.5 cryptmount.8 EXTRA_DIST = cmtab.5.in cryptmount.8.in include ${top_srcdir}/man/makeman.defs clean-local: -rm -f ${man_MANS} cryptmount-5.2/man/fr/Makefile.in0000644000175000017500000004141312613124571013761 00000000000000# Makefile.in generated by automake 1.14.1 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2013 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)' am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ subdir = man/fr DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \ $(top_srcdir)/mkinstalldirs ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = depcomp = am__depfiles_maybe = SOURCES = DIST_SOURCES = am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; am__vpath_adj = case $$p in \ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ *) f=$$p;; \ esac; am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; am__install_max = 40 am__nobase_strip_setup = \ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` am__nobase_strip = \ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" am__nobase_list = $(am__nobase_strip_setup); \ for p in $$list; do echo "$$p $$p"; done | \ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ if (++n[$$2] == $(am__install_max)) \ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ END { for (dir in files) print dir, files[dir] }' am__base_list = \ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' am__uninstall_files_from_dir = { \ test -z "$$files" \ || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ $(am__cd) "$$dir" && rm -f $$files; }; \ } man5dir = $(mandir)/man5 am__installdirs = "$(DESTDIR)$(man5dir)" "$(DESTDIR)$(man8dir)" man8dir = $(mandir)/man8 NROFF = nroff MANS = $(man_MANS) am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CFLAGS = @CFLAGS@ CM_DEFAULT_CIPHER = @CM_DEFAULT_CIPHER@ CM_DEFAULT_SUPATH = @CM_DEFAULT_SUPATH@ CM_SYSCONF_DIR = @CM_SYSCONF_DIR@ CM_SYSRUN_DIR = @CM_SYSRUN_DIR@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DOXYGEN_DOCDIR = @DOXYGEN_DOCDIR@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ ERSATZ_MOUNT = @ERSATZ_MOUNT@ ERSATZ_UMOUNT = @ERSATZ_UMOUNT@ EXEEXT = @EXEEXT@ GETTEXT_MACRO_VERSION = @GETTEXT_MACRO_VERSION@ GMSGFMT = @GMSGFMT@ GMSGFMT_015 = @GMSGFMT_015@ GREP = @GREP@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ INTLLIBS = @INTLLIBS@ INTL_MACOSX_LIBS = @INTL_MACOSX_LIBS@ LDFLAGS = @LDFLAGS@ LIBICONV = @LIBICONV@ LIBINTL = @LIBINTL@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBS_GCRY = @LIBS_GCRY@ LIBS_LUKS = @LIBS_LUKS@ LTLIBICONV = @LTLIBICONV@ LTLIBINTL = @LTLIBINTL@ LTLIBOBJS = @LTLIBOBJS@ MAKEINFO = @MAKEINFO@ MKDIR_P = @MKDIR_P@ MSGFMT = @MSGFMT@ MSGFMT_015 = @MSGFMT_015@ MSGMERGE = @MSGMERGE@ OBJEXT = @OBJEXT@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_FSCK = @PATH_FSCK@ PATH_MKSWAP = @PATH_MKSWAP@ PATH_MOUNT = @PATH_MOUNT@ PATH_SEPARATOR = @PATH_SEPARATOR@ PATH_UMOUNT = @PATH_UMOUNT@ PKG_CONFIG = @PKG_CONFIG@ PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ POSUB = @POSUB@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ USE_NLS = @USE_NLS@ VERSION = @VERSION@ WITH_CSWAP = @WITH_CSWAP@ WITH_FSCK = @WITH_FSCK@ XGETTEXT = @XGETTEXT@ XGETTEXT_015 = @XGETTEXT_015@ XGETTEXT_EXTRA_OPTIONS = @XGETTEXT_EXTRA_OPTIONS@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_CC = @ac_ct_CC@ am__leading_dot = @am__leading_dot@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libcryptsetup_CFLAGS = @libcryptsetup_CFLAGS@ libcryptsetup_LIBS = @libcryptsetup_LIBS@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@/fr mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ use_doxygen = @use_doxygen@ man_MANS = cmtab.5 cryptmount.8 EXTRA_DIST = cmtab.5.in cryptmount.8.in all: all-am .SUFFIXES: $(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu --ignore-deps man/fr/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu --ignore-deps man/fr/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): install-man5: $(man_MANS) @$(NORMAL_INSTALL) @list1=''; \ list2='$(man_MANS)'; \ test -n "$(man5dir)" \ && test -n "`echo $$list1$$list2`" \ || exit 0; \ echo " $(MKDIR_P) '$(DESTDIR)$(man5dir)'"; \ $(MKDIR_P) "$(DESTDIR)$(man5dir)" || exit 1; \ { for i in $$list1; do echo "$$i"; done; \ if test -n "$$list2"; then \ for i in $$list2; do echo "$$i"; done \ | sed -n '/\.5[a-z]*$$/p'; \ fi; \ } | while read p; do \ if test -f $$p; then d=; else d="$(srcdir)/"; fi; \ echo "$$d$$p"; echo "$$p"; \ done | \ sed -e 'n;s,.*/,,;p;h;s,.*\.,,;s,^[^5][0-9a-z]*$$,5,;x' \ -e 's,\.[0-9a-z]*$$,,;$(transform);G;s,\n,.,' | \ sed 'N;N;s,\n, ,g' | { \ list=; while read file base inst; do \ if test "$$base" = "$$inst"; then list="$$list $$file"; else \ echo " $(INSTALL_DATA) '$$file' '$(DESTDIR)$(man5dir)/$$inst'"; \ $(INSTALL_DATA) "$$file" "$(DESTDIR)$(man5dir)/$$inst" || exit $$?; \ fi; \ done; \ for i in $$list; do echo "$$i"; done | $(am__base_list) | \ while read files; do \ test -z "$$files" || { \ echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(man5dir)'"; \ $(INSTALL_DATA) $$files "$(DESTDIR)$(man5dir)" || exit $$?; }; \ done; } uninstall-man5: @$(NORMAL_UNINSTALL) @list=''; test -n "$(man5dir)" || exit 0; \ files=`{ for i in $$list; do echo "$$i"; done; \ l2='$(man_MANS)'; for i in $$l2; do echo "$$i"; done | \ sed -n '/\.5[a-z]*$$/p'; \ } | sed -e 's,.*/,,;h;s,.*\.,,;s,^[^5][0-9a-z]*$$,5,;x' \ -e 's,\.[0-9a-z]*$$,,;$(transform);G;s,\n,.,'`; \ dir='$(DESTDIR)$(man5dir)'; $(am__uninstall_files_from_dir) install-man8: $(man_MANS) @$(NORMAL_INSTALL) @list1=''; \ list2='$(man_MANS)'; \ test -n "$(man8dir)" \ && test -n "`echo $$list1$$list2`" \ || exit 0; \ echo " $(MKDIR_P) '$(DESTDIR)$(man8dir)'"; \ $(MKDIR_P) "$(DESTDIR)$(man8dir)" || exit 1; \ { for i in $$list1; do echo "$$i"; done; \ if test -n "$$list2"; then \ for i in $$list2; do echo "$$i"; done \ | sed -n '/\.8[a-z]*$$/p'; \ fi; \ } | while read p; do \ if test -f $$p; then d=; else d="$(srcdir)/"; fi; \ echo "$$d$$p"; echo "$$p"; \ done | \ sed -e 'n;s,.*/,,;p;h;s,.*\.,,;s,^[^8][0-9a-z]*$$,8,;x' \ -e 's,\.[0-9a-z]*$$,,;$(transform);G;s,\n,.,' | \ sed 'N;N;s,\n, ,g' | { \ list=; while read file base inst; do \ if test "$$base" = "$$inst"; then list="$$list $$file"; else \ echo " $(INSTALL_DATA) '$$file' '$(DESTDIR)$(man8dir)/$$inst'"; \ $(INSTALL_DATA) "$$file" "$(DESTDIR)$(man8dir)/$$inst" || exit $$?; \ fi; \ done; \ for i in $$list; do echo "$$i"; done | $(am__base_list) | \ while read files; do \ test -z "$$files" || { \ echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(man8dir)'"; \ $(INSTALL_DATA) $$files "$(DESTDIR)$(man8dir)" || exit $$?; }; \ done; } uninstall-man8: @$(NORMAL_UNINSTALL) @list=''; test -n "$(man8dir)" || exit 0; \ files=`{ for i in $$list; do echo "$$i"; done; \ l2='$(man_MANS)'; for i in $$l2; do echo "$$i"; done | \ sed -n '/\.8[a-z]*$$/p'; \ } | sed -e 's,.*/,,;h;s,.*\.,,;s,^[^8][0-9a-z]*$$,8,;x' \ -e 's,\.[0-9a-z]*$$,,;$(transform);G;s,\n,.,'`; \ dir='$(DESTDIR)$(man8dir)'; $(am__uninstall_files_from_dir) tags TAGS: ctags CTAGS: cscope cscopelist: distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile $(MANS) installdirs: for dir in "$(DESTDIR)$(man5dir)" "$(DESTDIR)$(man8dir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-generic clean-local mostlyclean-am distclean: distclean-am -rm -f Makefile distclean-am: clean-am distclean-generic dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-man install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-man5 install-man8 install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-generic pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: uninstall-man uninstall-man: uninstall-man5 uninstall-man8 .MAKE: install-am install-strip .PHONY: all all-am check check-am clean clean-generic clean-local \ cscopelist-am ctags-am distclean distclean-generic distdir dvi \ dvi-am html html-am info info-am install install-am \ install-data install-data-am install-dvi install-dvi-am \ install-exec install-exec-am install-html install-html-am \ install-info install-info-am install-man install-man5 \ install-man8 install-pdf install-pdf-am install-ps \ install-ps-am install-strip installcheck installcheck-am \ installdirs maintainer-clean maintainer-clean-generic \ mostlyclean mostlyclean-generic pdf pdf-am ps ps-am tags-am \ uninstall uninstall-am uninstall-man uninstall-man5 \ uninstall-man8 include ${top_srcdir}/man/makeman.defs clean-local: -rm -f ${man_MANS} # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: cryptmount-5.2/man/fr/cmtab.5.in0000644000175000017500000003625712521500402013474 00000000000000.\" cmtab (French) manual page .\" Copyright (c) 2006-2015 RW Penney .\" .\" ---- macro definitions ---- .de Sh \" Subsection heading .br .ne 5 .PP \fB\\$1\fR .PP .. .TH CMTAB 5 "2013-12-20" "@PACKAGE_VERSION@" "Manuel de l'utilisateur Linux" .SH NOM cmtab \- informations statiques sur les syst\[`e]mes de fichiers dirig\['e]s par cryptmount .\" -------------------------------- .SH DESCRIPTION Les informations sur les syst\[`e]mes de fichiers chiffr\['e]s dirig\['e]s par .B cryptmount sont contenues dans le fichier @CM_SYSCONF_DIR@/cmtab. Chaque syst\[`e]me de fichiers est appell\['e] par un nom de cible qu'on peut utiliser comme param\[`e]tre de .B cryptmount et ce nom appara\[^i]t dans @CM_SYSCONF_DIR@/cmtab devant une liste des param\[`e]tres qui d\['e]crit o\[`u] le syst\[`e]me de fichiers est contenu, et comment il est chiffr\['e]. Le format du cmtab est souple, et la description de chaque cible est d\['e]limit\['e]e par des accolades, les param\[`e]tres sont sp\['e]cifi\['e]s par les paires CLEF=VALEUR, et on peut mettre autant de caract\[`e]re blanc d'espacement que l'on veut. Les annotations commencent avec un caract\[`e]re `#', qui peut \[^e]tre utilis\['e] \[`a] n'importe quel endroit dans une ligne, et continuent jusqu'\[`a] la fin de cette ligne. Le caract\[`e]re `\\' indique que si le caract\[`e]re suitvant a une signification sp\['e]ciale, celle-ci sera ignor\['e]e, comme par exemple si on veut incorporer un espace dans le nom d'un fichier. @CM_SYSCONF_DIR@/cmtab contient des inscriptions de la forme suivante: .nf NOM_CIBLE { dev=PERIPHERIQUE flags=DRAPEAU,DRAPEAU,... startsector=SECTEURDEBUT numsectors=NUMSECTEURS loop=PERIPH_LOOP dir=REP_MONT fstype=TYPE mountoptions=MOPT,MOPT,... fsckoptions=FOPT;FOPT;... cipher=CHIFFRE ivoffset=IVOFFSET keyformat=FORMAT_CLEF keyfile=FICHIER_CLEF keyhash=HASH_CLEF keycipher=CHIFFRE_CLEF keymaxlen=MAX_CLEF passwdretries=NUMESSAYES } .fi Ici, les param\[`e]tres `flags', `startsector', `numsectors', `loop', `ivoffset', `keyformat', `keymaxlen' et `passwdretries' sont optionnels. Les param\[`e]tres ont les sens suivants: .TP .BI NOM_CIBLE est le nom par lequel cryptmount se r\['e]f\[`e]re \[`a] un syst\[`e]me de fichiers particulier. Il est possible d'indiquer valeurs par d\['e]faut pour les cibles suivanteis en utilisant le nom sp\['e]cial "_DEFAULTS_". .\" ---- .TP .BI PERIPHERIQUE est le nom du vrai p\['e]riph\['e]rique (e.g. /dev/hdb63) ou du fichier ordinaire (e.g. /home/secretiveuser/private.fs) qui range le syst\[`e]me de fichiers chiffr\['e]. .\" ---- .TP .BI DRAPEAU est un bouton de configuration, comme par exemple .nf * "user" (n'importe quel utilisateur peut monter), * "nouser" (seulement le super-utilisateur peut monter), * "fsck" (v\['e]rifier automatiquement le syst\[`e]me de fichiers avant de monter), * "nofsck" (ne v\['e]rifier pas le syst\[`e]me de fichiers avant de monter), * "mkswap" (formater la cible pour la pagination), * "nomkswap" (ne formater pas la cible), * "trim" (activer SSD TRIM/discard), * "notrim" (d\['e]sactiver SSD TRIM/discard). .fi Ce param\[`e]tre est optionnel, et le d\['e]faut est "user,fsck,nomkswap,notrim". .\" ---- .TP .BI SECTEURDEBUT est le numero du secteur (de 512 octets) du .B PERIPHERIQUE o\[`u] le syst\[`e]me de fichiers va commencer. Ce param\[`e]tre est optionnel, et le d\['e]faut est z\['e]ro. .\" ---- .TP .BI NUMSECTEURS donne la taille totale du syst\[`e]me de fichiers, en secteurs (blocs de 512 octets). Ce param\[`e]tre est optionnel, et le d\['e]faut est \-1, ce qui signifie que tout le .B PERIPHERIQUE sera utilis\['e]e. .\" ---- .TP .BI PERIPH_LOOP peut \[^e]tre utilis\['e] pour specifier un p\['e]riph\['e]rique loop particulier (e.g. /dev/loop0) au cas o\[`u] .B PERIPHERIQUE est un fichier ordinaire. Ce param\[`e]tre est optionnel, et le d\['e]faut est "auto". .\" ---- .TP .BI REP_MONT est le r\['e]pertoire dans lequel le syst\[`e]me de fichiers chiffr\['e] sera mont\['e]. .\" ---- .TP .BI TYPE specifie le type du syst\[`e]me de fichiers (comme utilis\['e] par .B mount (8)). On doit specifier "swap" si la p\['e]riph\['e]rique va \[^e]tre utilis\['e]e pour la pagination chiffr\['e]e. .\" ---- .TP .BI MOPT est une option de montage, comme compris par .B mount (8). Typiquement, MOPT peut \[^e]tre "default", "noatime", "noexec", "nosuid", "ro", "sync" etc. .\" ---- .TP .BI FOPT est une option de v\['e]rification, comme compris par .B fsck (8). Typiquement, FOPT peut \[^e]tre "\-C", "\-V" etc. .\" ---- .TP .BI CHIFFRE est le type d'algorithme de chiffrage qui sera utilis\['e] sur .B PERIPHERIQUE. La liste des algorithmes possibles est d\['e]termine par le noyau. .\" ---- .TP .BI FORMAT_CLEF indique quel moteur de chiffrage on utilise pour diriger le .B FICHIER_CLEF. Les moteurs disponibles sont d\['e]termin\['e]s pendant l'installation de .B cryptmount mais peuvent comprendre "openssl" et "libgcrypt" en plus de "builtin" (int\['e]gr\['e]) et "raw" (brut). Ce param\[`e]tre est optionel, est s'il est absent, "builtin" sera utilis\['e] quand la clef est construit. .\" ---- .TP .BI FICHIER_CLEF est un fichier ordinaire qui contient la clef utilis\['e]e par l'algorithme .B CHIFFRE pour d\['e]chiffrer le syst\[`e]me de fichiers. Cette clef elle-m\[^e]me est chiffr\['e]e a partir de .B HASH_CLEF et .B CHIFFRE_CLEF \. .\" ---- .TP .BI IVOFFSET est l'offset qui est ajout\['e] au num\['e]ro du secteur pendant le calcul du vecteur d'initialisation de l'algorithme de chiffrage. Ce param\[`e]tre est optionnel, et le d\['e]faut est z\['e]ro. .\" ---- .TP .BI HASH_CLEF est l'algorithme (hash) utilis\['e] pour brouiller le mot de passe de l'utilisateur dans l'algorithme .B CHIFFRE_CLEF qui protege la clef du syst\[`e]me de fichiers chiffr\['e]. On peut choisir n'importe quel algorithme qui est fourni par le .B FORMAT_CLEF qu'on a choisi. .\" ---- .TP .BI CHIFFRE_CLEF est l'algorithme chiffre qui prot\[`e]ge la clef du syst\[`e]me de fichiers chiffr\['e] lui-m\[^e]me. Le menu d'algorithmes est d\['e]termin\['e] par la choix de .B FORMAT_CLEF .\" ---- .TP .BI MAX_CLEF est le nombre d'octets maximum qui sera lu du .B FICHIER_CLEF pour devenir la clef de d\['e]chiffrage. Ce param\[`e]tre est optionnel, et le d\['e]faut est z\['e]ro, ce qui indique que .B FICHIER_CLEF sera lu en entier. .\" ---- .TP .BI NUMESSAYES est le nombre de tentatives de mot de passe avant que cryptmount aille terminer quand on essaye de monter ou configurer une cible. .\" -------------------------------- .SH COMMENT CHOISIR LE FORMAT DE LA CLEF .B cryptmount offrit un s\['e]lection de fa\[,c]ons pour proteger la clef associ\['e]e avec chaque syst\[`e]me de fichiers chiffr\['e]. Pour le plupart des utilisateurs, la choix d\['e]faute "builtin" donne un bon niveau de securit\['e] et versatilit\['e]. Quelques autre moteurs de chiffrage sont disponible, et donnent plus de choix des algorithms pour brouiller le mot de passe, ou compatabilit\['e] avec quelques autre paquets. Le menu des moteurs sont le suivant. .Sh builtin Ce moteur est inclus dans cryptmount-2.0 et suivant, est utilise un fichier independent pour cacher la clef. .Sh libgcrypt Ce moteur est inclus dans cryptmount-1.1 et suivant, est utilise un fichier independent pour cacher la clef. .Sh luks Ce moteur est inclus dans cryptmount-3.1 et suivant, est peut diriger les syst\[`e]me de fichiers du format LUKS ("Linux Unified Key Setup"). Ce format cache la clef dans une region sp\['e]ciale du syst\[`e]me de fichiers lui-m\[^e]me. Il est recommand\['e] de ne pas utiliser les param\[`e]tres "startsector" ou "numsectors" parce que le format LUKS suppose qu'une partition enti\[`e]re est disponible pour le syst\[`e]me de fichiers. .Sh openssl/openssl-compat Ce moteur etait disponible depuis les premiers versions de cryptmount, et utilise un fichier independent pour cacher la clef. Le format de ce fichier est compatible aver le paquet "openssl". .Sh password Ce moteur est inclus dans cryptmount-4.0 et suivant, est n'a pas besoin d'un fichier pour cacher la clef. Plut\[^o]t, la clef est constui directment du mot de passe, et donc il n'est pas possible de changer le mot de passe sans rechiffrer le syst\[`e]me de fichiers en entiers. .Sh raw Ce moteur est inclus dans cryptmount-1.1 et suivant, est utilise un fichier independent pour contenir la clef, sans aucun chiffrage. Ce moteur est utile principalement pour les partitions de pagination. .\" -------------------------------- .SH SECURITE Etant donn\['e] que .B cryptmount est install\['e] avec des permissions setuid, il est tr\[`e]s imporant que son fichier de configuration soit solide. Id\['e]alement, @CM_SYSCONF_DIR@/cmtab devrait \[^e]tre dirig\['e] seulement par le super-utilisateur, et toutes les clefs devraient \[^e]tre seulement lisibles par leurs utilisateurs propres. .B cryptmount v\['e]rifie la s\['e]curit\['e] du @CM_SYSCONF_DIR@/cmtab chaque fois qu'il est execut\['e], et se terminera \[`a] moins que: .nf * cmtab ne soit poss\['e]d\['e] par le super-utilisateur * cmtab ne soit un fichier r\['e]gulier * les permissions de cmtab ne contiennent pas d'\['e]criture universelle * le r\['e]pertoire, qui contient cmtab, ne soit poss\['e]d\['e] par le super-utilisateur * les permissions du r\['e]pertoire, qui contient cmtab, ne contiennent pas d'\['e]criture universelle. .fi De plus, pour toutes les cibles dans @CM_SYSCONF_DIR@/cmtab, tous les fichiers doivent avoir des nom absolus (c'est\-\[`a]\-dire commencent avec '/'). En cas qu'on a choisi "raw" (brut) pour le .B FORMAT_CLEF c'est pr\['e]f\['e]rable si .B FICHIER_CLEF est rang\['e] avec des permissions d'acc\[`e]s non moins restrictives que 0600, ou bien est contenu sur un disque USB-flash, par exemple. .\" -------------------------------- .SH PAGINATION CHIFFREE ET MKSWAP AUTOMATIQUE Lorsque l'option `mkswap' est s\['e]lectionn\['e] pour une cible particuli\[`e]re dans @CM_SYSCONF_DIR@/cmtab, . B cryptmount tentera automatiquement de formater une partition swap chiffr\['e]e chaque fois que vous ex\['e]cutez "cryptmount \-\-swapon ". C'est souvent utile quand il n'est pas n\['e]cessaire de conserver les donn\['e]es de pagination entre les red\['e]marrages, comme lorsque vous n'utilisez pas les caract\['e]ristiques d'hibernation du noyau. Parce que le reformatage supprime toutes les donn\['e]es existantes sur la partition de pagination choisi, . B cryptmount se faire des v\['e]rifications de base sur le premier m\['e]gaoctet de la partition, bas\['e]e sur le degr\['e] d'al\['e]a (entropie) dans le contenu actuel. Si la partition semble contenir bruit pur, ou a \['e]t\['e] remis \[`a] z\['e]ro, la partition sera format\['e]e automatiquement. Si . B cryptmount d\['e]termine que la partition peut contenir des donn\['e]es non-al\['e]atoire, puis il vous demandera d'ex\['e]cuter "mkswap" manuellement. Comme il n'existe aucun moyen infaillible de d\['e]terminer si une partition (surtout chiffr\['e]e) contient des donn\['e]es importantes, vous devriez \[^e]tre tr\[`e]s prudent sur p\['e]riph\['e]rique brut choisi pour n'importe quelle cible sur lequel vous s\['e]lectionnez l'option "mkswap". .\" -------------------------------- .SH FICHIER EXEMPLE Le @CM_SYSCONF_DIR@/cmtab exemple suivant contient cinq cibles, qui utilisent un m\['e]lange d'algorithmes de chiffrage et qui rangent leurs syst\[`e]mes de fichiers de mani\[`e]res differentes. Il y en a aussi un cible qui represent une partition de pagination. .nf # @CM_SYSCONF_DIR@/cmtab # fichier exemplaire \- modifiez avant d'utiliser SVP _DEFAULTS_ { passwdretries=3 # permet 3 essayes de mot de passe par d\['e]faut } basic { dev=/home/secretiveuser/crypt.fs dir=/home/secretiveuser/crypt # o\[`u] on va monter loop=auto # trouver un p\['e]riph loop libre fstype=ext3 mountoptions=default cipher=aes-cbc-plain # chiffrage du syst\[`e]me de fichiers keyfile=/home/secretiveuser/crypt.key # utiliser le gestionnaire des clefs int\['e]gr\['e] keyformat=builtin } partition { dev=/dev/hdb62 # utiliser une partition enti\[`e]re dir=/mnt/crypt62 fstype=ext3 mountoptions=nosuid,noexec \ cipher=serpent-cbc-plain # info sur le fichier qui contient la clef de d\['e]chiffrage: keyfile=@CM_SYSCONF_DIR@/crypt_hdb62.key keyformat=openssl # utiliser OpenSSL pour chiffrage de la clef keyhash=md5 keycipher=bf\-cbc # chiffrage du fichier de la clef } subset { dev=/dev/hdb63 startsector=512 numsectors=16384 # utiliser une partie d'une partition dir=/mnt/encrypted\\ subset\\ of\\ hdb fstype=reiserfs mountoptions=defaults cipher=twofish-cbc-plain # chiffrage du syst\[`e]me de fichiers # info sur le fichier qui contient la clef de d\['e]chiffrage: keyfile=@CM_SYSCONF_DIR@/crypt_hdb63.key keyformat=libgcrypt keyhash=md5 keycipher=blowfish\-cbc # chiffrage de la clef d'acc\[`e]s } encswap { # pagination chiffr\['e]e dev=/dev/hdb63 startsector=16896 numsectors=1024 # utiliser une partie d'une partition fstype=swap flags=mkswap cipher=twofish-cbc-plain # lire une clef nouvelle de 16-octets de /dev/random chaque fois: keyfile=/dev/random keymaxlen=16 keyformat=raw } luks { # partition cre\['e] avec cryptsetup-luks dev=/dev/hdb63 dir=/mnt/partition-luks keyformat=luks keyfile=/dev/hdb63 fstype=ext3 } # fin de cmtab .fi La cible `basic' utilise le fichier ordinaire "/home/secretiveuser/crypt.fs" pour ranger le syst\[`e]me de fichiers chiffr\['e]. Un p\['e]riph\['e]rique loop sera configur\['e] automatiquement par .B cryptmount (\[`a] cause du "loop=auto"). La cible `partition' utilise une partition enti\[`e]re du disque dur pour ranger le syst\[`e]me de fichiers chiffr\['e]. La clef de d\['e]chiffrage est contenue dans le r\['e]pertoire principal de .B cryptmount. La cible `subset' est semblable \[`a] la cible `partition' sauf qu'elle n'utilise pas une partition enti\[`e]re. De cette mani\[`e]re, on peut utiliser des autres groupes de blocs de la partition pour des autres syst\[`e]mes de fichiers dirig\['e]s par .B cryptmount ou .B dmsetup. La cible `encswap' utilise une partie d'une partition du disque dur pour proviser la pagination chiffr\['e]e. Une nouvelle clef de d\['e]chiffrage sera lu du /dev/random chaque fois la cible est utilis\['e]e. .\" -------------------------------- .SH FICHIERS .I @CM_SYSCONF_DIR@/cmtab - fichier principal du configuration .SH "VOIR AUSSI" .BR cryptmount (8), .BR cryptmount-setup (8), .BR dmsetup (8), .BR openssl (1) .\" -------------------------------- .SH COPYRIGHT NOTICE .B cryptmount est Copyright 2005-2015 RW Penney .br et il n'y a point de garantie. Les termes de sa licence sont d\['e]crits dans le fichier "COPYING" dans le paquet source de cryptmount. .\" -------------------------------- .SH TRADUCTION RW Penney, 2006-2014, avec beaucoup d'assistance de FP. .\" vim: set ts=4 sw=4 et: cryptmount-5.2/man/cmtab.5.in0000644000175000017500000004543412612472540013076 00000000000000.\" cmtab (cryptmount) manual page .\" Copyright (c) 2005-2015 RW Penney .\" .\" ---- macro definitions ---- .de Sh \" Subsection heading .br .ne 5 .PP \fB\\$1\fR .PP .. .TH CMTAB 5 "2015-10-03" "@PACKAGE_VERSION@" "User commands" .SH NAME cmtab \- static information about filesystems managed by cryptmount .\" -------------------------------- .SH DESCRIPTION Information about the encrypted filesystems managed by .B cryptmount is contained in the file @CM_SYSCONF_DIR@/cmtab. Each filesystem is labelled by a target name which can be used as an argument to .B cryptmount and which appears in @CM_SYSCONF_DIR@/cmtab in front of a list of parameters describing where that filesystem is stored, and how it is encrypted. The format of the cmtab is flexible, with the description of each target being delimited by braces, parameters being specified by KEY=VALUE pairs, and white-space being freely usable. Comments are prefixed by a `#' character, and can start at any point in a line, lasting to the end of the line. The backslash character `\\' can be used to ignore any special significance of the following character, for example to include a space in a filename. @CM_SYSCONF_DIR@/cmtab contains entries of the following form: .nf TARGET_NAME { dev=DEVICE # REQUIRED flags=FLAG,FLAG,... startsector=STARTSECTOR numsectors=NUMSECTORS loop=LOOPDEV dir=MOUNT_POINT fstype=TYPE # REQUIRED mountoptions=MOPT,MOPT,... fsckoptions=FOPT;FOPT;... supath=SUPATH bootaction=BOOTACTION cipher=CIPHER ivoffset=IVOFFSET keyformat=KEYMANAGER keyfile=KEYFILE # REQUIRED keyhash=KEYHASH keycipher=KEYCIPHER keymaxlen=KEYMAXLEN passwdretries=NUMATTEMPTS } .fi Some fields, such as `dev' and `fstype' are mandatory, although many fields have sensible default values. Depending on the choice of KEYMANAGER, fields such as `keyhash', `keycipher', `keymaxlen' may need to be set explicitly. Any field which contains non-numerical values (e.g. not `startsector', `ivoffset' etc.) can contain references to environmental variables of the form $(HOME). The following variables are recognized, all based on the characteristics of the user currently running .B cryptmount : .nf * $(HOME) - the home directory, as obtained from /etc/passwd * $(UID) - the numerical identifier of the user * $(USERNAME) - the printable name of the user * $(GID) - the numerical identifier of the user's current group * $(GROUPNAME) - the printable name of the user's current group .fi .\" -------------------------------- .SH TARGET DEFINITIONS The components in each target definition have the following meaning: .TP .B TARGET_NAME { ... } specifies the name that cryptmount uses to refer to a particular filesystem, with configuration options for that filesystem contained within the matching braces. The special name "_DEFAULTS_" may be used to set default values in subsequent targets for various parameters such as 'flags', 'fstype', 'mountoptions', 'cipher', 'keyformat', 'keyhash', 'keycipher', 'keymaxlen', 'passwdretries'. Note that if the "_DEFAULTS_" target appears more than once, each will undo the effects of previous default values - i.e. this pseudo-target does not operate incrementally. .\" ---- .TP .B dev=DEVICE sets the name of the raw device (e.g. /dev/hdb63) or ordinary file (e.g. /home/secretiveuser/private.fs) that contains the encrypted filesystem. Note that it may be useful to use a symbolic name based on an entry beneath /dev/disk/by-id, /dev/disk/by-path, to reduce the risk of device nodes being renamed when new disks are added to the system, etc. .\" ---- .TP .B flags=FLAG,FLAG,... sets configuration switches, such as .nf * "user" (any user can mount), * "nouser" (only root can mount), * "fsck" (automatically check filesystem before mounting), * "nofsck" (don't check filesystem before mounting), * "mkswap" (format swap partition before use), * "nomkswap" (don't format swap partition) * "trim" (enable TRIM/discard support on solid-state disks), * "notrim" (disable SSD TRIM/discard support) .fi This parameter is optional and defaults to "user,fsck,nomkswap,notrim". .\" ---- .TP .B startsector=STARTSECTOR gives the number of sectors (512-byte blocks) into .B DEVICE at which the filesystem is to start. This parameter is optional, and defaults to zero. .\" ---- .TP .B numsectors=NUMSECTORS gives the total length of the filesystem in sectors (512-byte blocks). This parameter is optional, and defaults to \-1 which is shorthand for the total available length of .BR DEVICE . .\" ---- .TP .B loop=LOOPDEV can be used to specify a particular loopback device (e.g. /dev/loop0) to be used when DEVICE is an ordinary file. This parameter is optional and defaults to "auto". .TP .B dir=MOUNT_POINT specifies the directory onto which the encrypted filesystem will be mounted. .\" ---- .TP .B fstype=TYPE sets the filesystem type (as used by .B mount (8)). This must be set to "swap" if the device is to be used as an encrypted swap partition. .\" ---- .TP .B mountoptions=MOPT,MOPT,... sets filesystem mounting options, as used by .B mount (8). MOPT can typically be "default", "noatime", "noexec", "nosuid", "ro", "sync" etc. .\" ---- .TP .B fsckoptions=FOPT;FOPT;... sets filesystem-checking options understood by .B fsck (8). FOPT can typically be "\-C", "\-V" etc. Note that the list of fsck options uses semicolons as a separator to allow passing options that themselves contain commas. .\" ---- .TP .B supath=SUPATH sets the PATH environment variable when running subprocesses as the super-user. This may be necessary when commands such as .B fsck and .B mount need to run subcommands (e.g. fsck.ext4). By default, this PATH is set to @CM_DEFAULT_SUPATH@. .\" ---- .TP .B bootaction=BOOTACTION indicates what action, if any, should be taken for this target on system bootup. BOOTACTION can be one of "none", "mount", "swap" or "prepare". .TP .B cipher=CIPHER sets the encryption algorithm used on the .BR DEVICE . The available algorithms are determined by the system kernel. This parameter is optional and defaults to "@CM_DEFAULT_CIPHER@". .\" ---- .TP .B keyformat=KEYMANAGER specifies the key management scheme used to interact with the .BR KEYFILE , as discussed in the .B CHOICE OF KEYMANAGER section below. The set of available key management schemes is determined when .B cryptmount is built, but may include "libgcrypt", "luks", and "openssl-compat", in addition to "builtin" and "raw". This parameter is optional: if absent, "builtin" will be used on first generating the key, with an automatic choice being made when reading a pre-existing key. .\" ---- .TP .B keyfile=KEYFILE gives the name of an ordinary file that contains the key used by the .B CIPHER algorithm to decrypt the filesystem. This key is itself encrypted in a way specified by the .B KEYHASH and .B KEYCIPHER \. .TP .B ivoffset=IVOFFSET sets the offset added to the sector-number used in constructing the cipher algorithm's initialization vector. This parameter is optional, and defaults to 0. .\" ---- .TP .B keyhash=KEYHASH is the hashing algorithm used to turn the user's password into the decryption key used by the .B KEYCIPHER algorithm. The available hashing algorithms are determined by the chosen key-encryption engine specified by .BR KEYMANAGER . This parameter is optional and the default depends on the value of .BR KEYMANAGER . .\" ---- .TP .B keycipher=KEYCIPHER is the encryption algorithm used to secure the decryption key of the filesystem itself. The available key-encryption algorithms are determined by the chosen key-encryption engine specified by .BR KEYMANAGER . This parameter is optional and the default depends on the value of .BR KEYMANAGER . .\" ---- .TP .B keymaxlen=KEYMAXLEN is the maximum number of bytes of the decryption key that will be read from .BR KEYFILE . This parameter is optional, and defaults to 0, indicating that the full length of .B KEYFILE should be read. .\" ---- .TP .B passwdretries=NUMATTEMPTS is the number of password-entry attempts that can be made before cryptmount will exit with an error-code when trying to mount or configure the target. .\" -------------------------------- .SH CHOICE OF KEYMANAGER .B cryptmount supports a variety of different ways of protecting the access key associated with each encrypted filesystem. For most users, the default \*(lqbuiltin\*(rq keymanager will provide a good level of security and flexibility. Alternative keymanagers offer a wider choice of different password-hashing schemes and compatibility with other encryption tools. The strengths and weaknesses of the different keymanagers are discussed below. .Sh builtin This keymanager is supported by cryptmount-2.0 or later, and uses a separate key-file. A password-based key derivation function (PBKDF) using the SHA1 hashing algorithm, together with blowfish-cbc encryption is used to protect the filesystem key. That key-derivation function was changed in cryptmount-4.0 to improve the security of new keyfiles, while preserving compatibility with existing keyfiles. If you need to write keyfiles in the previous format, you can specify \*(lqkeyformat=builtin:0\*(rq. The KEYHASH and KEYCIPHER parameters are ignored. .Sh libgcrypt This keymanager is supported by cryptmount-1.1 or later, and uses a separate key-file. A password-based key derivation function (PBKDF) is used to protect the filesystem key, with any hashing or cipher algorithm supported by the installed version of the libgcrypt library being available. .Sh luks This keymanager is supported by cryptmount-3.1 or later, and provided compatibility with the Linux Unified Key Setup (LUKS) disk-format. Instead of a separate keyfile, LUKS uses a header within the encrypted filesystem itself. It is advisable to choose the same value for both the 'dev' and 'keyfile' parameters, or leave 'keyfile' unspecified. As with all cryptmount filesystems, the 'dev' parameter may point to either a raw disk partition or an ordinary file. However, because of the filesystem structure assumed by LUKS, it is strongly recommended that you do not use either the 'startsector' or 'numsector' parameters. .Sh openssl/openssl-compat This keymanager has been supported since the earliest release of cryptmount, and uses a separate keyfile which is compatible with the format used by the 'openssl' command-line encryption tool. Since cryptmount-3.0 this file-format has been provided via the libgcrypt library, and is preferably specified by \*(lqkeyformat=openssl-compat\*(rq. A password-based key derivation function (PBKDF) is used to protect the filesystem key, with a choice of hashing or cipher algorithms being available. Most algorithms supported by the 'openssl' command-line tool should be available, provided the underlying algorithms are available within libgcrypt. .Sh password This keymanager is supported by cryptmount\-4.0 or later, and does not require any separate keyfile, but instead derives the filesystem key directly from the user's password. This means that it is not possible to change the access password without re-encrypting the entire filesystem. The 'keyhash' and 'keycipher' parameters are ignored. .Sh raw This keymanager is supported by cryptmount\-1.1 or later, and uses a separate keyfile where the access key is stored directly and .IR "without any encryption" . This keymanager is most useful for managing encrypted swap partitions, where the keyfile can be chosen as /dev/random, and hence where the access key will be different every time it is read. If the keyfile is an ordinary file, it offers minimal security, and should preferably be stored separately from the disk containing the encrypted filesystem, e.g. on a USB flash disk. .\" -------------------------------- .SH SECURITY Because .B cryptmount needs to operate with setuid privileges, it is very important that its configuration file is kept secure. Ideally @CM_SYSCONF_DIR@/cmtab should be managed only by the system administrator, and all key-files should be readable only by their owner. .B cryptmount makes basic checks on the security of @CM_SYSCONF_DIR@/cmtab each time it runs, and will refuse to operate unless the following conditions are met: .nf * cmtab must be owned by root * cmtab must be a regular file * cmtab must not be globally writable * the directory containing cmtab must be owned by root * the directory containing cmtab must not be globally writable .fi In addition, for each target within @CM_SYSCONFDIR@/cmtab, all paths must be absolute (i.e. starting with '/'). When using unencrypted keyfiles (i.e. when .B KEYMANAGER is "raw"), it is recommended that the .B KEYFILE is stored with access permissions no less restrictive than 0600, or on a removable device such as a USB flash-disk. (With recent versions of .B cryptmount the "builtin" key-format should be portable between different installations and vastly more secure than "raw" keyfiles.) It is very important that you do not lose or damage the .B KEYFILE as this file is essential to providing access to your encrypted filesystem. You are strongly advised to consider keeping a backup of your .B KEYFILE in some form. .\" -------------------------------- .SH ENCRYPTED SWAP PARTITIONS & AUTO-FORMATTING When the 'mkswap' option is selected for a particular target within @CM_SYSCONFDIR@/cmtab, .B cryptmount will attempt to automatically format an encrypted swap partition whenever you run "cryptmount \-\-swapon ". This is often useful when there is no need to preserve swap data between reboots, such as when not using the kernel's hibernation features. Because reformatting will destroy any existing data on the chosen swap partition, .B cryptmount will do some basic checking on the first megabyte of the partition, based on the degree of randomness (entropy) in the current contents. If the partition looks like it contains pure noise, or has been zeroed, then the partition will be formatted automatically. If .B cryptmount determines that the partition may contain non-random data, then it will ask you to run 'mkswap' manually. As there is no fool-proof way of determining whether a partition (especially after encryption) contains valuable data, you should be very careful about the raw device chosen for any target on which you select the 'mkswap' option. .\" -------------------------------- .SH EXAMPLE FILE The following example of @CM_SYSCONFDIR@/cmtab consists of five targets, using a variety of encryption algorithms and storing their filesystems in different ways, including a target representing an encrypted swap partition: .nf # @CM_SYSCONFDIR@/cmtab # example file \- please modify before use _DEFAULTS_ { passwdretries=3 # allow 3 password attempts by default } basic { dev=/home/secretiveuser/crypt.fs dir=/home/secretiveuser/crypt # where to mount loop=auto # find free loop\-device fstype=ext3 mountoptions=default cipher=aes-cbc-plain # filesystem encryption keyfile=/home/secretiveuser/crypt.key # use default sha1/blowfish key-encryption: keyformat=builtin } partition { dev=/dev/hdb62 # use whole disk partition dir=/mnt/crypt62 fstype=ext3 mountoptions=nosuid,noexec cipher=serpent-cbc-plain # information about file used to store decryption key: keyfile=@CM_SYSCONFDIR@/crypt_hdb62.key keyformat=openssl # use OpenSSL key-encryption keyhash=md5 keycipher=bf\-cbc # encryption of key file } subset { dev=/dev/hdb63 startsector=512 numsectors=16384 # use subset of partition dir=/mnt/encrypted\\ subset\\ of\\ hdb fstype=reiserfs mountoptions=defaults cipher=twofish-cbc-plain # filesystem encryption # information about file used to store decryption key: keyfile=@CM_SYSCONFDIR@/crypt_hdb63.key keyformat=libgcrypt keyhash=md5 keycipher=blowfish\-cbc # encryption of key file } encswap { # encrypted swap partition bootaction=swap dev=/dev/disk/by-id/scsi-SATA_ST500_ABCDEFG-part37 startsector=16896 numsectors=1024 # use subset of partition fstype=swap flags=mkswap cipher=twofish-cbc-plain # read fresh 16-byte key from /dev/random whenever used: keyfile=/dev/random keymaxlen=16 keyformat=raw } luks { # partition created by cryptsetup-luks dev=/dev/hdb63 dir=/mnt/luks-partition-$(USERNAME) keyformat=luks keyfile=/dev/hdb63 fstype=ext3 } # end of cmtab .fi The 'basic' target uses an ordinary file "/home/secretiveuser/crypt.fs" to store the encrypted filesystem, perhaps within a normal user's home directory. A loopback device will be automatically allocated (because of the "loop=auto") by .B cryptmount to turn this into a block-special device, before mounting. The decryption key for the filesystem is also stored in this user's home directory, making it easier for them to change the password protecting the key. The 'partition' target uses a whole disk partition to store the encrypted filesystem, with the decryption key stored in the main .B cryptmount configuration directory. The 'subset' target is similar to the 'partition' target except that it does not use a whole disk partition. This would allow other groups of blocks within that partition to be used for other filesystems managed via .B cryptmount or .B dmsetup. The 'encswap' target uses a subset of blocks within a disk partition to form an encrypted swap device. A new encryption key is read from the system random-number generator /dev/random every time the target is used. ___DELETE_CSWAP_1 Note that the current installation of .B cryptmount does not appear to have support for crypto-swap enabled. ___END_CSWAP_1 The 'luks' target provides access to an encrypted partition created by the 'cryptsetup-luks' utility. By using the environmental variable $(USERNAME), the filesystem's mount-point will vary depending on which user invokes .B cryptmount. For example, user 'joe' would find the filesystem mounted below /mnt/luks-partition-joe. .B cryptmount will be able to mount and unmount the partition, but various advanced LUKS features must be accessed through .B cryptsetup .\" -------------------------------- .SH FILES .I @CM_SYSCONF_DIR@/cmtab - main configuration file .SH "SEE ALSO" .BR cryptmount (8), .BR cryptmount-setup (8), .BR cryptsetup (8), .BR dmsetup (8), .BR openssl (1) .\" -------------------------------- .SH COPYRIGHT NOTICE .B cryptmount is Copyright 2005-2015 RW Penney .br and is supplied with NO WARRANTY. Licencing terms are as described in the file "COPYING" within the cryptmount source distribution. .\" vim: set ts=4 sw=4 et: cryptmount-5.2/man/cryptmount-setup.8.in0000644000175000017500000000205012400360510015344 00000000000000.\" cryptmount-setup manual page .\" Copyright (c) 2007-2014 RW Penney .\" .TH CRYPTMOUNT-SETUP 8 "2013-05-17" "@PACKAGE_VERSION@" "User commands" .SH NAME cryptmount-setup \- setup a new encrypted filesystem .\" -------------------------------- .SH SYNOPSIS .BI "cryptmount-setup" .\" -------------------------------- .SH DESCRIPTION .B cryptmount-setup assists in the initial configuration of an encrypted filesystem, to be managed by .B cryptmount (8). If run by the superuser, .B cryptmount-setup will allow a basic encrypted filesystem to be created within an ordinary file. The size, location, mount-point and ownership of the filesystem can be selected interactively. For more advanced options, please see the manual page for .B cryptmount (8) or .B cmtab (5) .SH "SEE ALSO" .BR cmtab (5) .BR cryptmount (8) .\" -------------------------------- .SH COPYRIGHT NOTICE .B cryptmount is Copyright 2005-2014 RW Penney .br and is supplied with NO WARRANTY. Licencing terms are as described in the file "COPYING" within the cryptmount source distribution. cryptmount-5.2/RELNOTES0000644000175000017500000004574612613124531011721 00000000000000 Release notes for cryptmount-5.2 RW Penney, 24th October 2015 Introduction ============ cryptmount is a utility for GNU/Linux operating systems which allows an ordinary user to mount an encrypted filing system without requiring superuser privileges, and which assists the system-administrator in creating and managing encrypted filesystems & swap-partitions. cryptmount was written to address differences between the capabilities of the loopback device of the 2.4/2.6 kernel series and the newer, preferred, device-mapper mechanisms of kernels since linux-2.6. cryptmount automatically performs the various stages of configuring any supporting loopback and device-mapper targets needed to access an encrypted filing system before actually mounting it, but without requiring the user to be explicitly granted root privileges through either knowing the root password or through tools such as sudo. Filesystems managed by cryptmount can also be designated so that only the superuser can (un)mount them. By allowing user-level, on-demand, mounting of encrypted filing systems, cryptmount allows filesystems that are only used intermittently to be left in a more secure state than if they have to be made available by the system administrator whenever the system is booted. cryptmount also provides an aid to the system manager in allowing easier control over the configuration and mounting of encrypted filesystems, especially within system start-up scripts. Summary of new features in cryptmount-5.2 ========================================= This (stable) release offers the following enhancements: * Fixes to filesystem-check (fsck) PATH setup * Allowing multiple password attempts within setup script * Various code cleanups It has been tested on the following systems: * Arch Linux (late-Oct-2015) (x86) * CentOS 7.1 (x86_64) * Debian GNU/Linux 9.x ("stretch"/"testing", late-Oct-2015) (x86) * Debian GNU/Linux 8.2 ("jessie") (x86, amd64) * Gentoo (late-Oct-2015) (x86) * Ubuntu 15.10 ("wily") (x86_64) Summary of new features in cryptmount-5.1 ========================================= This (stable) release offers the following enhancements: * Improved portability of RPM build scripts It has been tested on the following systems: * Arch Linux (early-May-2015) (x86) * CentOS 7.1 (x86_64) * Debian GNU/Linux 8.0 ("jessie") (x86, amd64) * Debian GNU/Linux 7.3 ("wheezy") (x86) * Fedora 21 (x86_64) * OpenSuSE 13.2 ("harlequin") (x86) * Ubuntu 15.04 ("vivid") (x86_64) Summary of new features in cryptmount-5.0 ========================================= This (stable) release offers the following enhancements: * Delegation of all LUKS functionality to libcryptsetup * Addition of '--status' option to query filesystem mounting status It has been tested on the following systems: * Arch Linux (late-Apr-2014) (x86) * Gentoo (late-Apr-2014) (x86) * Debian GNU/Linux 7.x ("jessie"/"testing", late-Apr-2014) (x86) * Debian GNU/Linux 7.3 ("wheezy") (x86, amd64) * Mageia 4 (x86) * OpenSuSE 12.3 ("dartmouth") (x86_64) * Ubuntu 14.04 ("trusty") (x86_64) Summary of new features in cryptmount-4.5 ========================================= This (stable) release offers the following enhancements: * Support for TRIM/allow_discards options suitable for solid-state disks * Moving run-time state information from /etc into /run * Updating of loop-device management to use /dev/loop-control interface It has been tested on the following systems: * Arch Linux (early-Jan-2014) (x86) * CentOS 6.5 (x86_64) * Debian GNU/Linux 7.x ("jessie"/"testing", early-Jan-2014) (x86) * Debian GNU/Linux 7.3 ("wheezy") (x86, amd64) * Debian GNU/Linux 6.0 ("squeeze") (x86) * Debian GNU/Linux 5.0 ("lenny") (x86) * Fedora 20 ("heisenbug") (x86_64) * Gentoo (early-Jan-2014) (x86) * Mageia 3 (x86) * OpenSuSE 12.3 ("dartmouth") (x86_64) * Ubuntu 13.10 ("saucy") (x86_64) Summary of new features in cryptmount-4.4 ========================================= This (stable) release offers the following enhancements: * Support for systemd * Unified support for automatic filesystem setup on system boot * Improved handling of kernel module loading on initial setup * Improved support for management of LUKS partitions to mirror cryptsetup-1.6 It has been tested on the following systems: * Arch Linux (mid-May-2013) (x86) * CentOS 6.4 (x86_64) * Debian GNU/Linux 7.x ("jessie"/"testing", mid-May-2013) (x86) * Debian GNU/Linux 7.0 ("wheezy") (x86, amd64) * Debian GNU/Linux 6.0 ("squeeze") (x86) * Debian GNU/Linux 5.0 ("lenny") (x86) * Fedora 18 ("spherical cow") (x86_64) * Gentoo (x86, mid-May-2013) * OpenSuSE 12.2 ("mantis") (x86_64) * Ubuntu 13.04 ("raring ringtail") (x86_64) Summary of new features in cryptmount-4.3 ========================================= This (stable) release offers the following enhancements: * Support for environmental variables within target definitions * Improved support for management of LUKS partitions to mirror cryptsetup-1.4 It has been tested on the following systems: * CentOS 5.7 (x86) * Debian GNU/Linux 6.1 ("wheezy"/"testing", mid-March-2012) (x86) * Debian GNU/Linux 6.0 ("squeeze") (x86, amd64) * Fedora 16 (x86_64) * Gentoo (x86, mid-February-2012) * Linux Mint 11 ("kataya") * OpenSuSE 11.4 (x86) * Ubuntu 10.04 ("lucid lynx") (x86_64) Summary of new features in cryptmount-4.2 ========================================= This (stable) release offers the following enhancements: * Improved protection against accidental formatting of swap partitions * Improved support for management of LUKS partitions to mirror cryptsetup-1.2 It has been tested on the following systems: * CentOS 5.6 (x86) * Debian GNU/Linux 6.1 ("wheezy"/"testing", mid-June-2011) (x86) * Debian GNU/Linux 6.0 ("squeeze") (x86, amd64) * Debian GNU/Linux 5.0 ("lenny") (x86) * Fedora 13 (x86_64) * Gentoo (x86, early-June-2011) * OpenSuSE 11.4 (x86) * Ubuntu 10.04 ("lucid lynx") (x86_64) * Ubuntu 8.04 ("hardy heron") (x86) Summary of new features in cryptmount-4.1 ========================================= This (stable) release focuses on compatibility improvements including: * Facilities for user-supplied options to 'fsck' for automatic checking of filesystems on mounting * Improved support for management of LUKS partitions to mirror cryptsetup-1.1 including user-selected hashing functions and code-cleanup It has been tested on the following systems: * Debian GNU/Linux 5.1 ("squeeze"/"testing", mid-May-2010) (x86) * Debian GNU/Linux 5.0 ("lenny") (x86, amd64, ppc) * Fedora 12 (x86) * FedoraCore-7 (x86) * Gentoo (x86, late-May-2010) * OpenSuSE 11.1 (x86) * Slackware 12.2 (x86) * Ubuntu 10.04 ("lucid lynx") (amd64) * Ubuntu 8.04 ("hardy heron") (x86) Summary of new features in cryptmount-4.0 ========================================= This (stable) release focuses on security & functionality improvements including: * Support for encrypted filesystems protected by password, without the need for a separate keyfile or partition header * Enhanced protection against password attacks in the builtin key-manager through additional hash-based password strengthening * Improved support for selecting different encryption schemes when creating LUKS partitions * Substantial tidying of internal interfaces & removal of legacy code It has been tested on the following systems: * Debian GNU/Linux 5.1 ("squeeze"/"testing", late-Apr09) (x86) * Debian GNU/Linux 5.0 ("lenny") (x86, ppc) * Debian GNU/Linux 4.0 ("etch") (x86, amd64) * Fedora 9 (x86) * FedoraCore-7 (x86) * OpenSuSE 11.1 (x86) * Slackware 12.2 (x86) * Ubuntu 8.04 ("hardy heron") (x86) * Ubuntu 7.10 ("gutsy gibbon") (x86) Summary of new features in cryptmount-3.1 ========================================= This (stable) release focuses on adding support for LUKS partitions * Support for mounting of existing LUKS partitions was added * Support for basic formatting of LUKS partitions was added * Support for changing passwords on LUKS partitions was added It has been tested on the following systems: * Debian GNU/Linux 4.1 ("lenny"/testing, mid-Sep08) (x86) * Debian GNU/Linux 4.0 ("etch") (x86, amd64) * Fedora 9 (x86) * FedoraCore-7 (x86) * OpenSuSE Linux 10.2 OSS (x86) * Ubuntu 8.04 ("hardy heron") (x86) * Ubuntu 7.10 ("gutsy gibbon") (x86) Summary of new features in cryptmount-3.0 ========================================= This (stable) release focuses on code-tidying and usability improvements * Support for default settings within filesystem configuration file * Support for multiple password attempts when interactively mounting encrypted filesystems * Improved internationalization infrastructure in filesystem setup-script, including French localization * German localization of message in main application * Removed dependence on OpenSSL library for OpenSSL-compatible access-keys It has been tested on the following systems: * Debian GNU/Linux 4.1 ("lenny"/testing, mid-May08) (x86) * Debian GNU/Linux 4.0 ("etch") (x86, amd64) * FedoraCore-7 (x86) * FedoraCore-5 (x86) * OpenSuSE Linux 10.2 OSS (x86) * Ubuntu 8.04 ("hardy heron") (x86) * Ubuntu 7.10 ("gutsy gibbon") (x86) Summary of new features in cryptmount-2.2 ========================================= This (stable) release focuses on code-tidying and usability improvements * Support for reading passwords from streams, to allow integration with scripts or GUI wrappers * Prioritization of libgcrypt (with OpenSSL compatibility layer) over libssl for access-key security It has been tested on the following systems: * Debian GNU/Linux 4.0 ("etch") (x86, amd64) * Debian GNU/Linux 3.1 ("sarge") (x86) * FedoraCore-7 (x86) * FedoraCore-5 (x86) * OpenSuSE Linux 10.2 OSS (x86) * Ubuntu 7.10 ("gutsy gibbon") (x86) Summary of new features in cryptmount-2.1 ========================================= This (stable) release focuses on extended functionality and consolidation * Setup script added for basic configuration of new encrypted filesystems * Support for OpenSSL key-files via the libgcrypt library * Facilities for translating between access-keys stored in different formats * Improved handling of system shutdown while loopback filesystems are active It has been tested on the following systems: * Debian GNU/Linux 4.0 ("etch") (x86, amd64) * Debian GNU/Linux 3.1 ("sarge") (x86) * FedoraCore-7 (x86) * FedoraCore-5 (x86) * OpenSuSE Linux 10.2 OSS (x86) * Ubuntu 7.04 ("feisty fawn") (x86) (may need 'modprobe dm-crypt' and creation of extra /dev/loop? nodes) Summary of new features in cryptmount-2.0 ========================================= This (stable) release focuses on extended functionality and improved internal structure, including: * Built-in key management based on SHA1 + Blowfish crypto-algorithms, which can be used when OpenSSL or libgcrypt are not available (e.g. during system boot-up, or if not installed at all) * OpenSSL & libgcrypt key-management now available through dynamically loadable modules * Improved support for very large (64bit) filing systems * Improved support for setup of encrypted devices at system boot * Various improvements to error-trapping and portability It has been tested on the following systems: * Debian GNU/Linux 4.0 ("etch") (x86, amd64) * Debian GNU/Linux 3.1 ("sarge") (x86, kernel-2.6) * OpenSuSE Linux 10.2 OSS (x86) * FedoraCore-5 (x86) Summary of new features in cryptmount-1.2 ========================================= This (stable) release focuses on extensions in functionality, including: * support for reading configuration data via the command-line * support for priority-setting on crypto-swap * improved robustness to pathological (un)mount operations It has been tested on the following systems: * Debian GNU/Linux 3.1 ("sarge") (x86, kernel-2.6) * Ubuntu 6.06.1 ("dapper drake") (x86) (may need patching of 'dd' and creation of extra /dev/loop? nodes) * SuSE Linux 10.0 OSS (x86) * Mandriva Linux 2005 (x86) * FedoraCore-5 (x86) * FedoraCore-4 (x86) Summary of new features in cryptmount-1.1 ========================================= This (stable) release focuses on extensions in functionality, including: * support for encrypted swap partitions * multiple formats for key-files, currently either OpenSSL or libgcrypt * addition of a script for mounting filesystems/swap partitions at boot It has been tested on the following systems: * Debian GNU/Linux 3.1 ("sarge") (x86, kernel-2.6) * SuSE Linux 10.0 OSS (x86) * Mandriva Linux 2005 (x86) * FedoraCore-5 (x86) * FedoraCore-4 (x86) Summary of new features in cryptmount-1.0 ========================================= This (stable) release focuses on extensions in robustness, user-friendliness and internationalization, including: * addition of options for changing the access password for each target * addition of mechanisms for generating random decryption keys for new filesystems * addition of compile-time option for responding to invocation via linked executables named "cryptumount", "cryptunmount" etc. * added support for GNU gettext, including French translations of manual pages and common messages * improved mechanisms for preventing unauthorized unmounting of filesystems It has been tested on the following systems: * Debian GNU/Linux 3.1 ("sarge") (x86, kernel-2.6) * SuSE Linux 10.0 OSS (x86) * Mandriva Linux 2005 (x86) * FedoraCore-4 (x86) (may need extra configuration of security policies governing losetup, mke2fs etc) Summary of new features in cryptmount-0.4 ========================================= This (beta) release focuses on extensions in functionality and robustness, including: * addition of switches allowing filesystem mounting to be restricted only to superuser * addition of automatic filesystem checking (via fsck) prior to mounting * compile-time choice between in-built mount, or /bin/mount etc * addition of facility for unencrypted filesystem key (e.g. stored on removable device such as a USB key) It has been tested on the following systems: * Debian GNU/Linux 3.1 ("sarge") (x86, kernel-2.6) * FedoraCore-4 (x86) (may need extra configuration of security policies governing losetup, mke2fs etc) * Mandriva Linux 2005 (x86) * SuSE Linux 10.0 OSS (x86) Summary of new features in cryptmount-0.3 ========================================= This (beta) release focuses on extensions in functionality and robustness, including: * addition of '--all' command-line option, for example to allow easier unmounting of all encrypted filing systems via 'cryptmount --unmount --all' * multiple targets can be specified on the command-line, for example for mounting multiple filing systems at the same time * support for loopback filingsystems >2GB has been improved * all mounting/unmounting activity is now recorded via syslog * security checks on the configuration file have been extended * improved documentation of password-changing & fsck tasks It has been tested on the following systems: * Debian GNU/Linux 3.1 ("sarge") (x86, kernel-2.6) * FedoraCore-4 (x86) (may need extra configuration of security policies governing losetup, mke2fs etc) * Mandriva Linux 2005 (x86) * SuSE Linux 10.0 OSS (x86) Summary of new features in cryptmount-0.2 ========================================= This (beta) release focuses on extensions in functionality, including: * addition of optional configuration-file parameters for selecting a subset of blocks within a device for hosting the filing system * addition of optional configuration-file parameter for selecting a particular loopback device rather than having one chosen automatically * addition of optional cipher-IV parameter to configuration-file * improved detection of errors in the configuration-file * basic security checks performed on configuration-file and target-description before any privileged action is taken It has been tested on the following systems: * Debian GNU/Linux 3.1 ("sarge") (x86, kernel-2.6) * FedoraCore-4 (x86) (may need extra configuration of security policies governing losetup, mke2fs etc) * Mandriva Linux 2005 (x86) * SuSE Linux 10.0 OSS (x86) Summary of new features in cryptmount-0.1 ========================================= This (beta) release focuses on improvements in robustness, portability and documentation, including: * improved support for systems with glibc built against kernel-2.4 headers * addition of mechanisms for updating /etc/mtab on (un)mounting filing systems, so the programs such as df can operate normally on filesystems controlled by cryptmount * clearer examples on usage within README & the cryptmount man-page (avoiding ambiguities about whether 'aes256', rather than 'aes', is a valid kernel-module name) It has been tested on the following systems: * Debian GNU/Linux 3.1 ("sarge") (x86, kernel-2.6) * FedoraCore-4 (x86) (may need extra configuration of security policies governing losetup, mke2fs etc) * Mandriva Linux 2005 (x86) * SuSE Linux 10.0 OSS (x86) Summary of new features in cryptmount-0.0.3 =========================================== This (alpha) release further improves robustness, and portability including: * a bug which restricted protection of cipher-key to the Blowfish and md5 algorithms has been fixed, thereby allowing any cipher/hash supported by the openssl library to be used * differences in behaviour of libdevmapper which may or may not create device-nodes below /dev/mapper, have been allowed for * an automatic testing script has been written * improved detection of failure to decrypt the cipher-key has been added It has been tested on the following systems: * Debian GNU/Linux 3.1 ("sarge") (x86, kernel-2.6) * SuSE Linux 10.0 OSS (x86) Summary of new features in cryptmount-0.0.2 =========================================== This (alpha) release of cryptmount improves general robustness and documentation as follows: * a basic manual-page has been written * a locking mechanism has been added, to ensure that only the (non-root) user that mounted a filing system can unmount it * tidying-up of devices occurs if mounting fails It has been tested on the following system: * Debian GNU/Linux 3.1 ("sarge") (x86, kernel-2.6) Summary of features in cryptmount-0.0.1 ======================================= This initial (pre-alpha) release of cryptmount offers the following features: * support for all encryption algorithms supported by the kernel * encryption of cipher-key by Blowfish algorithm & md5 message-digest It has been tested on the following system: * Debian GNU/Linux 3.1 ("sarge") (x86, kernel-2.6) Acknowledgements ================ Please see the file 'AUTHORS' in the source package for a list of contributors. cryptmount-5.2/configure.ac0000644000175000017500000002315012613124531013012 00000000000000dnl autoconf script for cryptmount dnl (C)Copyright 2005-2015, RW Penney dnl run 'aclocal; autoconf; automake -a -c -i; ./configure; make' AC_INIT(cryptmount, 5.2, cryptmount@rwpenney.org.uk) AC_PREREQ(2.59) SYSPATH="/sbin:/bin:/usr/sbin:/usr/bin" CM_SYSCONF_DIR="${sysconfdir}/cryptmount" CM_DEFAULT_SUPATH=${SYSPATH} CM_DEFAULT_CIPHER="aes-cbc-plain" LIBS_GCRY="" LIBS_LUKS="" AM_INIT_AUTOMAKE([no-dependencies]) AC_GNU_SOURCE AC_PROG_CC AC_PROG_MAKE_SET AC_PROG_INSTALL AC_PROG_RANLIB AC_SYS_LARGEFILE AC_SEARCH_LIBS(nanosleep, posix, [AC_DEFINE(HAVE_NANOSLEEP,[1],[Define to 1 if you have nanosleep()])], [AC_DEFINE(HAVE_NANOSLEEP,[0],[Define to 1 if you have nanosleep()])]) AC_SEARCH_LIBS(tcgetattr, termios, [AC_DEFINE(HAVE_TERMIOS,[1],[Define to 1 if you have tcgetattr()])], [AC_DEFINE(HAVE_TERMIOS,[0],[Define to 1 if you have tcgetattr()])]) AC_STDC_HEADERS AC_CHECK_HEADERS([errno.h getopt.h mntent.h linux/fs.h linux/loop.h]) AC_CHECK_FUNCS([ioctl memset mknod open strncpy syslog]) AC_SEARCH_LIBS(log, m) AC_C_CONST dnl -------- dnl allow customization of /run or /var/run dnl - this will eventually be superseded by $runstatedir in autoconf-2.70 dnl if test -d /run; then default_sysrundir="/run"; else default_sysrundir="/var/run"; fi AC_ARG_WITH([sysrundir], AS_HELP_STRING([--with-sysrundir=DIR], [directory for run-time state]), [sysrundir="${withval}"], [sysrundir="${default_sysrundir}"]) if test "x${sysrundir}" = "xyes" -o "x${sysrundir}" = "xno"; then CM_SYSRUN_DIR="${default_sysrundir}" else CM_SYSRUN_DIR="${sysrundir}" fi dnl -------- dnl check for (essential) presence of libdevmapper dnl AC_CHECK_HEADER([libdevmapper.h], [AC_DEFINE(HAVE_LIBDEVMAP,[1], [Define to 1 if you have libdevmapper header files])], [AC_MSG_ERROR([libdevmapper-devel package is needed to build cryptmount])]) AC_SEARCH_LIBS(dm_task_create, devmapper, [], [AC_MSG_ERROR([libdevmapper package is needed to build cryptmount])]) AC_CHECK_DECLS([dm_task_secure_data], [], [], [#include ]) dnl -------- dnl libgcrypt key-manager dnl AC_CHECK_HEADER([gcrypt.h], [dfltGCRY="yes"], [dfltGCRY="no"]) AC_ARG_WITH([libgcrypt], AS_HELP_STRING([--with-libgcrypt], [support libgcrypt-encryption of keys]), [libgcrypt="${withval}"], [libgcrypt="${dfltGCRY}"]) if test "x${libgcrypt}" = "xyes"; then AC_SEARCH_LIBS(gcry_cipher_open, gcrypt, [AC_DEFINE(HAVE_LIBGCRYPT, [1], [Define to 1 if you have libgcrypt header files])], [AC_MSG_ERROR([cannot find libgcrypt libraries])]) else AC_DEFINE(HAVE_LIBGCRYPT, [0], [Define to 1 to enable libgcrypt support]) fi dnl -------- dnl OpenSSL emulation with libgcrypt dnl AC_ARG_ENABLE([openssl-compat], AS_HELP_STRING([--enable-openssl-compat], [enable libgcrypt-based OpenSSL compatible key-files (default is YES)]), [sslcompat="${enableval}"], [sslcompat="yes"]) if test "x${sslcompat}" = "xyes"; then AC_DEFINE(USE_GCRYOSSL, [1], [Define to 1 to enable OpenSSL-compatible keys via libgcrypt]) else AC_DEFINE(USE_GCRYOSSL, [0]) fi dnl -------- dnl udev libraries dnl AC_ARG_ENABLE([libudev], AS_HELP_STRING([--enable-libudev], [(EXPERIMENTAL) use libudev for /dev events (default=NO)]), [use_libudev="${enableval}"], [use_libudev="no"]) if test "x${use_libudev}" = "xyes"; then AC_CHECK_HEADER([libudev.h], AC_SEARCH_LIBS(udev_queue_get_queue_is_empty, udev, [udevlib="yes"], [udevlib="no"]), [udevlib="no"]) else udevlib="no" fi if test "x${udevlib}" = "xyes"; then AC_DEFINE(HAVE_LIBUDEV, [1], [Define to 1 if you have libudev header files]) fi dnl -------- dnl libcryptsetup libraries (needed for LUKS/cryptsetup key-manager) dnl PKG_CHECK_MODULES([libcryptsetup], [libcryptsetup >= 1.4], [libcs="yes"], [libcs="no"]) if test "x${libcs}" = "xyes"; then AC_DEFINE(HAVE_LIBCRYPTSETUP, [1], [Define to 1 if you have the libcryptsetup header files]) fi dnl -------- dnl LUKS key-management (implicitly dependent on libgcrypt) dnl AC_ARG_ENABLE([luks], AS_HELP_STRING([--enable-luks], [enable key-management via Linux Unified Key Setup (default is YES)]), [use_lukscompat="${enableval}"], [use_lukscompat="${libgcrypt}"]) if test "x${use_lukscompat}" = "xyes" \ -a \( "x${libgcrypt}" != "xyes" -o "x${libcs}" != "xyes" \); then AC_MSG_WARN([LUKS support requires libcryptsetup and libgcrypt libraries]) use_lukscompat="no" fi if test "x${use_lukscompat}" = "xyes"; then AC_DEFINE(USE_LUKSCOMPAT, [1], [Define to 1 to enable LUKS compatbility layer]) LIBS="${LIBS} ${libcryptsetup_LIBS}" CPPFLAGS="${CPPFLAGS} ${libcryptsetup_CFLAGS}" AC_SEARCH_LIBS(crypt_keyslot_change_by_passphrase, libcryptsetup, [AC_DEFINE(HAVE_LIBCRYPTSETUP_1_6, [1], [Is libcryptsetup >= 1.6.0 available?])], [AC_DEFINE(HAVE_LIBCRYPTSETUP_1_6, [0])]) else AC_DEFINE(USE_LUKSCOMPAT, [0]) fi AM_CONDITIONAL(BUILD_LUKSCOMPAT, test "x$use_lukscompat" = "xyes") dnl -------- dnl delegation of mount/umount functionality dnl AC_ARG_ENABLE([delegation], AS_HELP_STRING([--enable-delegation], [delegate (un)mounting to /bin/(u)mount (default is YES)]), [delegation="${enableval}"], [delegation="yes"]) if test "x${delegation}" = "xyes"; then dfltERSATZ=0; else dlftERSATZ=1; fi AC_CHECK_PROG([ERSATZ_MOUNT], [mount], [${dfltERSATZ}], [1], ${SYSPATH}) AC_PATH_PROG([PATH_MOUNT], [mount], [NOTHING], ${SYSPATH}) AC_CHECK_PROG([ERSATZ_UMOUNT], [umount], [${dfltERSATZ}], [1], ${SYSPATH}) AC_PATH_PROG([PATH_UMOUNT], [umount], [NOTHING], ${SYSPATH}) dnl -------- dnl crypt-swap support dnl AC_ARG_ENABLE([cswap], AS_HELP_STRING([--enable-cswap], [enable crypto-swap support (default is YES)]), [use_cswap="${enableval}"], [use_cswap="yes"]) if test "x${use_cswap}" = "xyes"; then dfltSWAP=1; AC_SEARCH_LIBS(swapon, c, [], [AC_MSG_ERROR([swapon() system-call is needed for crypto-swap])]) else dfltSWAP=0; fi AC_CHECK_PROG([WITH_CSWAP], [mkswap], [${dfltSWAP}], [0], ${SYSPATH}) AC_PATH_PROG([PATH_MKSWAP], [mkswap], [NOTHING], ${SYSPATH}) dnl -------- dnl automatic filesystem checking dnl AC_ARG_ENABLE([fsck], AS_HELP_STRING([--enable-fsck], [check filesystems before mounting (default is YES)]), [fsck="${enableval}"], [fsck="yes"]) if test "x${fsck}" = "xyes"; then dfltFSCK=1; else dfltFSCK=0; fi AC_CHECK_PROG([WITH_FSCK], [fsck], [${dfltFSCK}], [0], ${SYSPATH}) AC_PATH_PROG([PATH_FSCK], [fsck], [NOTHING], ${SYSPATH}) dnl -------- dnl internationalization dnl AM_GNU_GETTEXT_VERSION([0.16.1]) AM_GNU_GETTEXT([external]) dnl -------- dnl argv[0] switches of default mode dnl AC_ARG_ENABLE([argv0switch], AS_HELP_STRING([--enable-argv0switch], [default action given by progname (default is NO)]), [argv0switch="${enableval}"], [argv0switch="no"]) if test "x${argv0switch}" = "xyes"; then AC_DEFINE(WITH_ARGV0, 1, [use program-name to alter default action]) fi dnl -------- dnl Doxygen documentation dnl AC_CHECK_PROG([use_doxygen], [doxygen], [yes], [no], ${SYSPATH}) AC_ARG_WITH([docdir], AS_HELP_STRING([--with-docdir], [directory for assembling source-code documentation]), [], [with_docdir=./DoxyDocs]) if test "x${with_docdir}" != "xno"; then DOXYGEN_DOCDIR="${with_docdir}" fi AM_CONDITIONAL(HAVE_DOXYGEN, test "x$use_doxygen" = "xyes") AC_SUBST(DOXYGEN_DOCDIR) dnl -------- dnl systemd vs sysv boot support dnl AC_ARG_WITH([systemd], AS_HELP_STRING([--with-systemd], [whether boot-up support should be via systemd or sysvinit (default is NO)])) if test "x${with_systemd}" != "xyes"; then true fi AM_CONDITIONAL(USE_SYSTEMD, test "x$with_systemd" = "xyes") dnl -------- dnl substitute variables for location of configuration files etc dnl AC_SUBST(CM_SYSCONF_DIR) AC_SUBST(CM_SYSRUN_DIR) AC_SUBST(LIBS_GCRY) AC_SUBST(LIBS_LUKS) AC_SUBST(CM_DEFAULT_CIPHER) AC_SUBST(CM_DEFAULT_SUPATH) AC_DEFINE(CM_DEFAULT_CIPHER, [], [Default filesystem encryption algorithm]) AC_DEFINE_UNQUOTED(CM_DEFAULT_CIPHER, ["${CM_DEFAULT_CIPHER}"]) AC_CONFIG_FILES([ Makefile delegates.h man/Makefile man/fr/Makefile po/Makefile.in sysinit/Makefile testing/Makefile doxygen.conf ]) AC_CONFIG_HEADERS([config.h]) AC_OUTPUT dnl -------- dnl configuration-summary messages dnl eval msg_conf="${CM_SYSCONF_DIR}" if test "${ERSATZ_MOUNT}" -ne 0; then msg_mount="(internal)"; else msg_mount="${PATH_MOUNT}"; fi if test "${ERSATZ_UMOUNT}" -ne 0; then msg_umount="(internal)"; else msg_umount="${PATH_UMOUNT}"; fi if test "${WITH_FSCK}" -ne 0; then msg_fsck="${PATH_FSCK}"; else msg_fsck="(disabled)"; fi msg_gcry="${libgcrypt}" if test "x${libgcrypt}" = "xyes"; then if test "x${sslcompat}" = "xyes"; then msg_gcry="${msg_gcry} (with OpenSSL emulator)"; else msg_gcry="${msg_gcry} (without OpenSSL emulator)"; fi fi msg_luks="${use_lukscompat}" AC_MSG_NOTICE([ cryptmount-${PACKAGE_VERSION} is now configured with: Source location: $srcdir Installation prefix: $prefix Configuration directory: $msg_conf Run-state directory: ${CM_SYSRUN_DIR} Filesystem mounting: $msg_mount Filesystem unmounting: $msg_umount Filesystem checking: $msg_fsck Crypto-swap support: $use_cswap libgcrypt support: $msg_gcry libudev support (EXPERIMENTAL): $udevlib LUKS support: $msg_luks ]) dnl vim: set ts=4 sw=4 et: cryptmount-5.2/README.sshfs0000644000175000017500000000507112476371336012551 00000000000000Encrypted filesystem on a remote host using "cryptmount" (A) Assumptions * Remote machine is called "rmach" * User login on the local machine is "luser" * User login on the remote machine is "ruser" * No firewall (otherwise an error "read: connection reset by peer" can occur). * SSH public key of user "luser" is present in ~ruser/.ssh/authorized_keys on "rmach" * User "luser" is a member of the "fuse" group, to allow reading of /etc/fuse.conf * Option user_allow_other is enabled in /etc/fuse.conf (B) Preparing a "virtual device" (operations to be performed once) The following must be performed as the ordinary user on the local machine. 1. Mount the remote home on the local machine: $ mkdir -p mnt/remote $ sshfs ruser@rmach: mnt/remote 2. Create a 100 GB (sparse) file that will contain the filesystem: $ cd mnt/remote $ truncate -s 100G virtual_disk.img 3. Release the mount point: $ cd $ fusermount -u mnt/remote 4. Define a mount point whose contents will be stored encrypted, e.g. $ mkdir enc_remote The following must be performed as "root" on the local machine. 5. Create an entry in "/etc/cryptmount/cmtab" luser_data { dev=/home/luser/mnt/remote/virtual_disk.img dir=/home/luser/enc_remote loop=auto fstype=ext4 mountoptions=defaults cipher=aes-cbc-plain keyformat=luks } 6. Mount the remote filesystem: # cd ~luser # sshfs -o IdentityFile=~luser/.ssh/id_rsa ruser@rmach: mnt/remote 7. Prepare the encrypted device (setting the password to access the encrypted filesystem data): # cryptmount --prepare luser_data 8. Create the filesystem (must be same as defined in the "cmtab" entry) # mkfs.ext4 /dev/mapper/luser_data # chown luser.luser 9. Finalize: # cryptmount --release luser_data 10. Mount encrypted filesystem in order to set appropriate ownership: # cryptmount luser_data # chown luser.luser /home/luser/enc_remote 11. Release all resources: # cryptmount -u luser_data # fusermount -u mnt/remote (C) Saving data to the remote encrypted filesystem 1. Mounting the remote home (as an ordinary user): $ sshfs -o allow_root ruser@rmach: mnt/remote 2. Mounting the encrypted filesystem (password will be requested): $ cryptmount luser_data 3. Checking the available space on the encrypted filsystem: $ df -k enc_remote cryptmount-5.2/AUTHORS0000644000175000017500000000333612612610366011605 00000000000000cryptmount was written by RW Penney (England, UK) The author gratefully recognizes the assistance of being able to refer to the source-code for the following packages: cryptsetup-1.0.6 et seq. openssl-0.9.8 (specifically apps/enc.c, by Eric Young) devicemapper-1.01.05 (by Sistina UK) utillinux-2.12q (specifically mount/lomount.c) Although cryptmount contains no code taken directly from any of these or other packages, certain similarities of structure cannot be avoided in some areas. Thanks are also due to the following people who have been very helpful in testing and improving cryptmount: Carl Banks (idea behind --safetynet option) Laszlo Boszormenyi (debian-specific packaging) Raphaël Droz (advice on use of libcryptsetup) Piotr Dziwinski (patch for --status option) Harald Dunkel (debian chroot-installation testing) Baruch Even (patches for man-pages) Levente Farkas (patches to RH spec-file) Glenn Golden (documentation cleanups & systemd testing) Rennie deGraaf (tracing pathname canonicalization issues) Daniel Grund (tracing cmstatus-corruption vulnerability) Holger Müller (RH spec-file, Makefile.in patches, LARGEFILE testing) Björn Nilsson (suggestions for /dev/disk/by-id in documentation) Dan O'Huiginn (patch for Debian examples directory) Sebastian Rasmussen (patches for readonly loopback devices) Petter Reinholdtsen (patches for /etc/init.d dependencies) Gilles Sadowski (guide to using sshfs with cryptmount) Erich Schubert (patches to initscript) Kai Wasserbäch (German localization) Eriks Zelenka (improved portability of RPM spec-file) cryptmount-5.2/COPYING0000644000175000017500000004310311236731445011567 00000000000000 GNU GENERAL PUBLIC LICENSE Version 2, June 1991 Copyright (C) 1989, 1991 Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. Preamble The licenses for most software are designed to take away your freedom to share and change it. By contrast, the GNU General Public License is intended to guarantee your freedom to share and change free software--to make sure the software is free for all its users. This General Public License applies to most of the Free Software Foundation's software and to any other program whose authors commit to using it. (Some other Free Software Foundation software is covered by the GNU Lesser General Public License instead.) You can apply it to your programs, too. When we speak of free software, we are referring to freedom, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for this service if you wish), that you receive source code or can get it if you want it, that you can change the software or use pieces of it in new free programs; and that you know you can do these things. To protect your rights, we need to make restrictions that forbid anyone to deny you these rights or to ask you to surrender the rights. These restrictions translate to certain responsibilities for you if you distribute copies of the software, or if you modify it. For example, if you distribute copies of such a program, whether gratis or for a fee, you must give the recipients all the rights that you have. You must make sure that they, too, receive or can get the source code. And you must show them these terms so they know their rights. We protect your rights with two steps: (1) copyright the software, and (2) offer you this license which gives you legal permission to copy, distribute and/or modify the software. Also, for each author's protection and ours, we want to make certain that everyone understands that there is no warranty for this free software. If the software is modified by someone else and passed on, we want its recipients to know that what they have is not the original, so that any problems introduced by others will not reflect on the original authors' reputations. Finally, any free program is threatened constantly by software patents. We wish to avoid the danger that redistributors of a free program will individually obtain patent licenses, in effect making the program proprietary. To prevent this, we have made it clear that any patent must be licensed for everyone's free use or not licensed at all. The precise terms and conditions for copying, distribution and modification follow. GNU GENERAL PUBLIC LICENSE TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION 0. This License applies to any program or other work which contains a notice placed by the copyright holder saying it may be distributed under the terms of this General Public License. The "Program", below, refers to any such program or work, and a "work based on the Program" means either the Program or any derivative work under copyright law: that is to say, a work containing the Program or a portion of it, either verbatim or with modifications and/or translated into another language. (Hereinafter, translation is included without limitation in the term "modification".) Each licensee is addressed as "you". Activities other than copying, distribution and modification are not covered by this License; they are outside its scope. The act of running the Program is not restricted, and the output from the Program is covered only if its contents constitute a work based on the Program (independent of having been made by running the Program). Whether that is true depends on what the Program does. 1. You may copy and distribute verbatim copies of the Program's source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice and disclaimer of warranty; keep intact all the notices that refer to this License and to the absence of any warranty; and give any other recipients of the Program a copy of this License along with the Program. You may charge a fee for the physical act of transferring a copy, and you may at your option offer warranty protection in exchange for a fee. 2. You may modify your copy or copies of the Program or any portion of it, thus forming a work based on the Program, and copy and distribute such modifications or work under the terms of Section 1 above, provided that you also meet all of these conditions: a) You must cause the modified files to carry prominent notices stating that you changed the files and the date of any change. b) You must cause any work that you distribute or publish, that in whole or in part contains or is derived from the Program or any part thereof, to be licensed as a whole at no charge to all third parties under the terms of this License. c) If the modified program normally reads commands interactively when run, you must cause it, when started running for such interactive use in the most ordinary way, to print or display an announcement including an appropriate copyright notice and a notice that there is no warranty (or else, saying that you provide a warranty) and that users may redistribute the program under these conditions, and telling the user how to view a copy of this License. (Exception: if the Program itself is interactive but does not normally print such an announcement, your work based on the Program is not required to print an announcement.) These requirements apply to the modified work as a whole. If identifiable sections of that work are not derived from the Program, and can be reasonably considered independent and separate works in themselves, then this License, and its terms, do not apply to those sections when you distribute them as separate works. But when you distribute the same sections as part of a whole which is a work based on the Program, the distribution of the whole must be on the terms of this License, whose permissions for other licensees extend to the entire whole, and thus to each and every part regardless of who wrote it. Thus, it is not the intent of this section to claim rights or contest your rights to work written entirely by you; rather, the intent is to exercise the right to control the distribution of derivative or collective works based on the Program. In addition, mere aggregation of another work not based on the Program with the Program (or with a work based on the Program) on a volume of a storage or distribution medium does not bring the other work under the scope of this License. 3. You may copy and distribute the Program (or a work based on it, under Section 2) in object code or executable form under the terms of Sections 1 and 2 above provided that you also do one of the following: a) Accompany it with the complete corresponding machine-readable source code, which must be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or, b) Accompany it with a written offer, valid for at least three years, to give any third party, for a charge no more than your cost of physically performing source distribution, a complete machine-readable copy of the corresponding source code, to be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or, c) Accompany it with the information you received as to the offer to distribute corresponding source code. (This alternative is allowed only for noncommercial distribution and only if you received the program in object code or executable form with such an offer, in accord with Subsection b above.) The source code for a work means the preferred form of the work for making modifications to it. For an executable work, complete source code means all the source code for all modules it contains, plus any associated interface definition files, plus the scripts used to control compilation and installation of the executable. However, as a special exception, the source code distributed need not include anything that is normally distributed (in either source or binary form) with the major components (compiler, kernel, and so on) of the operating system on which the executable runs, unless that component itself accompanies the executable. If distribution of executable or object code is made by offering access to copy from a designated place, then offering equivalent access to copy the source code from the same place counts as distribution of the source code, even though third parties are not compelled to copy the source along with the object code. 4. You may not copy, modify, sublicense, or distribute the Program except as expressly provided under this License. Any attempt otherwise to copy, modify, sublicense or distribute the Program is void, and will automatically terminate your rights under this License. However, parties who have received copies, or rights, from you under this License will not have their licenses terminated so long as such parties remain in full compliance. 5. You are not required to accept this License, since you have not signed it. However, nothing else grants you permission to modify or distribute the Program or its derivative works. These actions are prohibited by law if you do not accept this License. Therefore, by modifying or distributing the Program (or any work based on the Program), you indicate your acceptance of this License to do so, and all its terms and conditions for copying, distributing or modifying the Program or works based on it. 6. Each time you redistribute the Program (or any work based on the Program), the recipient automatically receives a license from the original licensor to copy, distribute or modify the Program subject to these terms and conditions. You may not impose any further restrictions on the recipients' exercise of the rights granted herein. You are not responsible for enforcing compliance by third parties to this License. 7. If, as a consequence of a court judgment or allegation of patent infringement or for any other reason (not limited to patent issues), conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot distribute so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not distribute the Program at all. For example, if a patent license would not permit royalty-free redistribution of the Program by all those who receive copies directly or indirectly through you, then the only way you could satisfy both it and this License would be to refrain entirely from distribution of the Program. If any portion of this section is held invalid or unenforceable under any particular circumstance, the balance of the section is intended to apply and the section as a whole is intended to apply in other circumstances. It is not the purpose of this section to induce you to infringe any patents or other property right claims or to contest validity of any such claims; this section has the sole purpose of protecting the integrity of the free software distribution system, which is implemented by public license practices. Many people have made generous contributions to the wide range of software distributed through that system in reliance on consistent application of that system; it is up to the author/donor to decide if he or she is willing to distribute software through any other system and a licensee cannot impose that choice. This section is intended to make thoroughly clear what is believed to be a consequence of the rest of this License. 8. If the distribution and/or use of the Program is restricted in certain countries either by patents or by copyrighted interfaces, the original copyright holder who places the Program under this License may add an explicit geographical distribution limitation excluding those countries, so that distribution is permitted only in or among countries not thus excluded. In such case, this License incorporates the limitation as if written in the body of this License. 9. The Free Software Foundation may publish revised and/or new versions of the General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. Each version is given a distinguishing version number. If the Program specifies a version number of this License which applies to it and "any later version", you have the option of following the terms and conditions either of that version or of any later version published by the Free Software Foundation. If the Program does not specify a version number of this License, you may choose any version ever published by the Free Software Foundation. 10. If you wish to incorporate parts of the Program into other free programs whose distribution conditions are different, write to the author to ask for permission. For software which is copyrighted by the Free Software Foundation, write to the Free Software Foundation; we sometimes make exceptions for this. Our decision will be guided by the two goals of preserving the free status of all derivatives of our free software and of promoting the sharing and reuse of software generally. NO WARRANTY 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. END OF TERMS AND CONDITIONS How to Apply These Terms to Your New Programs If you develop a new program, and you want it to be of the greatest possible use to the public, the best way to achieve this is to make it free software which everyone can redistribute and change under these terms. To do so, attach the following notices to the program. It is safest to attach them to the start of each source file to most effectively convey the exclusion of warranty; and each file should have at least the "copyright" line and a pointer to where the full notice is found. Copyright (C) This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Also add information on how to contact you by electronic and paper mail. If the program is interactive, make it output a short notice like this when it starts in an interactive mode: Gnomovision version 69, Copyright (C) year name of author Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. This is free software, and you are welcome to redistribute it under certain conditions; type `show c' for details. The hypothetical commands `show w' and `show c' should show the appropriate parts of the General Public License. Of course, the commands you use may be called something other than `show w' and `show c'; they could even be mouse-clicks or menu items--whatever suits your program. You should also get your employer (if you work as a programmer) or your school, if any, to sign a "copyright disclaimer" for the program, if necessary. Here is a sample; alter the names: Yoyodyne, Inc., hereby disclaims all copyright interest in the program `Gnomovision' (which makes passes at compilers) written by James Hacker. , 1 April 1989 Ty Coon, President of Vice This General Public License does not permit incorporating your program into proprietary programs. If your program is a subroutine library, you may consider it more useful to permit linking proprietary applications with the library. If this is what you want to do, use the GNU Lesser General Public License instead of this License. cryptmount-5.2/fsutils.h0000644000175000017500000000265312521465225012401 00000000000000/* * Declarations for filesytem-related utilities for cryptmount * (C)Copyright 2005-2015, RW Penney */ /* This file is part of cryptmount cryptmount is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. cryptmount is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. */ #ifndef _FSUTILS_H #define _FSUTILS_H /*! \addtogroup fsys_utils * @{ */ struct tgtdefn; int fs_check(const char *dev, const struct tgtdefn *tgt); int fs_mount(const char *dev, const struct tgtdefn *tgt); int fs_unmount(const struct tgtdefn *tgt); int fs_swapon(const char *dev, const struct tgtdefn *tgt); int fs_swapoff(const struct tgtdefn *tgt); int is_mounted(const struct tgtdefn *tgt); int is_readonlyfs(const char *path); double fs_entropy(const char *dev, const size_t blklen); /** @} */ #endif /* _FSUTILS_H */ /* * (C)Copyright 2005-2015, RW Penney */ cryptmount-5.2/utils.h0000644000175000017500000001135012612065221012033 00000000000000/* * Declarations for miscellaneous utilities for cryptmount * (C)Copyright 2005-2015, RW Penney */ /* This file is part of cryptmount cryptmount is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. cryptmount is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. */ #ifndef _UTILS_H #define _UTILS_H #include #include typedef struct km_pw_context { FILE *fd_pw_source; /* Stream from which to read passwords */ int verify; /* Always verify passwords from terminal */ unsigned debug_level; /* Verbosity of debugging information */ #ifdef TESTING const char *argpasswd[2]; /* Password(s) passed via command-line */ #endif } km_pw_context_t; /** * Representation of a string of characters, * analogous to minimalistic std::string from C++ */ typedef struct cm_string { char *buffer; /**< Storage area for characters */ size_t bufflen; /**< Total space available within buffer */ size_t size; /**< Current length of string (less null) */ } cm_string_t; /** * Symbolic representations of directories containing * either configuration files (e.g. /etc/cryptmount/), * or run-time state files (e.g. /run). */ typedef enum { CM_SYSCONF_PFX, CM_SYSRUN_PFX } cm_path_prefix_t; cm_string_t *cm_str_init(const char *val); cm_string_t *cm_str_alloc(size_t bufflen); cm_string_t *cm_str_realloc(cm_string_t *str, size_t bufflen); cm_string_t *cm_str_append(cm_string_t *str, const cm_string_t *addend); cm_string_t *cm_str_append_char(cm_string_t *str, const char addend); cm_string_t *cm_str_append_str(cm_string_t *str, const char *addend); char *cm_str_strip(cm_string_t *str); void cm_str_free(cm_string_t *str); int cm_path(char **buff, cm_path_prefix_t prefix, const char *file); char *cm_strdup(const char *orig); int cm_strcasecmp(const char *s1, const char *s2); int cm_startswith(const char **str, const char *prefix); void *sec_realloc(void *ptr, size_t size); void mem_cleanse(uint8_t *addr, size_t sz); void sec_free(void *ptr); int cm_generate_key(uint8_t *key, size_t len); int km_get_passwd(const char *ident, const km_pw_context_t *pw_ctxt, char **passwd, int isnew, int verify); int cm_confirm(const char *msg); unsigned km_aug_keysz(unsigned keylen, unsigned blksz); uint8_t *km_aug_key(const uint8_t *key, unsigned keylen, unsigned blocksz, size_t *buffsz); int km_aug_verify(const uint8_t *buff, unsigned keylen, uint32_t *expected, uint32_t *actual); enum { CM_SHA1_SIZE = 20 }; typedef struct cm_sha1_ctxt { uint32_t msglen; uint32_t buffpos; uint32_t H[5]; uint32_t buff[16]; } cm_sha1_ctxt_t; cm_sha1_ctxt_t *cm_sha1_init(void); void cm_sha1_block(cm_sha1_ctxt_t *ctxt, const uint8_t *buff, size_t len); void cm_sha1_final(cm_sha1_ctxt_t *ctxt, uint8_t **mdval, size_t *mdlen); void cm_sha1_free(cm_sha1_ctxt_t *ctxt); void cm_pwd_fortify(const char *passwd, unsigned iterations, const uint8_t *salt, size_t saltlen, uint8_t **key, size_t keylen); static inline uint16_t pack_uint16(const uint8_t *buff) { return (((uint16_t)buff[1]) << 8) | ((uint16_t)buff[0]); } static inline void unpack_uint16(uint8_t *buff, const uint16_t val) { buff[0] = (val & 0x00ff); buff[1] = (val & 0xff00) >> 8; } static inline uint32_t pack_uint32(const uint8_t *buff) { return (((uint32_t)buff[3]) << 24) | (((uint32_t)buff[2]) << 16) \ | (((uint32_t)buff[1]) << 8) | ((uint32_t)buff[0]); } static inline void unpack_uint32(uint8_t *buff, const uint32_t val) { buff[0] = (val & 0x000000ff); buff[1] = (val & 0x0000ff00) >> 8; buff[2] = (val & 0x00ff0000) >> 16; buff[3] = (val & 0xff000000) >> 24; } static inline int cm_fread(void *buff, size_t nbytes, FILE *stream) { /* Read bytes from file, returning 0 on success */ return (fread(buff, nbytes, (size_t)1, stream) != 1); } static inline int cm_fwrite(const void *buff, size_t nbytes, FILE *stream) { /* Write buffer to file, returning 0 on success */ return (fwrite(buff, nbytes, (size_t)1, stream) != 1); } #endif /* _UTILS_H */ /* * (C)Copyright 2005-2015, RW Penney */