cryptmount-6.2.0/0000755000175000017500000000000014356320433010747 500000000000000cryptmount-6.2.0/cryptmount.c0000644000175000017500000014063714354510761013275 00000000000000/* * cryptmount - a utility for user-level mounting of encrypted filesystems * (C)Copyright 2005-2023, 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 "config.h" #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #ifdef HAVE_SYSLOG # include #endif #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 /** Record of getuid() output at start of process */ uid_t cm_initial_uid = ~0u; /** * 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, and configuration switches * * The lower-order bits specify one of a sequence of mutuall-exclusive * operating modes. The higher-order bits consist of a few control flags, * some of which may be set implicitly according the the 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, M_MODE_MASK = 0x00ff, F_NEEDS_TGT = 0x0100, /*!< command requires a filesystem target */ F_ALL_TARGETS = 0x0200, /*!< command will be applied to all known targets */ F_NOWARN_ALL = 0x0400, /*!< suppress warnings with '--all' targets */ F_VERIFY_PW = 0x0800 /*!< encryption password should be double-checked */ } cmmode_t; 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/nvme0n1", "/dev/nvme0n2", "/dev/nvme1n1", "/dev/nvme1n2", "/dev/sda", "/dev/sda1", "/dev/sda2", "/dev/sda3", "/dev/sdb", "/dev/sdb1", "/dev/sdb2", "/dev/sdb3", "/dev/vda", "/dev/vda1", "/dev/xvda", "/dev/xvda1", "/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? */ if (tgtdev) free((void*)tgtdev); 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 = WRN_MOUNTED; 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)cm_initial_uid; 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 = NULL; /* 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 != cm_initial_uid) { 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); if (tstat != NULL) free_tgtstatus(tstat); 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 = NULL; #if WITH_CSWAP if (is_configured(boundtgt->tgt->ident, NULL)) { fprintf(stderr, _("Target \"%s\" is already configured\n"), boundtgt->tgt->ident); eflag = WRN_MOUNTED; goto bail_out; } 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)cm_initial_uid; 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 && cm_initial_uid != 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(cm_initial_uid); 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 & M_MODE_MASK)) { 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 & M_MODE_MASK)) { 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); if (eflag == WRN_MOUNTED) syslogmsg = NULL; 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); if (eflag == WRN_MOUNTED) syslogmsg = NULL; 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; } /* Suppress benign warning messages when '--all' option is selected: */ if (eflag != 0 && eflag < ERR_threshold && (mode & F_ALL_TARGETS) && (mode & F_NOWARN_ALL)) { eflag = 0; } #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[], const char **mode_params, int *passwd_fd, int *config_fd, km_pw_context_t *pw_ctxt) { cmmode_t bare_mode = M_UNSET, mode_flags = 0; 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|F_NOWARN_ALL }, { '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|F_NOWARN_ALL }, { 'r', "release", SET_MODE | SET_FLAGS, NULL, M_RELEASE, F_NEEDS_TGT|F_NOWARN_ALL }, { '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|F_NOWARN_ALL }, { 'x', "swapoff", SET_MODE | SET_FLAGS, NULL, M_SWAPOFF, F_NEEDS_TGT|F_NOWARN_ALL }, { '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|F_NOWARN_ALL }, { '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 (bare_mode == M_UNSET) { bare_mode = selected->newmode; } else { fprintf(stderr, _("Multiple operating modes not supported\n")); exit(1); } } if ((selected->flags & SET_FLAGS)) { mode_flags |= selected->newflags; } } if (optchar == '?') { fprintf(stderr, "%s", _(USAGE_STRING)); exit(EXIT_BADOPT); } if (bare_mode == M_UNSET) bare_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 (bare_mode | mode_flags); } int main(int argc, char *argv[]) { cmmode_t mode = M_UNSET; 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 cm_initial_uid = getuid(); 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_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_MODE_MASK) == 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_MODE_MASK) == M_LIST || (mode & M_MODE_MASK) == M_STATUS) && optind >= argc) { mode |= F_ALL_TARGETS; } /* if '--all' given, assemble list of targets from entire config-file */ if ((mode & 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 & 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) { const targelt_t *elt_rm = eltlist; eltlist = eltlist->nx; free((void*)elt_rm); } free_config(&tgttable); munlockall(); clear_env_dictionary(); return eflag; } /* * (C)Copyright 2005-2023, RW Penney */ cryptmount-6.2.0/debian/0000755000175000017500000000000014356320433012171 500000000000000cryptmount-6.2.0/debian/upstream/0000755000175000017500000000000014356320433014031 500000000000000cryptmount-6.2.0/debian/upstream/signing-key.asc0000644000175000017500000000634114356317133016674 00000000000000-----BEGIN PGP PUBLIC KEY BLOCK----- mQGNBGODAZoBDADnlAj2PXQobZJlImVDcffm/OVc+/mHemAJHm7XfsgITRiD0lLb SKDFi/i7IsQizRCydC/gSHtxU48rWLEkho/V7wvj/HxyQg30+wOBMZSmYM9nrEdH 6HT8rCyTvwqjoEci1hJnU8zUeLivum6iIYpQcINocv05eo+ivMAEDJY23EaQyuIT 3WmdwyaLctuqk51P1l42+vh7LQvaSrf7wlOT2Ry+j1KQe0jKGH2+vsdbYre0Pfjy yAF/72ca9pWe8A27kZh5iRYnk/KLP6ZtTzZ69RK7hAErSscGCd7YFSAiB/TI1iTR 3tT0v2VUm4xoL0COJy0KujRRwVVeDIa/SKiuBKKB3c0PHUOsIwNrfqgYMWV21vd6 XRMBNQ0Aj/UvYV/ZOixW659+pMCoCx5Mit26KrzyqMRJNaoSjO44r0bh/TK87wq3 zrfbmeqBlSKWZVrtdKEaf7omhaDlJPIhhlUlExLk8AEY3QS0ONqpOCOOi0qbnh9T 1aqHGC3sYKLNXLUAEQEAAbQ+RHIgUlcgUGVubmV5IChjcnlwdG1vdW50IHNpZ25p bmcga2V5KSA8Y3J5cHRtb3VudEByd3Blbm5leS51az6JAc4EEwEKADgWIQR6CQBR l0UZo+0b1Mumz9VMRAUWDgUCY4MBmgIbAwULCQgHAgYVCgkICwIEFgIDAQIeAQIX gAAKCRCmz9VMRAUWDorEDACwDuuSr6OUgaEkEcHFRcwH9YPzc4HrPv72LiKjszgh eAz3z6nvBitM8WJ7bEitZVmgJjZmgr/H7UIS//o9OkDpRUs6XSyvwCzhdBiT3RTF WHLb4v/8MF/A7Nfb/tdZ0Ydn0641j492YUVbt7YmY+1u6wtv8gDi8ewWS4QYPoMj 1x5bYP2YKNBVEdzgKy+kJzPqbDieWuPlBht/bnsp7QG9GdVGMe1/M9xjUoaZDgWF a683P86BSJ8JkotpxIQtKYUISFq+Iwql6ZP48ieQOGq0G4UhREGyjFv0+ZNR/WQC CNz572lZ/BtHHpVAzjjcPjjqFPDAc3/kFJ/juNFZp0MOdBk29Q2LYf7ALlkFtcuk MXtRps8EwQZPVJYYza/VmoGr6OdlJsIJQHk59LIYXBBw3Pe+9gEx4smOwLkfWOH2 Jxc3pcz+ZcLfvQrnRiqiJI3gsaNQPHL3JdrH4hnMpSaAMqn3WAYFkPY8wWHHO8tY hc0cF0hM/kt9ufm40hfW+wmIXQQQEQIAHRYhBHi8Gplh3C2qe/iZ26bYLGW4zvXn BQJjgwewAAoJEKbYLGW4zvXnhGsAoK0HIkI9FT6fcnnUBBqTauxC0UMxAKCdbmE8 Hluo4bUz3Mf+4NKICtr33LQqUlcgUGVubmV5IDxyd3Blbm5leUB1c2Vycy5zb3Vy Y2Vmb3JnZS5uZXQ+iQHOBBMBCgA4FiEEegkAUZdFGaPtG9TLps/VTEQFFg4FAmOD CKoCGwMFCwkIBwIGFQoJCAsCBBYCAwECHgECF4AACgkQps/VTEQFFg5G3QwAosIe kHpgwxLcy6PjbW1y3GvLVW1KDOhnLuKZU+K3i2aFVvtCHGr4f475N/S9bT7tNyuZ axnBcNi6BgyykCYICZ/iRVXqH/9gYbAzv0aRnUklIveChJ+x4dPKeoj5q8qp74b8 B2e5u8SR80OXN+YPT0IZXY43i7HfLbZMVNuWf9oNH/6eNnY7OT+x00Pb92Xk39Sg oBrvgD9ErbuF6ZFAoqDSiaWiPVdw7wpymZBmPfmJkUpCCDSxf/3kTXXRlzgwRnRe IEVoQ2txGMvmfKstCePpY4aToeyPMIBnhUnoT/bVqt8T8cBqkYj65kfQnyCfHD4f BQdUy46ovm9wYdTSnYfJKt0NTSwEYDlwG8kNM6n+68LThyzbvViaZSswNFn0yeb8 ypEnPT0h44vXIixmDCxc3SVOm0lWbEK32lcWsEquCvoKpdHb1GJIqo2iiM7xHiqx lCRdnvlzBsnas1nzDrd7VuGoz4SbP5yNZsCEUC2BtbF5i0PoHCgfQzTpFHJmuQGN BGODAZoBDADP19WjqA21UAtLYYWPEKWXxbcVpHno5wV5d2KWv7FOtb8i0cdVT2U+ YPH2kebLueDdy4m1YaeG9aJlj4dvzU/gfcAA2zXn2M5bymq7YMoHGqNUIltBAYHU GTnnyMHvWKB7RsCFhDmF5TQowsEf8Fsi6gKQodDJ1yLyOjev//ryyCaIKMU/x/lV hLdf+UCC9DNIGl9JJpoxHHQDnfcq9OvL7mi0aiSSKtmEeok0k9l4T4o1+coHEyTx RjhDnchTVSPWxMsln6/epErIssCSKQG76IRMFcIq5nFprpphHlAevRgd3yOLqj6z TwahAccBlZY63se949UhWtsZTH5V9OPZECpkK94VWev46UYU0o7qPzzGWnUkhBj+ 8Li27rxqibJ6phwfKhUr3YpESfpoUnOFblOod/2UMT9rebYUAyfrfO52Of6eXZVs ZZ9WfKQ97F4kUfsgzuE0Mn39sidw9F/dt36MgsgsLUT9Mo7aBMQ+43DJ4JAOG6mz De1b+S618pkAEQEAAYkBtgQYAQoAIBYhBHoJAFGXRRmj7RvUy6bP1UxEBRYOBQJj gwGaAhsMAAoJEKbP1UxEBRYO9/4L/3mdgaNdl5GsUIDciPH1wiIl6xcLI5idbVPn 0k8Xnlf4E7/ERbyaWhzdZiXnOWSdTxar5KJHQiyCAuEanau/ybs72nXYesKlpPeV lcsnjzHJ+nWxrgWgEURz+nz6kePT9rNxm60NSrN7c7FPwm6hfcqJM376wDFjl750 XkLK2r7cG71KJuT0ePxPo8GQD6TE8KkubIlR2WhS7P+Wmp7BgaBfgQ8YX/mEJqYX tLQmlYTO+uaS4KT5cR3WN741tfn+m21E/3SIJgTS8bPWqIjySKrV3eIVwUZmMvU1 h0WBPdhsJ4Kn0LVcp0EYFm9ODU9UzfK5SihxrltLP9e0kagdBLl0cYcV9xkTj0Zn Po+in6p6dwzlstJVAJQ3JgOgr8RZZruowHZEAwCPIcf/wih8nCbJvXhufH26uYS9 7E+dCWHc5CmzkVz3iOQc8qfND0rEUj8/GSREcxCYvl+vPCMhXjd00tmc54uSllq6 w2VJqS5exof/mNjNSYVsFCl/hk5ofg== =yqIk -----END PGP PUBLIC KEY BLOCK----- cryptmount-6.2.0/debian/copyright0000644000175000017500000000235014356316574014057 00000000000000Format: https://www.debian.org/doc/packaging-manuals/copyright-format/1.0/ Upstream-Name: cryptmount Upstream-Contact: https://github.com/rwpenney/cryptmount/issues Source: https://github.com/rwpenney/cryptmount License: GPL-2+ Files: * Copyright: (C) 2005 - 2023 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-6.2.0/debian/watch0000644000175000017500000000053614356317157013157 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=4 # Location of cryptographic signature of upstream package: opts=pgpsigurlmangle=s/$/.asc/ \ https://github.com/rwpenney/cryptmount/tags \ (?:|.*/)cryptmount-[vV]?(\d\S*)@ARCHIVE_EXT@ cryptmount-6.2.0/debian/source/0000755000175000017500000000000014356320433013471 500000000000000cryptmount-6.2.0/debian/source/format0000644000175000017500000000001412000461340014602 000000000000003.0 (quilt) cryptmount-6.2.0/debian/rules0000755000175000017500000000223614320460602013166 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 $@ .PHONY: override_dh_auto_configure override dh_auto_test 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_auto_test: true # disable "make test" stage because of strong dependence on system devices override_dh_fixperms: dh_fixperms --exclude usr/bin/cryptmount cryptmount-6.2.0/debian/postrm0000644000175000017500000000031212605014535013352 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-6.2.0/debian/changelog0000644000175000017500000002515714356317247014006 00000000000000cryptmount (6.2.0-1) unstable; urgency=low * New upstream release - migrated device-setup handshaking using libudev -- RW Penney Sat, 07 Jan 2023 16:30:00 +0000 cryptmount (6.1.0-1) unstable; urgency=low * New upstream release - updated German translations (Closes: bug#1019550) - resolved missing French translations - improved inter-process deconfliction -- RW Penney Sat, 08 Oct 2022 16:45:00 +0000 cryptmount (6.0-1) unstable; urgency=low * New upstream release - changed default fileformat in cryptmount-setup to LUKS - broadened support for libgcrypt cipher modes -- RW Penney Sat, 03 Sep 2022 14:45:00 +0000 cryptmount (5.3.3-1) unstable; urgency=low * New upstream release - updated German translations (Closes: bug#978114) * Updated to Debian Standards Version 4.5.1 -- RW Penney Sat, 02 Jan 2021 08:00:00 +0000 cryptmount (5.3.2-1) unstable; urgency=low * New upstream release - various documentation cleanups - fixed (benign) memory leak * Updated to Debian Standards Version 4.4.1 -- RW Penney Sun, 17 Nov 2019 16:20:00 +0000 cryptmount (5.3.1-1) unstable; urgency=low * New upstream release: - fixed memory cleanup error on application exit * Updated to Debian Standards Version 4.3.0 -- RW Penney Sat, 05 Jan 2019 16:20:00 +0000 cryptmount (5.3-1) unstable; urgency=low * New upstream release: - better support of LUKS plain files for cryptsetup 2.x (Closes: bug#888444) -- RW Penney Sat, 17 Mar 2018 18:00:00 +0000 cryptmount (5.2.4-1) unstable; urgency=low * Updated to Debian Standards Version 4.1.3, and debhelper-10 * Added e2fsprogs as recommended package (Closes: bug#887286) * New upstream (minor) release - documentation corrections. -- RW Penney Fri, 19 Jan 2018 06:00:00 +0000 cryptmount (5.2.3-1) unstable; urgency=low * Updated to Debian Standards Version 4.1.2 * New upstream release: - better support for cryptsetup 2.x versions, - better GCC 7.2 support. -- RW Penney Sat, 16 Dec 2017 16:30:00 +0000 cryptmount (5.2.2-1) unstable; urgency=low * Improved error-handling with '--all' command-line option -- RW Penney Sun, 02 Oct 2016 06:00:00 +0000 cryptmount (5.2.1-1) unstable; urgency=low * Updated to Debian Standards Version 3.9.8 * Improved logging output of LSB init.d script (Closes: bug#823076) -- RW Penney Tue, 07 Jun 2016 19:00:00 +0000 cryptmount (5.2-1) unstable; urgency=low * 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-6.2.0/debian/cryptmount.lintian-overrides0000644000175000017500000000026314305062040017705 00000000000000# lintian-override for cryptmount # cryptmount needs to have setuid privileges to be usable by ordinary users cryptmount: elevated-privileges 4755 root/root [usr/bin/cryptmount] cryptmount-6.2.0/debian/docs0000644000175000017500000000004014320460602012750 00000000000000README.md README.sshfs RELNOTES cryptmount-6.2.0/debian/postinst0000644000175000017500000000225212605014535013716 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-6.2.0/debian/control0000644000175000017500000000277414354510761013531 00000000000000Source: cryptmount Section: admin Priority: optional Maintainer: RW Penney Homepage: https://github.com/rwpenney/cryptmount Build-Depends: automake, debhelper-compat (= 12), libcryptsetup-dev (>= 2.0), libdevmapper-dev, libgcrypt20-dev (>= 1.8), libudev-dev, pkgconf Rules-Requires-Root: binary-targets Standards-Version: 4.6.2 Package: cryptmount Architecture: linux-any Depends: ${shlibs:Depends}, ${misc:Depends} Recommends: e2fsprogs (>= 1.42.12), udev Suggests: 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; cryptmount-6.2.0/README.md0000644000175000017500000000667414350655276012175 00000000000000# Cryptmount - user-mode management of Linux encrypted filesystems 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 raw disk partitions. ## Installation To build cryptmount from source, please follow the instructions in the [INSTALL.md](https://github.com/rwpenney/cryptmount/blob/master/INSTALL.md) file in the top directory of the source package. cryptmount has been tested on a wide variety of GNU/Linux platforms including: [ArchLinux](https://aur.archlinux.org/packages/cryptmount), CentOS, [Debian](https://packages.debian.org/stable/cryptmount), Fedora, [Gentoo](https://packages.gentoo.org/packages/sys-fs/cryptmount), [Mageia](https://madb.mageia.org/package/show/source/1/application/0/release/cauldron/name/cryptmount), [Ubuntu](https://packages.ubuntu.com/jammy/cryptmount) etc. For the most recent source-bundles of cryptmount, please see [SourceForge](http://www.sourceforge.net/projects/cryptmount), or find the latest developer versions on [GitHub](https://github.com/rwpenney/cryptmount). 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/`, and will use the [LUKS](https://en.wikipedia.org/wiki/Linux_Unified_Key_Setup) encryption format by default. More elaborate situations can be handled by manual editing of the filesystem definition, typically in `/etc/cryptmount/cmtab`. For example, an entry of the form: ``` crypt { dev=/home/crypt.fs dir=/mnt/crypt fstype=ext4 mountoptions=defaults keyformat=luks } ``` describes a LUKS-encrypted filesystem to be contained in an ordinary file, and which will be mounted beneath `/mnt/crypt`. Such a filesystem could be initialized as follows: ``` test -e /home/crypt.fs || dd if=/dev/zero of=/home/crypt.fs bs=1M count=128 mkdir /mnt/crypt cryptmount --generate-key 32 crypt cryptmount --prepare crypt mke2fs -t ext4 /dev/mapper/crypt cryptmount --release crypt ``` Further details are available in the installed manual pages. Thereafter, 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 ``` If using a separate keyfile, please take great care that you do not delete that file, as this will make access to your filesystem (essentially) impossible. You are strongly advised to keep a backup copy of the key-file. ## Signing keys The current GPG signature used for cryptmount releases has fingerprint `78BC 1A99 61DC 2DAA 7BF8 99DB A6D8 2C65 B8CE F5E7`, and is due to expire in May 2023, to be replaced by fingerprint `7A09 0051 9745 19A3 ED1B D4CB A6CF D54C 4405 160E`. cryptmount-6.2.0/config.sub0000755000175000017500000010645014305064554012663 00000000000000#! /bin/sh # Configuration validation subroutine script. # Copyright 1992-2018 Free Software Foundation, Inc. timestamp='2018-02-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 3 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, 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 Exception is an additional permission under section 7 # of the GNU General Public License, version 3 ("GPLv3"). # Please send patches to . # # 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. # You can get the latest version of this script from: # https://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.sub # 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 or ALIAS Canonicalize a configuration name. Options: -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 1992-2018 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 ;; --version | -v ) echo "$version" ; exit ;; --help | --h* | -h ) echo "$usage"; exit ;; -- ) # 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 ;; * ) 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-android* | linux-dietlibc | linux-newlib* | \ linux-musl* | linux-uclibc* | uclinux-uclibc* | uclinux-gnu* | kfreebsd*-gnu* | \ knetbsd*-gnu* | netbsd*-gnu* | netbsd*-eabi* | \ kopensolaris*-gnu* | cloudabi*-eabi* | \ storm-chaos* | os2-emx* | rtmk-nova*) os=-$maybe_os basic_machine=`echo "$1" | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\1/'` ;; android-linux) os=-linux-android basic_machine=`echo "$1" | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\1/'`-unknown ;; *) 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 | -microblaze*) os= basic_machine=$1 ;; -bluegene*) os=-cnk ;; -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 ;; -sco6) os=-sco5v6 basic_machine=`echo "$1" | sed -e 's/86-.*/86-pc/'` ;; -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/'` ;; -sco5v6*) # 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*178) os=-lynxos178 ;; -lynx*5) os=-lynxos5 ;; -lynx*) os=-lynxos ;; -ptx*) basic_machine=`echo "$1" | sed -e 's/86-.*/86-sequent/'` ;; -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 \ | aarch64 | aarch64_be \ | alpha | alphaev[4-8] | alphaev56 | alphaev6[78] | alphapca5[67] \ | alpha64 | alpha64ev[4-8] | alpha64ev56 | alpha64ev6[78] | alpha64pca5[67] \ | am33_2.0 \ | arc | arceb \ | arm | arm[bl]e | arme[lb] | armv[2-8] | armv[3-8][lb] | armv7[arm] \ | avr | avr32 \ | ba \ | be32 | be64 \ | bfin \ | c4x | c8051 | clipper \ | d10v | d30v | dlx | dsp16xx \ | e2k | epiphany \ | fido | fr30 | frv | ft32 \ | h8300 | h8500 | hppa | hppa1.[01] | hppa2.0 | hppa2.0[nw] | hppa64 \ | hexagon \ | i370 | i860 | i960 | ia16 | ia64 \ | ip2k | iq2000 \ | k1om \ | le32 | le64 \ | lm32 \ | m32c | m32r | m32rle | m68000 | m68k | m88k \ | maxq | mb | microblaze | microblazeel | mcore | mep | metag \ | mips | mipsbe | mipseb | mipsel | mipsle \ | mips16 \ | mips64 | mips64el \ | mips64octeon | mips64octeonel \ | mips64orion | mips64orionel \ | mips64r5900 | mips64r5900el \ | mips64vr | mips64vrel \ | mips64vr4100 | mips64vr4100el \ | mips64vr4300 | mips64vr4300el \ | mips64vr5000 | mips64vr5000el \ | mips64vr5900 | mips64vr5900el \ | mipsisa32 | mipsisa32el \ | mipsisa32r2 | mipsisa32r2el \ | mipsisa32r6 | mipsisa32r6el \ | mipsisa64 | mipsisa64el \ | mipsisa64r2 | mipsisa64r2el \ | mipsisa64r6 | mipsisa64r6el \ | mipsisa64sb1 | mipsisa64sb1el \ | mipsisa64sr71k | mipsisa64sr71kel \ | mipsr5900 | mipsr5900el \ | mipstx39 | mipstx39el \ | mn10200 | mn10300 \ | moxie \ | mt \ | msp430 \ | nds32 | nds32le | nds32be \ | nios | nios2 | nios2eb | nios2el \ | ns16k | ns32k \ | open8 | or1k | or1knd | or32 \ | pdp10 | pj | pjl \ | powerpc | powerpc64 | powerpc64le | powerpcle \ | pru \ | pyramid \ | riscv32 | riscv64 \ | rl78 | rx \ | score \ | sh | sh[1234] | sh[24]a | sh[24]aeb | sh[23]e | sh[234]eb | sheb | shbe | shle | sh[1234]le | sh3ele \ | sh64 | sh64le \ | sparc | sparc64 | sparc64b | sparc64v | sparc86x | sparclet | sparclite \ | sparcv8 | sparcv9 | sparcv9b | sparcv9v \ | spu \ | tahoe | tic4x | tic54x | tic55x | tic6x | tic80 | tron \ | ubicom32 \ | v850 | v850e | v850e1 | v850e2 | v850es | v850e2v3 \ | visium \ | wasm32 \ | x86 | xc16x | xstormy16 | xtensa \ | z8k | z80) basic_machine=$basic_machine-unknown ;; c54x) basic_machine=tic54x-unknown ;; c55x) basic_machine=tic55x-unknown ;; c6x) basic_machine=tic6x-unknown ;; leon|leon[3-9]) basic_machine=sparc-$basic_machine ;; m6811 | m68hc11 | m6812 | m68hc12 | m68hcs12x | nvptx | picochip) basic_machine=$basic_machine-unknown os=-none ;; m88110 | m680[12346]0 | m683?2 | m68360 | m5200 | v70 | w65) ;; ms1) basic_machine=mt-unknown ;; strongarm | thumb | xscale) basic_machine=arm-unknown ;; xgate) basic_machine=$basic_machine-unknown os=-none ;; xscaleeb) basic_machine=armeb-unknown ;; xscaleel) basic_machine=armel-unknown ;; # 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-* \ | aarch64-* | aarch64_be-* \ | alpha-* | alphaev[4-8]-* | alphaev56-* | alphaev6[78]-* \ | alpha64-* | alpha64ev[4-8]-* | alpha64ev56-* | alpha64ev6[78]-* \ | alphapca5[67]-* | alpha64pca5[67]-* | arc-* | arceb-* \ | arm-* | armbe-* | armle-* | armeb-* | armv*-* \ | avr-* | avr32-* \ | ba-* \ | be32-* | be64-* \ | bfin-* | bs2000-* \ | c[123]* | c30-* | [cjt]90-* | c4x-* \ | c8051-* | clipper-* | craynv-* | cydra-* \ | d10v-* | d30v-* | dlx-* \ | e2k-* | elxsi-* \ | f30[01]-* | f700-* | fido-* | fr30-* | frv-* | fx80-* \ | h8300-* | h8500-* \ | hppa-* | hppa1.[01]-* | hppa2.0-* | hppa2.0[nw]-* | hppa64-* \ | hexagon-* \ | i*86-* | i860-* | i960-* | ia16-* | ia64-* \ | ip2k-* | iq2000-* \ | k1om-* \ | le32-* | le64-* \ | lm32-* \ | m32c-* | m32r-* | m32rle-* \ | m68000-* | m680[012346]0-* | m68360-* | m683?2-* | m68k-* \ | m88110-* | m88k-* | maxq-* | mcore-* | metag-* \ | microblaze-* | microblazeel-* \ | mips-* | mipsbe-* | mipseb-* | mipsel-* | mipsle-* \ | mips16-* \ | mips64-* | mips64el-* \ | mips64octeon-* | mips64octeonel-* \ | mips64orion-* | mips64orionel-* \ | mips64r5900-* | mips64r5900el-* \ | mips64vr-* | mips64vrel-* \ | mips64vr4100-* | mips64vr4100el-* \ | mips64vr4300-* | mips64vr4300el-* \ | mips64vr5000-* | mips64vr5000el-* \ | mips64vr5900-* | mips64vr5900el-* \ | mipsisa32-* | mipsisa32el-* \ | mipsisa32r2-* | mipsisa32r2el-* \ | mipsisa32r6-* | mipsisa32r6el-* \ | mipsisa64-* | mipsisa64el-* \ | mipsisa64r2-* | mipsisa64r2el-* \ | mipsisa64r6-* | mipsisa64r6el-* \ | mipsisa64sb1-* | mipsisa64sb1el-* \ | mipsisa64sr71k-* | mipsisa64sr71kel-* \ | mipsr5900-* | mipsr5900el-* \ | mipstx39-* | mipstx39el-* \ | mmix-* \ | mt-* \ | msp430-* \ | nds32-* | nds32le-* | nds32be-* \ | nios-* | nios2-* | nios2eb-* | nios2el-* \ | none-* | np1-* | ns16k-* | ns32k-* \ | open8-* \ | or1k*-* \ | orion-* \ | pdp10-* | pdp11-* | pj-* | pjl-* | pn-* | power-* \ | powerpc-* | powerpc64-* | powerpc64le-* | powerpcle-* \ | pru-* \ | pyramid-* \ | riscv32-* | riscv64-* \ | rl78-* | romp-* | rs6000-* | rx-* \ | sh-* | sh[1234]-* | sh[24]a-* | sh[24]aeb-* | sh[23]e-* | sh[34]eb-* | sheb-* | shbe-* \ | shle-* | sh[1234]le-* | sh3ele-* | sh64-* | sh64le-* \ | sparc-* | sparc64-* | sparc64b-* | sparc64v-* | sparc86x-* | sparclet-* \ | sparclite-* \ | sparcv8-* | sparcv9-* | sparcv9b-* | sparcv9v-* | sv1-* | sx*-* \ | tahoe-* \ | tic30-* | tic4x-* | tic54x-* | tic55x-* | tic6x-* | tic80-* \ | tile*-* \ | tron-* \ | ubicom32-* \ | v850-* | v850e-* | v850e1-* | v850es-* | v850e2-* | v850e2v3-* \ | vax-* \ | visium-* \ | wasm32-* \ | we32k-* \ | x86-* | x86_64-* | xc16x-* | xps100-* \ | xstormy16-* | xtensa*-* \ | ymp-* \ | z8k-* | z80-*) ;; # Recognize the basic CPU types without company name, with glob match. xtensa*) basic_machine=$basic_machine-unknown ;; # 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-pc 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 ;; aros) basic_machine=i386-pc os=-aros ;; asmjs) basic_machine=asmjs-unknown ;; aux) basic_machine=m68k-apple os=-aux ;; balance) basic_machine=ns32k-sequent os=-dynix ;; blackfin) basic_machine=bfin-unknown os=-linux ;; blackfin-*) basic_machine=bfin-`echo "$basic_machine" | sed 's/^[^-]*-//'` os=-linux ;; bluegene*) basic_machine=powerpc-ibm os=-cnk ;; c54x-*) basic_machine=tic54x-`echo "$basic_machine" | sed 's/^[^-]*-//'` ;; c55x-*) basic_machine=tic55x-`echo "$basic_machine" | sed 's/^[^-]*-//'` ;; c6x-*) basic_machine=tic6x-`echo "$basic_machine" | sed 's/^[^-]*-//'` ;; c90) basic_machine=c90-cray os=-unicos ;; cegcc) basic_machine=arm-unknown os=-cegcc ;; 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 ;; cr16 | cr16-*) basic_machine=cr16-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 ;; dicos) basic_machine=i686-pc os=-dicos ;; djgpp) basic_machine=i586-pc os=-msdosdjgpp ;; dpx20 | dpx20-*) basic_machine=rs6000-bull os=-bosx ;; dpx2*) basic_machine=m68k-bull os=-sysv3 ;; e500v[12]) basic_machine=powerpc-unknown os=$os"spe" ;; e500v[12]-*) basic_machine=powerpc-`echo "$basic_machine" | sed 's/^[^-]*-//'` os=$os"spe" ;; 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 ;; hppaosf) basic_machine=hppa1.1-hp os=-osf ;; hppro) basic_machine=hppa1.1-hp os=-proelf ;; i370-ibm* | ibm*) basic_machine=i370-ibm ;; 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 ;; 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 ;; leon-*|leon[3-9]-*) basic_machine=sparc-`echo "$basic_machine" | sed 's/-.*//'` ;; m68knommu) basic_machine=m68k-unknown os=-linux ;; m68knommu-*) basic_machine=m68k-`echo "$basic_machine" | sed 's/^[^-]*-//'` os=-linux ;; magnum | m3230) basic_machine=mips-mips os=-sysv ;; merlin) basic_machine=ns32k-utek os=-sysv ;; microblaze*) basic_machine=microblaze-xilinx ;; mingw64) basic_machine=x86_64-pc os=-mingw64 ;; mingw32) basic_machine=i686-pc os=-mingw32 ;; mingw32ce) basic_machine=arm-unknown os=-mingw32ce ;; 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 ;; moxiebox) basic_machine=moxie-unknown os=-moxiebox ;; msdos) basic_machine=i386-pc os=-msdos ;; ms1-*) basic_machine=`echo "$basic_machine" | sed -e 's/ms1-/mt-/'` ;; msys) basic_machine=i686-pc os=-msys ;; mvs) basic_machine=i370-ibm os=-mvs ;; nacl) basic_machine=le32-unknown os=-nacl ;; 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 ;; neo-tandem) basic_machine=neo-tandem ;; nse-tandem) basic_machine=nse-tandem ;; nsr-tandem) basic_machine=nsr-tandem ;; nsv-tandem) basic_machine=nsv-tandem ;; nsx-tandem) basic_machine=nsx-tandem ;; op50n-* | op60c-*) basic_machine=hppa1.1-oki os=-proelf ;; openrisc | openrisc-*) basic_machine=or32-unknown ;; 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 ;; parisc) basic_machine=hppa-unknown os=-linux ;; parisc-*) basic_machine=hppa-`echo "$basic_machine" | sed 's/^[^-]*-//'` os=-linux ;; pbd) basic_machine=sparc-tti ;; pbb) basic_machine=m68k-tti ;; pc532 | pc532-*) basic_machine=ns32k-pc532 ;; pc98) basic_machine=i386-pc ;; pc98-*) basic_machine=i386-`echo "$basic_machine" | sed 's/^[^-]*-//'` ;; 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 | ppcbe) basic_machine=powerpc-unknown ;; ppc-* | ppcbe-*) basic_machine=powerpc-`echo "$basic_machine" | sed 's/^[^-]*-//'` ;; ppcle | powerpclittle) 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) 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 ;; rdos | rdos64) basic_machine=x86_64-pc os=-rdos ;; rdos32) basic_machine=i386-pc os=-rdos ;; 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 ;; sde) basic_machine=mipsisa32-sde os=-elf ;; sei) basic_machine=mips-sei os=-seiux ;; sequent) basic_machine=i386-sequent ;; sh5el) basic_machine=sh5le-unknown ;; 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 ;; strongarm-* | thumb-*) basic_machine=arm-`echo "$basic_machine" | sed 's/^[^-]*-//'` ;; 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 ;; tile*) basic_machine=$basic_machine-unknown os=-linux-gnu ;; 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 ;; x64) basic_machine=x86_64-pc ;; xbox) basic_machine=i686-pc os=-mingw32 ;; xps | xps100) basic_machine=xps100-honeywell ;; xscale-* | xscalee[bl]-*) basic_machine=`echo "$basic_machine" | sed 's/^xscale/arm/'` ;; ymp) basic_machine=ymp-cray os=-unicos ;; 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 ;; pdp11) basic_machine=pdp11-dec ;; we32k) basic_machine=we32k-att ;; sh[1234] | sh[24]a | sh[24]aeb | sh[34]eb | sh[1234]le | sh[23]ele) basic_machine=sh-unknown ;; 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. -auroraux) os=-auroraux ;; -solaris1 | -solaris1.*) os=`echo $os | sed -e 's|solaris1|sunos4|'` ;; -solaris) os=-solaris2 ;; -unixware*) os=-sysv4.2uw ;; -gnu/linux*) os=`echo $os | sed -e 's|gnu/linux|linux-gnu|'` ;; # es1800 is here to avoid being matched by es* (a different OS) -es1800*) os=-ose ;; # Now 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* | -cnk* | -sunos | -sunos[34]*\ | -hpux* | -unos* | -osf* | -luna* | -dgux* | -auroraux* | -solaris* \ | -sym* | -kopensolaris* | -plan9* \ | -amigaos* | -amigados* | -msdos* | -newsos* | -unicos* | -aof* \ | -aos* | -aros* | -cloudabi* | -sortix* \ | -nindy* | -vxsim* | -vxworks* | -ebmon* | -hms* | -mvs* \ | -clix* | -riscos* | -uniplus* | -iris* | -rtu* | -xenix* \ | -hiux* | -knetbsd* | -mirbsd* | -netbsd* \ | -bitrig* | -openbsd* | -solidbsd* | -libertybsd* \ | -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* | -cegcc* | -glidix* \ | -cygwin* | -msys* | -pe* | -psos* | -moss* | -proelf* | -rtems* \ | -midipix* | -mingw32* | -mingw64* | -linux-gnu* | -linux-android* \ | -linux-newlib* | -linux-musl* | -linux-uclibc* \ | -uxpv* | -beos* | -mpeix* | -udk* | -moxiebox* \ | -interix* | -uwin* | -mks* | -rhapsody* | -darwin* \ | -openstep* | -oskit* | -conix* | -pw32* | -nonstopux* \ | -storm-chaos* | -tops10* | -tenex* | -tops20* | -its* \ | -os2* | -vos* | -palmos* | -uclinux* | -nucleus* \ | -morphos* | -superux* | -rtmk* | -windiss* \ | -powermax* | -dnix* | -nx6 | -nx7 | -sei* | -dragonfly* \ | -skyos* | -haiku* | -rdos* | -toppers* | -drops* | -es* \ | -onefs* | -tirtos* | -phoenix* | -fuchsia* | -redox* | -bme* \ | -midnightbsd*) # 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 | -xray | -os68k* | -v88r* \ | -windows* | -osx | -abug | -netware* | -os9* \ | -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 ;; -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 ;; -*mint | -mint[0-9]* | -*MiNT | -MiNT[0-9]*) os=-mint ;; -zvmoe) os=-zvmoe ;; -dicos*) os=-dicos ;; -pikeos*) # Until real need of OS specific support for # particular features comes up, bare metal # configurations are quite functional. case $basic_machine in arm*) os=-eabi ;; *) os=-elf ;; esac ;; -nacl*) ;; -ios) ;; -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 score-*) os=-elf ;; spu-*) os=-elf ;; *-acorn) os=-riscix1.2 ;; arm*-rebel) os=-linux ;; arm*-semi) os=-aout ;; c4x-* | tic4x-*) os=-coff ;; c8051-*) os=-elf ;; hexagon-*) os=-elf ;; tic54x-*) os=-coff ;; tic55x-*) os=-coff ;; tic6x-*) 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 ;; m68*-cisco) os=-aout ;; mep-*) os=-elf ;; 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 ;; pru-*) os=-elf ;; *-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 ;; *-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 ;; -cnk*|-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 # Local variables: # eval: (add-hook 'write-file-functions 'time-stamp) # time-stamp-start: "timestamp='" # time-stamp-format: "%:y-%02m-%02d" # time-stamp-end: "'" # End: cryptmount-6.2.0/armour.h0000644000175000017500000001027614354510761012356 00000000000000/* * Declarations for encryption/security mechanisms for cryptmount * (C)Copyright 2005-2023, 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-2023, RW Penney */ cryptmount-6.2.0/RELNOTES0000644000175000017500000005222514356316574012066 00000000000000 Release notes for cryptmount-6.2 RW Penney, January 2023 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 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-6.2 ========================================= This (stable) release offers the following improvements: * More robust handshaking on device setup using libudev It has been tested on the following systems: * Arch Linux (early-Jan-2023) (x86_64) * Debian GNU/Linux 12.x ("bookworm"/"testing", early-Jan-2023) (amd64) * Debian GNU/Linux 11.6 ("bullseye") (amd64) * Debian GNU/Linux 10.13 ("buster") (x86) * Fedora 37 (x86_64) * openSUSE Leap 15.4 (x86_64) * Ubuntu 22.10 ("kinetic") (x86_64) Summary of new features in cryptmount-6.1 ========================================= This (stable) release offers the following improvements: * Improved deconfliction when operating simultaneously with other device-mapper tools * Revised installation instructions, now in markdown format It has been tested on the following systems: * Alma Linux 9.0 (x86_64, lacking libcryptsetup headers) * Arch Linux (mid-Dec-2022) (x86_64) * Debian GNU/Linux 12.x ("bookworm"/"testing", early-Oct-2022) (amd64) * Debian GNU/Linux 11.6 ("bullseye") (amd64) * Debian GNU/Linux 10.13 ("buster") (x86) * Fedora 37 (x86_64) * Ubuntu 22.10 ("kinetic") (x86_64) Summary of new features in cryptmount-6.0 ========================================= This (stable) release offers the following enhancements: * cryptmount-setup script uses LUKS format by default * Support for wider range of libgcrypt & OpenSSL cipher algorithms It has been tested on the following systems: * Arch Linux (mid-Aug-2022) (x86_64) * Debian GNU/Linux 12.x ("bookworm"/"testing", early-Sep-2022) (amd64) * Debian GNU/Linux 11.4 ("bullseye") (amd64) * Debian GNU/Linux 10.12 ("buster") (x86) * Fedora 36 (x86_64) * Ubuntu 22.04 ("jammy") (x86_64) Summary of new features in cryptmount-5.3 ========================================= This (stable) release offers the following enhancements: * Improved compatability with libcryptsetup-2.x It has been tested on the following systems: * Arch Linux (late-Dec-2020) (x86_64) * CentOS 8.3.2011 (x86_64) * Debian GNU/Linux 11.x ("bullseye"/"testing", late-Dec-2020) (amd64) * Debian GNU/Linux 10.7 ("buster") (amd64, x86) * Debian GNU/Linux 9.13 ("stretch") (x86) * Fedora 33 (x86_64) * Gentoo (late-Dec-2020) (x86) * Ubuntu 20.10 ("groovy") (x86_64) 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 (mid-Jan-2018) (x86_64) * CentOS 7.4 (x86_64) * Debian GNU/Linux 10.x ("buster"/"testing", mid-Jan-2018) (x86) * Debian GNU/Linux 9.3 ("stretch") (amd64) * Debian GNU/Linux 8.10 ("jessie") (x86) * Gentoo (mid-Dec-2017) (x86) * Ubuntu 17.10 ("artful") (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-6.2.0/dmutils.h0000644000175000017500000000275514354510761012535 00000000000000/* * Declarations for device-mapper utilities for cryptmount * (C)Copyright 2005-2023, 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 "config.h" #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-2023, RW Penney */ cryptmount-6.2.0/missing0000755000175000017500000001533614305064554012301 00000000000000#! /bin/sh # Common wrapper for a few potentially missing GNU programs. scriptversion=2018-03-07.03; # UTC # Copyright (C) 1996-2020 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=https://www.perl.org/ flex_URL=https://github.com/westes/flex gnu_software_URL=https://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 'before-save-hook 'time-stamp) # time-stamp-start: "scriptversion=" # time-stamp-format: "%:y-%02m-%02d.%02H" # time-stamp-time-zone: "UTC0" # time-stamp-end: "; # UTC" # End: cryptmount-6.2.0/mkinstalldirs0000755000175000017500000000667214307306113013503 00000000000000#! /bin/sh # mkinstalldirs --- make directory hierarchy scriptversion=2020-07-26.22; # UTC # Original author: Noah Friedman # Created: 1993-05-16 # Public domain. # # This file is maintained in Automake, please report # bugs to or send patches to # . nl=' ' IFS=" "" $nl" 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 $? ;; -m) # -m PERM arg shift test $# -eq 0 && { echo "$usage" 1>&2; exit 1; } dirmode=$1 shift ;; --version) echo "$0 $scriptversion" exit $? ;; --) # 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 "umask 22" umask 22 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 echo "umask 22" umask 22 for file do case $file in /*) pathcomp=/ ;; *) pathcomp= ;; esac oIFS=$IFS IFS=/ set fnord $file shift IFS=$oIFS for d do test "x$d" = x && continue 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 fi fi pathcomp=$pathcomp/ done if test ! -z "$dirmode"; then echo "chmod $dirmode $file" chmod "$dirmode" "$file" || errstatus=$? fi done exit $errstatus # Local Variables: # mode: shell-script # sh-indentation: 2 # eval: (add-hook 'before-save-hook 'time-stamp) # time-stamp-start: "scriptversion=" # time-stamp-format: "%:y-%02m-%02d.%02H" # time-stamp-time-zone: "UTC0" # time-stamp-end: "; # UTC" # End: cryptmount-6.2.0/README.sshfs0000644000175000017500000000507112476371336012710 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-6.2.0/COPYING0000644000175000017500000004310311236731445011726 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-6.2.0/armour-gcry.c0000644000175000017500000006711214354510761013314 00000000000000/* * Methods for encryption/security mechanisms for cryptmount * (C)Copyright 2005-2023, 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 "config.h" #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[] = { { "aeswrap", GCRY_CIPHER_MODE_AESWRAP }, { "cbc", GCRY_CIPHER_MODE_CBC }, { "cfb", GCRY_CIPHER_MODE_CFB }, { "cfb8", GCRY_CIPHER_MODE_CFB8 }, { "ccm", GCRY_CIPHER_MODE_CCM }, { "ctr", GCRY_CIPHER_MODE_CTR }, { "ecb", GCRY_CIPHER_MODE_ECB }, { "gcm", GCRY_CIPHER_MODE_GCM }, { "ocb", GCRY_CIPHER_MODE_OCB }, { "ofb", GCRY_CIPHER_MODE_OFB }, { "poly1305", GCRY_CIPHER_MODE_POLY1305 }, #if GCRYPT_VERSION_NUMBER >= 0x010800 { "xts", GCRY_CIPHER_MODE_XTS }, #endif { 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 { /* map OpenSSL name to libgcrypt name, if different */ const char *ssl_name, *gcy_name; } *mapent; struct map_t ctable[] = { { "aes-128", "aes" }, { "aes128", "aes" }, { "aes-192", "aes192" }, { "aes-256", "aes256" }, { "bf", "blowfish" }, { "camellia-128", "camellia128" }, { "camellia-192", "camellia192" }, { "camellia-256", "camellia256" }, { "cast", "cast5" }, { "des3", "3des" }, { NULL, NULL } }; struct map_t htable[] = { { "rmd160", "ripemd160" }, { NULL, NULL } }; const char *default_cipher="aes256", *default_mode="cbc", *default_hash="sha256"; *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->ssl_name!=NULL; ++mapent) { if (cm_strcasecmp(buff, mapent->ssl_name) == 0) { *algstr = cm_strdup(mapent->gcy_name); 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->ssl_name!=NULL; ++mapent) { if (cm_strcasecmp(mapent->ssl_name, keyinfo->digestalg) == 0) { *dgststr = cm_strdup(mapent->gcy_name); 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; } if (cmd->name == NULL) { fprintf(stderr, _("Couldn't find libgcrypt cipher mode \"%s\" - using fallback\n"), mdstr); } *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 }, { "Camellia-128-cfb8", "sha256", GCRY_CIPHER_CAMELLIA128, GCRY_CIPHER_MODE_CFB8, GCRY_MD_SHA256 }, #if GCRYPT_VERSION_NUMBER >= 0x010800 { "ChaCha20-xts", "blake2b_512", GCRY_CIPHER_CHACHA20, GCRY_CIPHER_MODE_XTS, GCRY_MD_BLAKE2B_512 }, #endif { "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("sha256"); } if (keyinfo->cipheralg == NULL) { #if GCRYPT_VERSION_NUMBER >= 0x010800 keyinfo->cipheralg = cm_strdup("aes256-xts"); #else keyinfo->cipheralg = cm_strdup("aes256-cbc"); #endif } } 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 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-2023, RW Penney */ cryptmount-6.2.0/sysinit/0000755000175000017500000000000014356320433012451 500000000000000cryptmount-6.2.0/sysinit/modules-load.conf0000644000175000017500000000006412400360510015611 00000000000000# Kernel modules needed by cryptmount dm-crypt loop cryptmount-6.2.0/sysinit/cryptmount.service.in0000644000175000017500000000053413241625062016604 00000000000000# systemd definition for 'cryptmount' [Unit] Description=cryptmount startup Documentation=man:cryptmount http://cryptmount.sourceforge.net/ After=local-fs.target [Service] Type=oneshot RemainAfterExit=yes ExecStart=@EXENAME@ --system-boot ExecStop=@EXENAME@ --system-shutdown ExecStopPost=@EXENAME@ --safetynet [Install] WantedBy=sysinit.target cryptmount-6.2.0/sysinit/Makefile.am0000644000175000017500000000340312612065221014417 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-6.2.0/sysinit/Makefile.in0000644000175000017500000003423114356320427014444 00000000000000# Makefile.in generated by automake 1.16.3 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2020 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 = { \ if test -z '$(MAKELEVEL)'; then \ false; \ elif test -n '$(MAKE_HOST)'; then \ true; \ elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \ true; \ else \ false; \ fi; \ } 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 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) DIST_COMMON = $(srcdir)/Makefile.am $(am__DIST_COMMON) 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__maybe_remake_depfiles = 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) am__DIST_COMMON = $(srcdir)/Makefile.in $(top_srcdir)/mkinstalldirs 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@ MSGMERGE = @MSGMERGE@ MSGMERGE_FOR_MSGFMT_OPTION = @MSGMERGE_FOR_MSGFMT_OPTION@ 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@ runstatedir = @runstatedir@ 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) --foreign --ignore-deps sysinit/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --foreign --ignore-deps sysinit/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__maybe_remake_depfiles)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles);; \ 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: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) distdir-am distdir-am: $(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 .PRECIOUS: Makefile 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-6.2.0/sysinit/initscript.in0000644000175000017500000000702112564544127015120 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-6.2.0/sysinit/setupscript.sh.in0000755000175000017500000002623014354510761015730 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 } CheckLuksSupport() { if `${CM_BINEXE} --key-managers | egrep -q '\'`; then has_luks_keymgr="yes" else has_luks_keymgr="no" echo "" eval_gettext "No LUKS support available - using built-in key manager"; echo 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() { if [ "${has_luks_keymgr}" = "yes" ]; then cmtab_keyspec="keyformat=luks" return fi 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 cmtab_keyspec="keyformat=builtin keyfile=`echo "${key_file}" | sed 's, ,\\\\ ,g'`" } 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 if [ -n "${key_file}" ]; then eval_gettext " - Creating a key-file (\"\${key_file}\")"; echo fi eval_gettext " - Creating an ext4 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=ext4 mountoptions=defaults cipher=aes ${cmtab_keyspec} } EOF eval_gettext "Generating filesystem access key..."; 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 -t ext4 "/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-2023, 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 CheckLuksSupport 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 if [ -n "${key_file}" ]; then 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 fi exit 0 # vim: set ts=4 sw=4 et: cryptmount-6.2.0/blowfish.h0000644000175000017500000000111612612065221012646 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-6.2.0/ChangeLog0000644000175000017500000005237114356316574012464 00000000000000ChangeLog for cryptmount (http://cryptmount.sourceforge.net) 07Jan23 - *** cryptmount-6.2 released 02Jan23 - Enabled libudev by default 20Dec22 - Updated various maintainer URLs to point to github.com Reduced verbosity of manual-page variable substitution Improved unit-test support for NVME devices 08Oct22 - *** cryptmount-6.1 released 01Oct22 - Improved udev settling schedule and filesystem syncs Added partial support for compiling against libgcrypt-1.7 25Sep22 - Improved waiting schedule for inter-process status locks Improved stability of tests against legacy cryptsetup 11Sep22 - Revised installation instructions and top-level README 03Sep22 - *** cryptmount-6.0 released 14Aug22 - Revised algorithm test-cases in mudslinger script to align to OpenSSL-3.0 06Aug22 - Refreshed cipher algorithm names to match OpenSSL/libgcrypt conventions Converted default libgcrypt keycipher to aes256-xts and keyhash to sha256 24Jul22 - Converted setup-script to use LUKS format by default 27Dec20 - Incorporated updated German translations from Helge Kreutzmann 06Sep20 - Refreshed cipher-mode and loop-device selection in "mudslinger" testing script 16Nov19 - Refined handling of passwords in "mudslinger" testing script 06Oct19 - Improved documentation of default values in cmtab manual page 28Sep19 - Removed use of 'minix' filesystem in testing script 06Jan19 - Fixed various memory leaks in mount/unmount pathways 05Jan19 - Fixed memory cleanup error on closedown when using multiple targets 17Mar18 - *** cryptmount-5.3 released 27Jan18 - Improved handling of LUKS plain files for libcryptsetup-2.x. Changed default location of cmtab to /etc/cryptmount/cmtab 17Jan18 - Minor updates to documentation & Debian packaging 16Dec17 - Patched to support cryptsetup-2.x Updated to automake-1.15 30Sep16 - Suppressed benign error codes when handling '--all' targets 11Aug16 - Improved detection of already configured targets 05Aug16 - Improved handling of '--all' with already mounted filesystems 02Apr16 - Updated bug-report email address 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-6.2.0/fsutils.h0000644000175000017500000000265314354510761012542 00000000000000/* * Declarations for filesytem-related utilities for cryptmount * (C)Copyright 2005-2023, 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-2023, RW Penney */ cryptmount-6.2.0/config.guess0000755000175000017500000012637314305064554013226 00000000000000#! /bin/sh # Attempt to guess a canonical system name. # Copyright 1992-2018 Free Software Foundation, Inc. timestamp='2018-02-24' # 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 3 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, 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 Exception is an additional permission under section 7 # of the GNU General Public License, version 3 ("GPLv3"). # # Originally written by Per Bothner; maintained since 2000 by Ben Elliston. # # You can get the latest version of this script from: # https://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.guess # # Please send patches to . me=`echo "$0" | sed -e 's,.*/,,'` usage="\ Usage: $0 [OPTION] Output the configuration name of the system \`$me' is run on. Options: -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 1992-2018 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 ;; --version | -v ) echo "$version" ; exit ;; --help | --h* | -h ) echo "$usage"; exit ;; -- ) # 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 "$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 ; set_cc_for_build= ;' # 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 case "$UNAME_SYSTEM" in Linux|GNU|GNU/*) # If the system lacks a compiler, then just pick glibc. # We could probably try harder. LIBC=gnu eval "$set_cc_for_build" cat <<-EOF > "$dummy.c" #include #if defined(__UCLIBC__) LIBC=uclibc #elif defined(__dietlibc__) LIBC=dietlibc #else LIBC=gnu #endif EOF eval "`$CC_FOR_BUILD -E "$dummy.c" 2>/dev/null | grep '^LIBC' | sed 's, ,,g'`" # If ldd exists, use it to detect musl libc. if command -v ldd >/dev/null && \ ldd --version 2>&1 | grep -q ^musl then LIBC=musl fi ;; esac # 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 tuples: *-*-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=`(uname -p 2>/dev/null || \ "/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 ;; sh5el) machine=sh5le-unknown ;; earmv*) arch=`echo "$UNAME_MACHINE_ARCH" | sed -e 's,^e\(armv[0-9]\).*$,\1,'` endian=`echo "$UNAME_MACHINE_ARCH" | sed -ne 's,^.*\(eb\)$,\1,p'` machine="${arch}${endian}"-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) and ABI. case "$UNAME_MACHINE_ARCH" in earm*) os=netbsdelf ;; arm*|i386|m68k|ns32k|sh3*|sparc|vax) eval "$set_cc_for_build" if echo __ELF__ | $CC_FOR_BUILD -E - 2>/dev/null \ | grep -q __ELF__ 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 # Determine ABI tags. case "$UNAME_MACHINE_ARCH" in earm*) expr='s/^earmv[0-9]/-eabi/;s/eb$//' abi=`echo "$UNAME_MACHINE_ARCH" | sed -e "$expr"` ;; 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/[-_].*//' | cut -d. -f1,2` ;; 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}${abi}" exit ;; *:Bitrig:*:*) UNAME_MACHINE_ARCH=`arch | sed 's/Bitrig.//'` echo "$UNAME_MACHINE_ARCH"-unknown-bitrig"$UNAME_RELEASE" exit ;; *:OpenBSD:*:*) UNAME_MACHINE_ARCH=`arch | sed 's/OpenBSD.//'` echo "$UNAME_MACHINE_ARCH"-unknown-openbsd"$UNAME_RELEASE" exit ;; *:LibertyBSD:*:*) UNAME_MACHINE_ARCH=`arch | sed 's/^.*BSD\.//'` echo "$UNAME_MACHINE_ARCH"-unknown-libertybsd"$UNAME_RELEASE" exit ;; *:MidnightBSD:*:*) echo "$UNAME_MACHINE"-unknown-midnightbsd"$UNAME_RELEASE" exit ;; *:ekkoBSD:*:*) echo "$UNAME_MACHINE"-unknown-ekkobsd"$UNAME_RELEASE" exit ;; *:SolidBSD:*:*) echo "$UNAME_MACHINE"-unknown-solidbsd"$UNAME_RELEASE" exit ;; macppc:MirBSD:*:*) echo powerpc-unknown-mirbsd"$UNAME_RELEASE" exit ;; *:MirBSD:*:*) echo "$UNAME_MACHINE"-unknown-mirbsd"$UNAME_RELEASE" exit ;; *:Sortix:*:*) echo "$UNAME_MACHINE"-unknown-sortix exit ;; *:Redox:*:*) echo "$UNAME_MACHINE"-unknown-redox exit ;; mips:OSF1:*.*) echo mips-dec-osf1 exit ;; 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`" # Reset EXIT trap before exiting to avoid spurious non-zero exit code. exitcode=$? trap '' 0 exit $exitcode ;; Amiga*:UNIX_System_V:4.0:*) echo m68k-unknown-sysv4 exit ;; *:[Aa]miga[Oo][Ss]:*:*) echo "$UNAME_MACHINE"-unknown-amigaos exit ;; *:[Mm]orph[Oo][Ss]:*:*) echo "$UNAME_MACHINE"-unknown-morphos exit ;; *:OS/390:*:*) echo i370-ibm-openedition exit ;; *:z/VM:*:*) echo s390-ibm-zvmoe exit ;; *:OS400:*:*) echo powerpc-ibm-os400 exit ;; arm:RISC*:1.[012]*:*|arm:riscix:1.[012]*:*) echo arm-acorn-riscix"$UNAME_RELEASE" exit ;; arm*:riscos:*:*|arm*:RISCOS:*:*) echo arm-unknown-riscos exit ;; SR2?01:HI-UX/MPP:*:* | SR8000:HI-UX/MPP:*:*) echo hppa1.1-hitachi-hiuxmpp exit ;; 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 ;; NILE*:*:*:dcosx) echo pyramid-pyramid-svr4 exit ;; DRS?6000:unix:4.0:6*) echo sparc-icl-nx6 exit ;; 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 ;; esac ;; s390x:SunOS:*:*) echo "$UNAME_MACHINE"-ibm-solaris2"`echo "$UNAME_RELEASE" | sed -e 's/[^.]*//'`" exit ;; sun4H:SunOS:5.*:*) echo sparc-hal-solaris2"`echo "$UNAME_RELEASE"|sed -e 's/[^.]*//'`" exit ;; sun4*:SunOS:5.*:* | tadpole*:SunOS:5.*:*) echo sparc-sun-solaris2"`echo "$UNAME_RELEASE" | sed -e 's/[^.]*//'`" exit ;; i86pc:AuroraUX:5.*:* | i86xen:AuroraUX:5.*:*) echo i386-pc-auroraux"$UNAME_RELEASE" exit ;; i86pc:SunOS:5.*:* | i86xen:SunOS:5.*:*) eval "$set_cc_for_build" SUN_ARCH=i386 # If there is a compiler, see if it is configured for 64-bit objects. # Note that the Sun cc does not turn __LP64__ into 1 like gcc does. # This test works for both compilers. if [ "$CC_FOR_BUILD" != no_compiler_found ]; then if (echo '#ifdef __amd64'; echo IS_64BIT_ARCH; echo '#endif') | \ (CCOPTS="" $CC_FOR_BUILD -E - 2>/dev/null) | \ grep IS_64BIT_ARCH >/dev/null then SUN_ARCH=x86_64 fi fi echo "$SUN_ARCH"-pc-solaris2"`echo "$UNAME_RELEASE"|sed -e 's/[^.]*//'`" exit ;; 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 ;; 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 ;; sun3*:SunOS:*:*) echo m68k-sun-sunos"$UNAME_RELEASE" exit ;; 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 ;; aushp:SunOS:*:*) echo sparc-auspex-sunos"$UNAME_RELEASE" exit ;; # 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 ;; atari*:*MiNT:*:* | atari*:*mint:*:* | atarist[e]:*TOS:*:*) echo m68k-atari-mint"$UNAME_RELEASE" exit ;; *falcon*:*MiNT:*:* | *falcon*:*mint:*:* | *falcon*:*TOS:*:*) echo m68k-atari-mint"$UNAME_RELEASE" exit ;; milan*:*MiNT:*:* | milan*:*mint:*:* | *milan*:*TOS:*:*) echo m68k-milan-mint"$UNAME_RELEASE" exit ;; hades*:*MiNT:*:* | hades*:*mint:*:* | *hades*:*TOS:*:*) echo m68k-hades-mint"$UNAME_RELEASE" exit ;; *:*MiNT:*:* | *:*mint:*:* | *:*TOS:*:*) echo m68k-unknown-mint"$UNAME_RELEASE" exit ;; m68k:machten:*:*) echo m68k-apple-machten"$UNAME_RELEASE" exit ;; powerpc:machten:*:*) echo powerpc-apple-machten"$UNAME_RELEASE" exit ;; RISC*:Mach:*:*) echo mips-dec-mach_bsd4.3 exit ;; RISC*:ULTRIX:*:*) echo mips-dec-ultrix"$UNAME_RELEASE" exit ;; VAX*:ULTRIX*:*:*) echo vax-dec-ultrix"$UNAME_RELEASE" exit ;; 2020:CLIX:*:* | 2430:CLIX:*:*) echo clipper-intergraph-clix"$UNAME_RELEASE" exit ;; 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" && dummyarg=`echo "$UNAME_RELEASE" | sed -n 's/\([0-9]*\).*/\1/p'` && SYSTEM_NAME=`"$dummy" "$dummyarg"` && { echo "$SYSTEM_NAME"; exit; } echo mips-mips-riscos"$UNAME_RELEASE" exit ;; Motorola:PowerMAX_OS:*:*) echo powerpc-motorola-powermax exit ;; Motorola:*:4.3:PL8-*) echo powerpc-harris-powermax exit ;; Night_Hawk:*:*:PowerMAX_OS | Synergy:PowerMAX_OS:*:*) echo powerpc-harris-powermax exit ;; Night_Hawk:Power_UNIX:*:*) echo powerpc-harris-powerunix exit ;; m88k:CX/UX:7*:*) echo m88k-harris-cxux7 exit ;; m88k:*:4*:R4*) echo m88k-motorola-sysv4 exit ;; m88k:*:3*:R3*) echo m88k-motorola-sysv3 exit ;; 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 ;; M88*:DolphinOS:*:*) # DolphinOS (SVR3) echo m88k-dolphin-sysv3 exit ;; M88*:*:R3*:*) # Delta 88k system running SVR3 echo m88k-motorola-sysv3 exit ;; XD88*:*:*:*) # Tektronix XD88 system running UTekV (SVR3) echo m88k-tektronix-sysv3 exit ;; Tek43[0-9][0-9]:UTek:*:*) # Tektronix 4300 system running UTek (BSD) echo m68k-tektronix-bsd exit ;; *:IRIX*:*:*) echo mips-sgi-irix"`echo "$UNAME_RELEASE"|sed -e 's/-/_/g'`" exit ;; ????????: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 ;; # Note that: echo "'`uname -s`'" gives 'AIX ' i*86:AIX:*:*) echo i386-ibm-aix exit ;; 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 ;; *: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 if $CC_FOR_BUILD -o "$dummy" "$dummy.c" && SYSTEM_NAME=`"$dummy"` then echo "$SYSTEM_NAME" else echo rs6000-ibm-aix3.2.5 fi 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 ;; *:AIX:*:[4567]) 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/lslpp ] ; then IBM_REV=`/usr/bin/lslpp -Lqc bos.rte.libc | awk -F: '{ print $3 }' | sed s/[0-9]*$/0/` else IBM_REV="$UNAME_VERSION.$UNAME_RELEASE" fi echo "$IBM_ARCH"-ibm-aix"$IBM_REV" exit ;; *:AIX:*:*) echo rs6000-ibm-aix exit ;; ibmrt:4.4BSD:*|romp-ibm:4.4BSD:*) echo romp-ibm-bsd4.4 exit ;; ibmrt:*BSD:*|romp-ibm:BSD:*) # covers RT/PC BSD and echo romp-ibm-bsd"$UNAME_RELEASE" # 4.3 with uname added to exit ;; # report: romp-ibm BSD 4.3 *:BOSX:*:*) echo rs6000-bull-bosx exit ;; DPX/2?00:B.O.S.:*:*) echo m68k-bull-sysv3 exit ;; 9000/[34]??:4.3bsd:1.*:*) echo m68k-hp-bsd exit ;; hp300:4.4BSD:*:* | 9000/[34]??:4.3bsd:2.*:*) echo m68k-hp-bsd4.4 exit ;; 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 eval "$set_cc_for_build" # hppa2.0w-hp-hpux* has a 64-bit kernel and a compiler generating # 32-bit code. hppa64-hp-hpux* has the same kernel and a compiler # generating 64-bit code. GNU and HP use different nomenclature: # # $ CC_FOR_BUILD=cc ./config.guess # => hppa2.0w-hp-hpux11.23 # $ CC_FOR_BUILD="cc +DA2.0w" ./config.guess # => hppa64-hp-hpux11.23 if echo __LP64__ | (CCOPTS="" $CC_FOR_BUILD -E - 2>/dev/null) | grep -q __LP64__ then HP_ARCH=hppa2.0w else HP_ARCH=hppa64 fi fi echo "$HP_ARCH"-hp-hpux"$HPUX_REV" exit ;; ia64:HP-UX:*:*) HPUX_REV=`echo "$UNAME_RELEASE"|sed -e 's/[^.]*.[0B]*//'` echo ia64-hp-hpux"$HPUX_REV" exit ;; 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" && SYSTEM_NAME=`"$dummy"` && { echo "$SYSTEM_NAME"; exit; } echo unknown-hitachi-hiuxwe2 exit ;; 9000/7??:4.3bsd:*:* | 9000/8?[79]:4.3bsd:*:*) echo hppa1.1-hp-bsd exit ;; 9000/8??:4.3bsd:*:*) echo hppa1.0-hp-bsd exit ;; *9??*:MPE/iX:*:* | *3000*:MPE/iX:*:*) echo hppa1.0-hp-mpeix exit ;; hp7??:OSF1:*:* | hp8?[79]:OSF1:*:*) echo hppa1.1-hp-osf exit ;; hp8??:OSF1:*:*) echo hppa1.0-hp-osf exit ;; i*86:OSF1:*:*) if [ -x /usr/sbin/sysversion ] ; then echo "$UNAME_MACHINE"-unknown-osf1mk else echo "$UNAME_MACHINE"-unknown-osf1 fi exit ;; parisc*:Lites*:*:*) echo hppa1.1-hp-lites exit ;; C1*:ConvexOS:*:* | convex:ConvexOS:C1*:*) echo c1-convex-bsd exit ;; C2*:ConvexOS:*:* | convex:ConvexOS:C2*:*) if getsysinfo -f scalar_acc then echo c32-convex-bsd else echo c2-convex-bsd fi exit ;; C34*:ConvexOS:*:* | convex:ConvexOS:C34*:*) echo c34-convex-bsd exit ;; C38*:ConvexOS:*:* | convex:ConvexOS:C38*:*) echo c38-convex-bsd exit ;; C4*:ConvexOS:*:* | convex:ConvexOS:C4*:*) echo c4-convex-bsd exit ;; CRAY*Y-MP:*:*:*) echo ymp-cray-unicos"$UNAME_RELEASE" | sed -e 's/\.[^.]*$/.X/' exit ;; 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 ;; CRAY*TS:*:*:*) echo t90-cray-unicos"$UNAME_RELEASE" | sed -e 's/\.[^.]*$/.X/' exit ;; CRAY*T3E:*:*:*) echo alphaev5-cray-unicosmk"$UNAME_RELEASE" | sed -e 's/\.[^.]*$/.X/' exit ;; CRAY*SV1:*:*:*) echo sv1-cray-unicos"$UNAME_RELEASE" | sed -e 's/\.[^.]*$/.X/' exit ;; *:UNICOS/mp:*:*) echo craynv-cray-unicosmp"$UNAME_RELEASE" | sed -e 's/\.[^.]*$/.X/' exit ;; 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 ;; 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 ;; i*86:BSD/386:*:* | i*86:BSD/OS:*:* | *:Ascend\ Embedded/OS:*:*) echo "$UNAME_MACHINE"-pc-bsdi"$UNAME_RELEASE" exit ;; sparc*:BSD/OS:*:*) echo sparc-unknown-bsdi"$UNAME_RELEASE" exit ;; *:BSD/OS:*:*) echo "$UNAME_MACHINE"-unknown-bsdi"$UNAME_RELEASE" exit ;; *:FreeBSD:*:*) UNAME_PROCESSOR=`/usr/bin/uname -p` case "$UNAME_PROCESSOR" in amd64) UNAME_PROCESSOR=x86_64 ;; i386) UNAME_PROCESSOR=i586 ;; esac echo "$UNAME_PROCESSOR"-unknown-freebsd"`echo "$UNAME_RELEASE"|sed -e 's/[-(].*//'`" exit ;; i*:CYGWIN*:*) echo "$UNAME_MACHINE"-pc-cygwin exit ;; *:MINGW64*:*) echo "$UNAME_MACHINE"-pc-mingw64 exit ;; *:MINGW*:*) echo "$UNAME_MACHINE"-pc-mingw32 exit ;; *:MSYS*:*) echo "$UNAME_MACHINE"-pc-msys exit ;; i*:PW*:*) echo "$UNAME_MACHINE"-pc-pw32 exit ;; *:Interix*:*) case "$UNAME_MACHINE" in x86) echo i586-pc-interix"$UNAME_RELEASE" exit ;; authenticamd | genuineintel | EM64T) echo x86_64-unknown-interix"$UNAME_RELEASE" exit ;; IA64) echo ia64-unknown-interix"$UNAME_RELEASE" exit ;; esac ;; i*:UWIN*:*) echo "$UNAME_MACHINE"-pc-uwin exit ;; amd64:CYGWIN*:*:* | x86_64:CYGWIN*:*:*) echo x86_64-unknown-cygwin exit ;; prep*:SunOS:5.*:*) echo powerpcle-unknown-solaris2"`echo "$UNAME_RELEASE"|sed -e 's/[^.]*//'`" exit ;; *:GNU:*:*) # the GNU system echo "`echo "$UNAME_MACHINE"|sed -e 's,[-/].*$,,'`-unknown-$LIBC`echo "$UNAME_RELEASE"|sed -e 's,/.*$,,'`" exit ;; *:GNU/*:*:*) # other systems with GNU libc and userland echo "$UNAME_MACHINE-unknown-`echo "$UNAME_SYSTEM" | sed 's,^[^/]*/,,' | tr "[:upper:]" "[:lower:]"``echo "$UNAME_RELEASE"|sed -e 's/[-(].*//'`-$LIBC" exit ;; i*86:Minix:*:*) echo "$UNAME_MACHINE"-pc-minix exit ;; aarch64:Linux:*:*) echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" exit ;; aarch64_be:Linux:*:*) UNAME_MACHINE=aarch64_be echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" exit ;; 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 -q ld.so.1 if test "$?" = 0 ; then LIBC=gnulibc1 ; fi echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" exit ;; arc:Linux:*:* | arceb:Linux:*:*) echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" exit ;; arm*:Linux:*:*) eval "$set_cc_for_build" if echo __ARM_EABI__ | $CC_FOR_BUILD -E - 2>/dev/null \ | grep -q __ARM_EABI__ then echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" else if echo __ARM_PCS_VFP | $CC_FOR_BUILD -E - 2>/dev/null \ | grep -q __ARM_PCS_VFP then echo "$UNAME_MACHINE"-unknown-linux-"$LIBC"eabi else echo "$UNAME_MACHINE"-unknown-linux-"$LIBC"eabihf fi fi exit ;; avr32*:Linux:*:*) echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" exit ;; cris:Linux:*:*) echo "$UNAME_MACHINE"-axis-linux-"$LIBC" exit ;; crisv32:Linux:*:*) echo "$UNAME_MACHINE"-axis-linux-"$LIBC" exit ;; e2k:Linux:*:*) echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" exit ;; frv:Linux:*:*) echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" exit ;; hexagon:Linux:*:*) echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" exit ;; i*86:Linux:*:*) echo "$UNAME_MACHINE"-pc-linux-"$LIBC" exit ;; ia64:Linux:*:*) echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" exit ;; k1om:Linux:*:*) echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" exit ;; m32r*:Linux:*:*) echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" exit ;; m68*:Linux:*:*) echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" exit ;; mips:Linux:*:* | mips64:Linux:*:*) eval "$set_cc_for_build" sed 's/^ //' << EOF > "$dummy.c" #undef CPU #undef ${UNAME_MACHINE} #undef ${UNAME_MACHINE}el #if defined(__MIPSEL__) || defined(__MIPSEL) || defined(_MIPSEL) || defined(MIPSEL) CPU=${UNAME_MACHINE}el #else #if defined(__MIPSEB__) || defined(__MIPSEB) || defined(_MIPSEB) || defined(MIPSEB) CPU=${UNAME_MACHINE} #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-$LIBC"; exit; } ;; mips64el:Linux:*:*) echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" exit ;; openrisc*:Linux:*:*) echo or1k-unknown-linux-"$LIBC" exit ;; or32:Linux:*:* | or1k*:Linux:*:*) echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" exit ;; padre:Linux:*:*) echo sparc-unknown-linux-"$LIBC" exit ;; parisc64:Linux:*:* | hppa64:Linux:*:*) echo hppa64-unknown-linux-"$LIBC" exit ;; 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-"$LIBC" ;; PA8*) echo hppa2.0-unknown-linux-"$LIBC" ;; *) echo hppa-unknown-linux-"$LIBC" ;; esac exit ;; ppc64:Linux:*:*) echo powerpc64-unknown-linux-"$LIBC" exit ;; ppc:Linux:*:*) echo powerpc-unknown-linux-"$LIBC" exit ;; ppc64le:Linux:*:*) echo powerpc64le-unknown-linux-"$LIBC" exit ;; ppcle:Linux:*:*) echo powerpcle-unknown-linux-"$LIBC" exit ;; riscv32:Linux:*:* | riscv64:Linux:*:*) echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" exit ;; s390:Linux:*:* | s390x:Linux:*:*) echo "$UNAME_MACHINE"-ibm-linux-"$LIBC" exit ;; sh64*:Linux:*:*) echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" exit ;; sh*:Linux:*:*) echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" exit ;; sparc:Linux:*:* | sparc64:Linux:*:*) echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" exit ;; tile*:Linux:*:*) echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" exit ;; vax:Linux:*:*) echo "$UNAME_MACHINE"-dec-linux-"$LIBC" exit ;; x86_64:Linux:*:*) if objdump -f /bin/sh | grep -q elf32-x86-64; then echo "$UNAME_MACHINE"-pc-linux-"$LIBC"x32 else echo "$UNAME_MACHINE"-pc-linux-"$LIBC" fi exit ;; xtensa*:Linux:*:*) echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" exit ;; 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 ;; 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 ;; 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 ;; i*86:XTS-300:*:STOP) echo "$UNAME_MACHINE"-unknown-stop exit ;; i*86:atheos:*:*) echo "$UNAME_MACHINE"-unknown-atheos exit ;; i*86:syllable:*:*) echo "$UNAME_MACHINE"-pc-syllable exit ;; i*86:LynxOS:2.*:* | i*86:LynxOS:3.[01]*:* | i*86:LynxOS:4.[02]*:*) echo i386-unknown-lynxos"$UNAME_RELEASE" exit ;; i*86:*DOS:*:*) echo "$UNAME_MACHINE"-pc-msdosdjgpp exit ;; i*86:*: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 ;; i*86:*:5:[678]*) # UnixWare 7.x, OpenUNIX and OpenServer 6. 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 ;; 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 ;; 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 i586. # Note: whatever this is, it MUST be the same as what config.sub # prints for the "djgpp" host, or else GDB configure will decide that # this is a cross-build. echo i586-pc-msdosdjgpp exit ;; Intel:Mach:3*:*) echo i386-pc-mach3 exit ;; paragon:*:*:*) echo i860-intel-osf1 exit ;; 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 ;; mini*:CTIX:SYS*5:*) # "miniframe" echo m68010-convergent-sysv exit ;; mc68k:UNIX:SYSTEM5:3.51m) echo m68k-convergent-sysv exit ;; M680?0:D-NIX:5.3:*) echo m68k-diab-dnix exit ;; M68*:*:R3V[5678]*:*) test -r /sysV68 && { echo 'm68k-motorola-sysv'; exit; } ;; 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; } /bin/uname -p 2>/dev/null | /bin/grep entium >/dev/null \ && { echo i586-ncr-sysv4.3"$OS_REL"; exit; } ;; 3[34]??:*:4.0:* | 3[34]??,*:*:4.0:*) /bin/uname -p 2>/dev/null | grep 86 >/dev/null \ && { echo i486-ncr-sysv4; exit; } ;; NCR*:*:4.2:* | MPRAS*:*:4.2:*) OS_REL='.3' 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; } /bin/uname -p 2>/dev/null | /bin/grep entium >/dev/null \ && { echo i586-ncr-sysv4.3"$OS_REL"; exit; } /bin/uname -p 2>/dev/null | /bin/grep pteron >/dev/null \ && { echo i586-ncr-sysv4.3"$OS_REL"; exit; } ;; m68*:LynxOS:2.*:* | m68*:LynxOS:3.0*:*) echo m68k-unknown-lynxos"$UNAME_RELEASE" exit ;; mc68030:UNIX_System_V:4.*:*) echo m68k-atari-sysv4 exit ;; TSUNAMI:LynxOS:2.*:*) echo sparc-unknown-lynxos"$UNAME_RELEASE" exit ;; rs6000:LynxOS:2.*:*) echo rs6000-unknown-lynxos"$UNAME_RELEASE" exit ;; PowerPC:LynxOS:2.*:* | PowerPC:LynxOS:3.[01]*:* | PowerPC:LynxOS:4.[02]*:*) echo powerpc-unknown-lynxos"$UNAME_RELEASE" exit ;; SM[BE]S:UNIX_SV:*:*) echo mips-dde-sysv"$UNAME_RELEASE" exit ;; RM*:ReliantUNIX-*:*:*) echo mips-sni-sysv4 exit ;; RM*:SINIX-*:*:*) echo mips-sni-sysv4 exit ;; *: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 ;; PENTIUM:*:4.0*:*) # Unisys `ClearPath HMP IX 4000' SVR4/MP effort # says echo i586-unisys-sysv4 exit ;; *:UNIX_System_V:4*:FTX*) # From Gerald Hewes . # How about differentiating between stratus architectures? -djm echo hppa1.1-stratus-sysv4 exit ;; *:*:*:FTX*) # From seanf@swdc.stratus.com. echo i860-stratus-sysv4 exit ;; i*86:VOS:*:*) # From Paul.Green@stratus.com. echo "$UNAME_MACHINE"-stratus-vos exit ;; *:VOS:*:*) # From Paul.Green@stratus.com. echo hppa1.1-stratus-vos exit ;; mc68*:A/UX:*:*) echo m68k-apple-aux"$UNAME_RELEASE" exit ;; news*:NEWS-OS:6*:*) echo mips-sony-newsos6 exit ;; 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 ;; BeBox:BeOS:*:*) # BeOS running on hardware made by Be, PPC only. echo powerpc-be-beos exit ;; BeMac:BeOS:*:*) # BeOS running on Mac or Mac clone, PPC only. echo powerpc-apple-beos exit ;; BePC:BeOS:*:*) # BeOS running on Intel PC compatible. echo i586-pc-beos exit ;; BePC:Haiku:*:*) # Haiku running on Intel PC compatible. echo i586-pc-haiku exit ;; x86_64:Haiku:*:*) echo x86_64-unknown-haiku exit ;; SX-4:SUPER-UX:*:*) echo sx4-nec-superux"$UNAME_RELEASE" exit ;; SX-5:SUPER-UX:*:*) echo sx5-nec-superux"$UNAME_RELEASE" exit ;; SX-6:SUPER-UX:*:*) echo sx6-nec-superux"$UNAME_RELEASE" exit ;; SX-7:SUPER-UX:*:*) echo sx7-nec-superux"$UNAME_RELEASE" exit ;; SX-8:SUPER-UX:*:*) echo sx8-nec-superux"$UNAME_RELEASE" exit ;; SX-8R:SUPER-UX:*:*) echo sx8r-nec-superux"$UNAME_RELEASE" exit ;; SX-ACE:SUPER-UX:*:*) echo sxace-nec-superux"$UNAME_RELEASE" exit ;; Power*:Rhapsody:*:*) echo powerpc-apple-rhapsody"$UNAME_RELEASE" exit ;; *:Rhapsody:*:*) echo "$UNAME_MACHINE"-apple-rhapsody"$UNAME_RELEASE" exit ;; *:Darwin:*:*) UNAME_PROCESSOR=`uname -p` || UNAME_PROCESSOR=unknown eval "$set_cc_for_build" if test "$UNAME_PROCESSOR" = unknown ; then UNAME_PROCESSOR=powerpc fi if test "`echo "$UNAME_RELEASE" | sed -e 's/\..*//'`" -le 10 ; then if [ "$CC_FOR_BUILD" != no_compiler_found ]; then if (echo '#ifdef __LP64__'; echo IS_64BIT_ARCH; echo '#endif') | \ (CCOPTS="" $CC_FOR_BUILD -E - 2>/dev/null) | \ grep IS_64BIT_ARCH >/dev/null then case $UNAME_PROCESSOR in i386) UNAME_PROCESSOR=x86_64 ;; powerpc) UNAME_PROCESSOR=powerpc64 ;; esac fi # On 10.4-10.6 one might compile for PowerPC via gcc -arch ppc if (echo '#ifdef __POWERPC__'; echo IS_PPC; echo '#endif') | \ (CCOPTS="" $CC_FOR_BUILD -E - 2>/dev/null) | \ grep IS_PPC >/dev/null then UNAME_PROCESSOR=powerpc fi fi elif test "$UNAME_PROCESSOR" = i386 ; then # Avoid executing cc on OS X 10.9, as it ships with a stub # that puts up a graphical alert prompting to install # developer tools. Any system running Mac OS X 10.7 or # later (Darwin 11 and later) is required to have a 64-bit # processor. This is not true of the ARM version of Darwin # that Apple uses in portable devices. UNAME_PROCESSOR=x86_64 fi echo "$UNAME_PROCESSOR"-apple-darwin"$UNAME_RELEASE" exit ;; *: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 ;; *:QNX:*:4*) echo i386-pc-qnx exit ;; NEO-*:NONSTOP_KERNEL:*:*) echo neo-tandem-nsk"$UNAME_RELEASE" exit ;; NSE-*:NONSTOP_KERNEL:*:*) echo nse-tandem-nsk"$UNAME_RELEASE" exit ;; NSR-*:NONSTOP_KERNEL:*:*) echo nsr-tandem-nsk"$UNAME_RELEASE" exit ;; NSV-*:NONSTOP_KERNEL:*:*) echo nsv-tandem-nsk"$UNAME_RELEASE" exit ;; NSX-*:NONSTOP_KERNEL:*:*) echo nsx-tandem-nsk"$UNAME_RELEASE" exit ;; *:NonStop-UX:*:*) echo mips-compaq-nonstopux exit ;; BS2000:POSIX*:*:*) echo bs2000-siemens-sysv exit ;; DS/*:UNIX_System_V:*:*) echo "$UNAME_MACHINE"-"$UNAME_SYSTEM"-"$UNAME_RELEASE" exit ;; *: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 ;; *:TOPS-10:*:*) echo pdp10-unknown-tops10 exit ;; *:TENEX:*:*) echo pdp10-unknown-tenex exit ;; KS10:TOPS-20:*:* | KL10:TOPS-20:*:* | TYPE4:TOPS-20:*:*) echo pdp10-dec-tops20 exit ;; XKL-1:TOPS-20:*:* | TYPE5:TOPS-20:*:*) echo pdp10-xkl-tops20 exit ;; *:TOPS-20:*:*) echo pdp10-unknown-tops20 exit ;; *:ITS:*:*) echo pdp10-unknown-its exit ;; SEI:*:*:SEIUX) echo mips-sei-seiux"$UNAME_RELEASE" exit ;; *:DragonFly:*:*) echo "$UNAME_MACHINE"-unknown-dragonfly"`echo "$UNAME_RELEASE"|sed -e 's/[-(].*//'`" exit ;; *:*VMS:*:*) UNAME_MACHINE=`(uname -p) 2>/dev/null` case "$UNAME_MACHINE" in A*) echo alpha-dec-vms ; exit ;; I*) echo ia64-dec-vms ; exit ;; V*) echo vax-dec-vms ; exit ;; esac ;; *:XENIX:*:SysV) echo i386-pc-xenix exit ;; i*86:skyos:*:*) echo "$UNAME_MACHINE"-pc-skyos"`echo "$UNAME_RELEASE" | sed -e 's/ .*$//'`" exit ;; i*86:rdos:*:*) echo "$UNAME_MACHINE"-pc-rdos exit ;; i*86:AROS:*:*) echo "$UNAME_MACHINE"-pc-aros exit ;; x86_64:VMkernel:*:*) echo "$UNAME_MACHINE"-unknown-esx exit ;; amd64:Isilon\ OneFS:*:*) echo x86_64-unknown-onefs exit ;; esac echo "$0: unable to guess system type" >&2 case "$UNAME_MACHINE:$UNAME_SYSTEM" in mips:Linux | mips64:Linux) # If we got here on MIPS GNU/Linux, output extra information. cat >&2 <&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-functions 'time-stamp) # time-stamp-start: "timestamp='" # time-stamp-format: "%:y-%02m-%02d" # time-stamp-end: "'" # End: cryptmount-6.2.0/cmtab.example0000644000175000017500000000271414320460602013330 00000000000000# Sample configuration file for cryptmount # The following target uses a raw file to act as a LUKS encrypted container. # cryptmount will automatically configure a vacant loopback device on mounting crypt_basic { dev=/home/crypt.fs dir=/home/some_username/crypt fstype=ext4 keyformat=luks } # The following target uses a raw file to contain the encrypted fs # but uses a separate key-file managed via libgcrypt crypt_detached { dev=/home/crypt.fs dir=/mnt/crypt fstype=ext3 mountoptions=defaults cipher=aes keyfile=/home/secretiveuser/crypt.key keyformat=libgcrypt } # 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_sdb63 { dev=/dev/sdb63 startsector=512 numsectors=16384 dir=/mnt/crypt63 fstype=ext3 mountoptions=defaults \ cipher=serpent # filesystem encryption # information about file used to store decryption key: keyfile=/etc/cryptmount/crypt_sdb63.key keyformat=openssl-compat 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/sdb63 startsector=16896 numsectors=1024 fstype=swap flags=mkswap cipher=twofish keyfile=/dev/random keymaxlen=16 keyformat=raw bootaction=swap } cryptmount-6.2.0/blowfish.c0000644000175000017500000005111313233105445012646 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-6.2.0/cryptmount.spec0000644000175000017500000001000114356316574013772 00000000000000# # rpm spec-file for cryptmount # Copyright 2006-2022, Holger Mueller, Eriks Zelenka & RW Penney # Summary: Let ordinary users mount an encrypted file system Name: cryptmount Version: 6.2.0 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 systemd-devel Requires: cryptsetup-libs libgcrypt device-mapper #} %else #{ %if 0%{?rhel} #{ # RHEL, CentOS %if 0%{?rhl} >= 7 BuildRequires: cryptsetup-devel libgcrypt-devel systemd-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 README* RELNOTES %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 * Sat Jan 07 2023 RW Penney - 6.2 -- Enabled libudev by default * Sat Oct 08 2022 RW Penney - 6.1 -- Refreshed installation documentation and inter-process locking * Sat Sep 03 2022 RW Penney - 6.0 -- Refreshed default ciphers and keymanager * Wed Feb 07 2018 RW Penney - 5.3 -- Improved support for cryptsetup-2.x * 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-6.2.0/looputils.h0000644000175000017500000000277614354510761013111 00000000000000/* * Declarations for loopback-device utilities for cryptmount * (C)Copyright 2005-2023, 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-2023, RW Penney */ cryptmount-6.2.0/cmtesting.h0000644000175000017500000000771214354510761013047 00000000000000/* * Declarations for unit-test utilities for cryptmoumt * (C)Copyright 2006-2023, 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 "config.h" /*! \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-2023, RW Penney */ cryptmount-6.2.0/configure.ac0000644000175000017500000002332214356316574013172 00000000000000dnl autoconf script for cryptmount dnl (C)Copyright 2005-2023, RW Penney dnl run 'aclocal; autoconf; automake -a -c -i; ./configure; make' AC_INIT(cryptmount, 6.2.0, cryptmount@rwpenney.uk) AC_PREREQ(2.59) test "$sysconfdir" = '${prefix}/etc' && sysconfdir=/etc 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([foreign no-dependencies]) AC_USE_SYSTEM_EXTENSIONS 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_HEADER_STDC AC_CHECK_HEADERS([errno.h getopt.h mntent.h \ linux/fs.h linux/loop.h sys/sysmacros.h]) AC_CHECK_FUNCS([ioctl memset mknod open strncpy syncfs 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], [use libudev for /dev events (default is YES)]), [use_libudev="${enableval}"], [use_libudev="yes"]) 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: $udevlib LUKS support: $msg_luks ]) dnl vim: set ts=4 sw=4 et: cryptmount-6.2.0/po/0000755000175000017500000000000014356320433011365 500000000000000cryptmount-6.2.0/po/LINGUAS0000644000175000017500000000006711231412134012322 00000000000000# languages available for cryptmount text output de fr cryptmount-6.2.0/po/Rules-quot0000644000175000017500000000337611216245452013320 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-6.2.0/po/cryptmount.pot0000644000175000017500000003510414316053167014263 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: 2022-10-01 12:52+0100\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:570 armour-gcry.c:726 #, 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:789 #, c-format msgid "Specification for target \"%s\" contains non-absolute pathname\n" msgstr "" #: armour-builtin.c:282 armour-gcry.c:552 armour-gcry.c:707 #, c-format msgid "Password mismatch when extracting key\n" msgstr "" #: armour-builtin.c:398 armour-gcry.c:631 armour-gcry.c:785 #, c-format msgid "Failed to create new key file\n" msgstr "" #: armour-gcry.c:177 #, c-format msgid "Couldn't find libgcrypt cipher \"%s\"\n" msgstr "" #: armour-gcry.c:186 #, c-format msgid "Couldn't find libgcrypt cipher mode \"%s\" - using fallback\n" msgstr "" #: armour-gcry.c:192 #, c-format msgid "Couldn't find libgcrypt digest \"%s\"\n" msgstr "" #: armour-gcry.c:513 #, c-format msgid "Bad keyfile format (libgcrypt)\n" msgstr "" #: armour-gcry.c:556 #, c-format msgid "Checksum mismatch in keyfile (gcry, %x != %x)\n" msgstr "" #: armour-gcry.c:672 #, c-format msgid "Bad keyfile format (openssl-compat)\n" msgstr "" #: armour-gcry.c:711 #, c-format msgid "Checksum mismatch in keyfile (openssl-compat, ofs=%u,idx=%u)\n" msgstr "" #: armour-luks.c:217 #, c-format msgid "Failed to acquire privileges for LUKS container\n" msgstr "" #: armour-luks.c:310 armour-luks.c:394 #, c-format msgid "Failed to initialize device for LUKS keyfile\n" msgstr "" #: armour-luks.c:320 #, c-format msgid "Failed to extract LUKS key for \"%s\" (errno=%d)\n" msgstr "" #: armour-luks.c:381 #, c-format msgid "Formatting \"%s\", will probably destroy all existing data" msgstr "" #: armour-luks.c:410 #, c-format msgid "Failed to create LUKS header for \"%s\"\n" msgstr "" #: armour-luks.c:420 #, c-format msgid "Failed to create LUKS key for \"%s\"\n" msgstr "" #: armour-luks.c:433 #, c-format msgid "Setting password on LUKS keyslot-%u\n" msgstr "" #: cryptmount.c:126 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:261 #, no-c-format msgid "%-16s [to mount on \"%s\" as \"%s\"]\n" msgstr "" #: cryptmount.c:393 #, c-format msgid "Failed to extract cipher key\n" msgstr "" #: cryptmount.c:402 #, c-format msgid "Cannot open device \"%s\" for target \"%s\"\n" msgstr "" #: cryptmount.c:410 #, c-format msgid "Failed to get size of \"%s\"\n" msgstr "" #: cryptmount.c:420 #, c-format msgid "Bad device-mapper start/length" msgstr "" #: cryptmount.c:447 #, c-format msgid "Device-mapper target-creation failed for \"%s\"\n" msgstr "" #: cryptmount.c:487 cryptmount.c:721 #, c-format msgid "Target \"%s\" does not appear to be configured\n" msgstr "" #: cryptmount.c:502 #, c-format msgid "Cannot stat \"%s\"\n" msgstr "" #: cryptmount.c:510 #, c-format msgid "Failed to remove device-mapper target \"%s\"\n" msgstr "" #: cryptmount.c:543 #, c-format msgid "Target \"%s\" is already mounted\n" msgstr "" #: cryptmount.c:601 #, c-format msgid "Target \"%s\" does not appear to be mounted\n" msgstr "" #: cryptmount.c:611 #, 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:617 #, c-format msgid "Only user-%lu can unmount \"%s\"\n" msgstr "" #: cryptmount.c:662 #, c-format msgid "Target \"%s\" is already configured\n" msgstr "" #: cryptmount.c:685 cryptmount.c:741 #, c-format msgid "Crypto-swap is not supported by this installation of cryptmount\n" msgstr "" #: cryptmount.c:773 #, c-format msgid "Key-file for \"%s\" isn't password-protected\n" msgstr "" #: cryptmount.c:799 cryptmount.c:920 #, c-format msgid "Cannot open \"%s\" for writing\n" msgstr "" #: cryptmount.c:814 #, c-format msgid "Retiring old key (%s -> %s) failed\n" msgstr "" #: cryptmount.c:822 #, c-format msgid "Installing new key (%s -> %s) failed\n" msgstr "" #: cryptmount.c:829 #, c-format msgid "Backup of previous key is in \"%s\"\n" msgstr "" #: cryptmount.c:869 cryptmount.c:1546 #, c-format msgid "Target name \"%s\" is not recognized\n" msgstr "" #: cryptmount.c:875 #, c-format msgid "Bad key-length parameter" msgstr "" #: cryptmount.c:887 #, c-format msgid "Key-file \"%s\" already exists for target \"%s\"\n" msgstr "" #: cryptmount.c:897 #, c-format msgid "Generating random key; please be patient...\n" msgstr "" #: cryptmount.c:901 #, c-format msgid "Failed to generate new key\n" msgstr "" #: cryptmount.c:934 #, c-format msgid "Installation of new keyfile \"%s\" failed" msgstr "" #: cryptmount.c:1070 #, c-format msgid "Only root can use option \"%s\"\n" msgstr "" #: cryptmount.c:1083 #, c-format msgid "Only root can configure \"%s\"\n" msgstr "" #: cryptmount.c:1147 #, c-format msgid "Cannot find key-manager to match target \"%s\"\n" msgstr "" #: cryptmount.c:1414 #, c-format msgid "Multiple operating modes not supported\n" msgstr "" #: cryptmount.c:1469 #, c-format msgid "Memory-locking failed...\n" msgstr "" #: cryptmount.c:1497 #, c-format msgid "Bad file-descriptor (%d)\n" msgstr "" #: cryptmount.c:1507 #, c-format msgid "Security failure\n" msgstr "" #: cryptmount.c:1526 #, c-format msgid "Trailing command-line arguments given with '--all' option\n" msgstr "" #: cryptmount.c:1558 #, c-format msgid "Target security failure for \"%s\"\n" msgstr "" #: cryptmount.c:1567 #, c-format msgid "No targets specified\n" msgstr "" #: fsutils.c:267 #, c-format msgid "Unsuitable filesystem type \"%s\" for swapping\n" msgstr "" #: fsutils.c:297 #, c-format msgid "" "Device \"%s\" appears to contain data (entropy=%.3g,%.3g) - please run " "mkswap manually\n" msgstr "" #: looputils.c:226 #, c-format msgid "Failed to free device (%d,%d)\n" msgstr "" #: looputils.c:262 #, c-format msgid "No available loopback devices\n" msgstr "" #: looputils.c:276 #, 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:315 #, c-format msgid "Unable to allocate memory\n" msgstr "" #: utils.c:425 #, c-format msgid "Too few random-number sources found\n" msgstr "" #: utils.c:484 #, c-format msgid "Cannot read stdin" msgstr "" #: utils.c:496 #, c-format msgid "Failed to turn off keyboard echoing on terminal\n" msgstr "" #: utils.c:526 #, c-format msgid "Enter new password for target \"%s\": " msgstr "" #: utils.c:527 #, c-format msgid "Enter password for target \"%s\": " msgstr "" #: utils.c:536 #, c-format msgid "Confirm password: " msgstr "" #: utils.c:539 #, c-format msgid "Password mismatch\n" msgstr "" #: utils.c:578 sysinit/setupscript.sh.in:237 #, sh-format msgid "yes" msgstr "" #: utils.c:585 #, c-format msgid "Are you sure? (Type \"%s\" to proceed): " msgstr "" #: utils.c:588 #, 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:64 #, sh-format msgid "No LUKS support available - using built-in key manager" msgstr "" #: sysinit/setupscript.sh.in:123 #, sh-format msgid "opaque" msgstr "" #: sysinit/setupscript.sh.in:124 #, 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:125 #, sh-format msgid "The following target names have already been used:" msgstr "" #: sysinit/setupscript.sh.in:132 #, sh-format msgid "Please enter a target name for your filesystem" msgstr "" #: sysinit/setupscript.sh.in:136 #, sh-format msgid "The target-name \"${TargetName}\" has already been used" msgstr "" #: sysinit/setupscript.sh.in:144 #, 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:146 #, sh-format msgid "Which user should own the filesystem (leave blank for \"root\")" msgstr "" #: sysinit/setupscript.sh.in:152 #, 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:156 #, sh-format msgid "Please specify where \"${TargetName}\" should be mounted" msgstr "" #: sysinit/setupscript.sh.in:160 #, sh-format msgid "${mount_dir} is not a valid directory name" msgstr "" #: sysinit/setupscript.sh.in:168 #, 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:172 #, sh-format msgid "Enter the filesystem size (in MB)" msgstr "" #: sysinit/setupscript.sh.in:177 #, sh-format msgid "${fs_size} is not a valid number" msgstr "" #: sysinit/setupscript.sh.in:183 #, 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:187 #, sh-format msgid "Enter a filename for your encrypted container" msgstr "" #: sysinit/setupscript.sh.in:191 #, sh-format msgid "WARNING: ${crypto_dev} already exists" msgstr "" #: sysinit/setupscript.sh.in:204 #, 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:208 #, sh-format msgid "Enter a location for the keyfile" msgstr "" #: sysinit/setupscript.sh.in:212 #, sh-format msgid "WARNING: ${key_file} already exists" msgstr "" #: sysinit/setupscript.sh.in:224 #, sh-format msgid "Your filing system is now ready to be built - this will involve:" msgstr "" #: sysinit/setupscript.sh.in:225 #, sh-format msgid " - Creating the directory \"${mount_dir}\"" msgstr "" #: sysinit/setupscript.sh.in:226 #, sh-format msgid " - Creating a ${fs_size}MB file, \"${crypto_dev}\"" msgstr "" #: sysinit/setupscript.sh.in:227 #, sh-format msgid " - Adding an extra entry (\"${TargetName}\") in ${CM_CFGDIR}/cmtab" msgstr "" #: sysinit/setupscript.sh.in:229 #, sh-format msgid " - Creating a key-file (\"${key_file}\")" msgstr "" #: sysinit/setupscript.sh.in:231 #, sh-format msgid " - Creating an ext4 filingsystem on \"${crypto_dev}\"" msgstr "" #: sysinit/setupscript.sh.in:234 #, sh-format msgid " - Overwriting the backup configuration-file \"${bckp_cmtab}\"" msgstr "" #: sysinit/setupscript.sh.in:236 #, sh-format msgid "If you do not wish to proceed, no changes will be made to your system." msgstr "" #: sysinit/setupscript.sh.in:238 #, sh-format msgid "no" msgstr "" #: sysinit/setupscript.sh.in:239 #, sh-format msgid "" "Please confirm that you want to proceed (enter \"${AffirmativeResponse}\")" msgstr "" #: sysinit/setupscript.sh.in:242 #, sh-format msgid "Installation abandoned" msgstr "" #: sysinit/setupscript.sh.in:246 #, sh-format msgid "done" msgstr "" #: sysinit/setupscript.sh.in:248 #, sh-format msgid "Making mount-point (${mount_dir})..." msgstr "" #: sysinit/setupscript.sh.in:251 #, sh-format msgid "Creating filesystem container (${crypto_dev})..." msgstr "" #: sysinit/setupscript.sh.in:256 #, sh-format msgid "Taking backup of cryptmount master config-file (${bckp_cmtab})..." msgstr "" #: sysinit/setupscript.sh.in:272 #, sh-format msgid "Generating filesystem access key..." msgstr "" #: sysinit/setupscript.sh.in:280 #, sh-format msgid "Formatting encrypted filesystem..." msgstr "" #: sysinit/setupscript.sh.in:309 #, sh-format msgid "cryptmount setup script" msgstr "" #: sysinit/setupscript.sh.in:311 #, 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:314 #, sh-format msgid "cryptmount comes with ABSOLUTELY NO WARRANTY." msgstr "" #: sysinit/setupscript.sh.in:315 #, 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:342 #, sh-format msgid "Your new encrypted filesystem is now ready for use - to access, try:" msgstr "" #: sysinit/setupscript.sh.in:345 #, sh-format msgid "After you have finished using the filesystem, try:" msgstr "" cryptmount-6.2.0/po/en@boldquot.header0000644000175000017500000000247111216245452014736 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-6.2.0/po/Makevars0000644000175000017500000000042711216245452013003 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-6.2.0/po/en@quot.header0000644000175000017500000000226311216245452014074 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-6.2.0/po/fr.po0000644000175000017500000005575214316053167012275 00000000000000# French translations for cryptmount package. # Copyright (C) 2006-2022 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: 2022-10-01 12:52+0100\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:570 armour-gcry.c:726 #, 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:789 #, c-format msgid "Specification for target \"%s\" contains non-absolute pathname\n" msgstr "" #: armour-builtin.c:282 armour-gcry.c:552 armour-gcry.c:707 #, 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:631 armour-gcry.c:785 #, c-format msgid "Failed to create new key file\n" msgstr "Génération de nouvelle clef a echouée\n" #: armour-gcry.c:177 #, c-format msgid "Couldn't find libgcrypt cipher \"%s\"\n" msgstr "Chiffre \"%s\" n'est pas reconnu dans libgcrypt\n" #: armour-gcry.c:186 #, c-format msgid "Couldn't find libgcrypt cipher mode \"%s\" - using fallback\n" msgstr "Mode de chiffrage \"%s\" n'est pas reconnu dans libgcrypt\n" #: armour-gcry.c:192 #, c-format msgid "Couldn't find libgcrypt digest \"%s\"\n" msgstr "Hash \"%s\" n'est pas reconnu dans libgcrypt\n" #: armour-gcry.c:513 #, c-format msgid "Bad keyfile format (libgcrypt)\n" msgstr "Mauvais fichier-clef (libcrypt)\n" #: armour-gcry.c:556 #, c-format msgid "Checksum mismatch in keyfile (gcry, %x != %x)\n" msgstr "Mauvais fichier-clef (gcry, %x != %x)\n" #: armour-gcry.c:672 #, c-format msgid "Bad keyfile format (openssl-compat)\n" msgstr "Mauvais fichier-clef (openssl-compat)\n" #: armour-gcry.c:711 #, 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:217 #, c-format msgid "Failed to acquire privileges for LUKS container\n" msgstr "Échec de l'acquisition des privilčges pour le fichier-clef LUKS\n" #: armour-luks.c:310 armour-luks.c:394 #, c-format msgid "Failed to initialize device for LUKS keyfile\n" msgstr "Échec de l'initialisation des appareils pour le fichier-clef LUKS\n" #: armour-luks.c:320 #, 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:381 #, 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:410 #, 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:420 #, 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:433 #, c-format msgid "Setting password on LUKS keyslot-%u\n" msgstr "" #: cryptmount.c:126 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" " -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" " 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:261 #, no-c-format msgid "%-16s [to mount on \"%s\" as \"%s\"]\n" msgstr "%-16s [pour monter sur \"%s\" comme \"%s\"]\n" #: cryptmount.c:393 #, c-format msgid "Failed to extract cipher key\n" msgstr "Extraction de la clef de déchiffrage a echouée\n" #: cryptmount.c:402 #, 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:410 #, c-format msgid "Failed to get size of \"%s\"\n" msgstr "Mesurage de la taille du \"%s\" a echoué\n" #: cryptmount.c:420 #, c-format msgid "Bad device-mapper start/length" msgstr "Mauvais debut/taille pour device-mapper" #: cryptmount.c:447 #, 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:487 cryptmount.c:721 #, 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:502 #, c-format msgid "Cannot stat \"%s\"\n" msgstr "Ne pas pouvoir stat \"%s\"\n" #: cryptmount.c:510 #, 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:543 #, c-format msgid "Target \"%s\" is already mounted\n" msgstr "La cible \"%s\" est déjŕ montée\n" #: cryptmount.c:601 #, c-format msgid "Target \"%s\" does not appear to be mounted\n" msgstr "La cible \"%s\" n'est pas montée\n" #: cryptmount.c:611 #, 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:617 #, c-format msgid "Only user-%lu can unmount \"%s\"\n" msgstr "Seulement utilisateur-%lu peut démonter \"%s\"\n" #: cryptmount.c:662 #, c-format msgid "Target \"%s\" is already configured\n" msgstr "La cible \"%s\" est déjŕ configurée\n" #: cryptmount.c:685 cryptmount.c:741 #, 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:773 #, 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:799 cryptmount.c:920 #, c-format msgid "Cannot open \"%s\" for writing\n" msgstr "Ne pas pouvoir ecrire ŕ \"%s\"\n" #: cryptmount.c:814 #, c-format msgid "Retiring old key (%s -> %s) failed\n" msgstr "Retraitment de vielle fichier-clef (%s -> %s) a echouée\n" #: cryptmount.c:822 #, c-format msgid "Installing new key (%s -> %s) failed\n" msgstr "Installation de nouvelle fichier-clef (%s -> %s) a echouée\n" #: cryptmount.c:829 #, c-format msgid "Backup of previous key is in \"%s\"\n" msgstr "Une sauvegarde de l'ancienne clef est dans \"%s\"\n" #: cryptmount.c:869 cryptmount.c:1546 #, c-format msgid "Target name \"%s\" is not recognized\n" msgstr "Nom de cible \"%s\" n'est pas reconnu\n" #: cryptmount.c:875 #, c-format msgid "Bad key-length parameter" msgstr "Mauvaise paramčtre pour la taille de la clef" #: cryptmount.c:887 #, 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:897 #, 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:901 #, c-format msgid "Failed to generate new key\n" msgstr "Génération de nouvelle clef a echouée\n" #: cryptmount.c:934 #, c-format msgid "Installation of new keyfile \"%s\" failed" msgstr "Installation de novelle fichier-clef \"%s\" a echouée" #: cryptmount.c:1070 #, c-format msgid "Only root can use option \"%s\"\n" msgstr "Seulement le super-utilisateur peut utiliser \"%s\"\n" #: cryptmount.c:1083 #, c-format msgid "Only root can configure \"%s\"\n" msgstr "Seulement le super-utilisateur peut configurer \"%s\"\n" #: cryptmount.c:1147 #, 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:1414 #, c-format msgid "Multiple operating modes not supported\n" msgstr "" #: cryptmount.c:1469 #, c-format msgid "Memory-locking failed...\n" msgstr "Verrouillage de la memoire a echoué...\n" #: cryptmount.c:1497 #, c-format msgid "Bad file-descriptor (%d)\n" msgstr "Maivais descripteur de fichier (%d)\n" #: cryptmount.c:1507 #, c-format msgid "Security failure\n" msgstr "Echec de securité\n" #: cryptmount.c:1526 #, c-format msgid "Trailing command-line arguments given with '--all' option\n" msgstr "Arguments donnés aprčs option '--all'\n" #: cryptmount.c:1558 #, c-format msgid "Target security failure for \"%s\"\n" msgstr "Echec de securité pour cible \"%s\"\n" #: cryptmount.c:1567 #, c-format msgid "No targets specified\n" msgstr "Pas de cible donnée\n" #: fsutils.c:267 #, 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:297 #, 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:226 #, c-format msgid "Failed to free device (%d,%d)\n" msgstr "Dégagement du périphérique (%d,%d) a echoué\n" #: looputils.c:262 #, c-format msgid "No available loopback devices\n" msgstr "Il n'y a aucun périph-loop disponible\n" #: looputils.c:276 #, 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:315 #, c-format msgid "Unable to allocate memory\n" msgstr "" #: utils.c:425 #, c-format msgid "Too few random-number sources found\n" msgstr "" #: utils.c:484 #, c-format msgid "Cannot read stdin" msgstr "" #: utils.c:496 #, c-format msgid "Failed to turn off keyboard echoing on terminal\n" msgstr "" #: utils.c:526 #, c-format msgid "Enter new password for target \"%s\": " msgstr "Donnez nouveau mot de passe pour la cible \"%s\": " #: utils.c:527 #, c-format msgid "Enter password for target \"%s\": " msgstr "Donnez mot de passe pour la cible \"%s\": " #: utils.c:536 #, c-format msgid "Confirm password: " msgstr "Confirmez mot de passe: " #: utils.c:539 #, c-format msgid "Password mismatch\n" msgstr "Les deux mots de passe sont differents\n" #: utils.c:578 sysinit/setupscript.sh.in:237 #, sh-format msgid "yes" msgstr "oui" #: utils.c:585 #, c-format msgid "Are you sure? (Type \"%s\" to proceed): " msgstr "Etes vous sűr? (Tappez \"%s\" pour continuer): " #: utils.c:588 #, 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:64 #, sh-format msgid "No LUKS support available - using built-in key manager" msgstr "" #: sysinit/setupscript.sh.in:123 #, sh-format msgid "opaque" msgstr "secret" #: sysinit/setupscript.sh.in:124 #, 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:125 #, 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:132 #, 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:136 #, 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:144 #, 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:146 #, 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:152 #, 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:156 #, 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:160 #, 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:168 #, 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:172 #, sh-format msgid "Enter the filesystem size (in MB)" msgstr "Donnez la taille du systčme de fichiers (en MO)" #: sysinit/setupscript.sh.in:177 #, sh-format msgid "${fs_size} is not a valid number" msgstr "${fs_size} n'est pas un numero valide" #: sysinit/setupscript.sh.in:183 #, 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:187 #, sh-format msgid "Enter a filename for your encrypted container" msgstr "Donnez un nom de fichier pour votre conteneur chiffré" #: sysinit/setupscript.sh.in:191 #, sh-format msgid "WARNING: ${crypto_dev} already exists" msgstr "ATTENTION: ${crypto_dev} existe déjŕ" #: sysinit/setupscript.sh.in:204 #, 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:208 #, sh-format msgid "Enter a location for the keyfile" msgstr "Donnez un nom de fichier pour le fichier-clef" #: sysinit/setupscript.sh.in:212 #, sh-format msgid "WARNING: ${key_file} already exists" msgstr "ATTENTION: ${key_file} existe déjŕ" #: sysinit/setupscript.sh.in:224 #, 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:225 #, sh-format msgid " - Creating the directory \"${mount_dir}\"" msgstr " - Création du répertoire \"${mount_dir}\"" #: sysinit/setupscript.sh.in:226 #, 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:227 #, 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:229 #, sh-format msgid " - Creating a key-file (\"${key_file}\")" msgstr " - Création d'un fichier-clef (\"${key_file}\")" #: sysinit/setupscript.sh.in:231 #, sh-format msgid " - Creating an ext4 filingsystem on \"${crypto_dev}\"" msgstr " - Construction d'un systčme de fichiers ext4 sur \"${crypto_dev}\"" #: sysinit/setupscript.sh.in:234 #, sh-format msgid " - Overwriting the backup configuration-file \"${bckp_cmtab}\"" msgstr " - Écrasement le fichier de sauvegarde \"${bckp_cmtab}\"" #: sysinit/setupscript.sh.in:236 #, 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:238 #, sh-format msgid "no" msgstr "non" #: sysinit/setupscript.sh.in:239 #, 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:242 #, sh-format msgid "Installation abandoned" msgstr "Installation terminée" #: sysinit/setupscript.sh.in:246 #, sh-format msgid "done" msgstr "terminé(e)" #: sysinit/setupscript.sh.in:248 #, sh-format msgid "Making mount-point (${mount_dir})..." msgstr "Réalisation du point de montage (${mount_dir})..." #: sysinit/setupscript.sh.in:251 #, sh-format msgid "Creating filesystem container (${crypto_dev})..." msgstr "Création du conteneur du systčme de fichiers (${crypto_dev})..." #: sysinit/setupscript.sh.in:256 #, sh-format msgid "Taking backup of cryptmount master config-file (${bckp_cmtab})..." msgstr "Sauvegarde du fichier de configuration (${bckp_cmtab})..." #: sysinit/setupscript.sh.in:272 #, sh-format msgid "Generating filesystem access key..." msgstr "Construction du fichier-clef..." #: sysinit/setupscript.sh.in:280 #, sh-format msgid "Formatting encrypted filesystem..." msgstr "Formatage du systčme de fichier chiffré..." #: sysinit/setupscript.sh.in:309 #, sh-format msgid "cryptmount setup script" msgstr "" #: sysinit/setupscript.sh.in:311 #, 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:314 #, sh-format msgid "cryptmount comes with ABSOLUTELY NO WARRANTY." msgstr "cryptmount n'est fourni avec aucune garantie." #: sysinit/setupscript.sh.in:315 #, 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:342 #, 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:345 #, 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 "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-6.2.0/po/Makefile.in.in0000644000175000017500000003322111231412134013745 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-6.2.0/po/de.gmo0000644000175000017500000004313514316221570012405 00000000000000Ţ•|ü§Üx @y 0ş &ë 3 (F <o Ź *Í "ř  ˇ4 2ě & "F 0i š š Ó ě $ -1_(}ڏË.Ý= Jj$}:˘$Ý0@3Ut.ĘÇů-Á ď$ 5!V0x&Š#Đô/Ca€œ-¸,ć+0?8p"Š#Ě,đFadĆ'Ý%+-K+yĽ$Âç '"'J6rŠČŢú7W&jH‘.Ú6 #@d$v=›AŮ-*I"t—#ˇ!۲ý°2>sq5ĺˆ¤fľ$:A|-—%Ĺ#ë= @M DŽ -Ó !D!.^!!’!•!œ!ś#^ş#U%No%0ž%:ď%0*&L[&&¨&4Ď&0'5'J'Ca(:Ľ(@ŕ(>!)'`)"ˆ)$Ť),Đ)1ý)E/*)u*3Ÿ*)Ó**ý*((+LQ+\ž+ ű+,.3,Sb,+ś,3â,H-l_-;Ě-ý.G/AN/=/7Î/90:@0<{0@¸03ů0B-1-p1'ž1-Ć1+ô1E 2Af26¨2>ß2N3.m34œ36Ń3Z4tc4Ř4:ń4;,52h5?›5:Ű536,J6-w6(Ľ6/Î6/ţ6T.7%ƒ7Š7#Á7$ĺ7+ 8<68"s8>–8dŐ89:9At99ś9đ94:D8:X}:,Ö:4;&8;%_;%…;$Ť;ăĐ;Ź´<0a=’’=5%>¤[>U?–V@)í@\A$tA1™A-ËA+ůAK%BNqBqŔB12CdCK‚C<ÎC DDD1(DZFi6{P09$rmu:zhc-Zd` yM .WS5tT>[\sv+#Ak_&EV8<qQo=2Hw'LpG%)bDX fl"n3CjaK] e/, YIB7? @g(*!;N4ORF^J1U|x - 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 ext4 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 cipher mode "%s" - using fallback 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 acquire privileges for LUKS container 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 initialize device for LUKS keyfile 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...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" Multiple operating modes not supported No LUKS support available - using built-in key managerNo 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 configured 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:Too few random-number sources found 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 donenoopaqueusage: cryptmount [OPTION [target ...]] available options are as follows: -h | --help -a | --all -c | --change-password -k | --key-managers -l | --list -S | --status -m | --mount -u | --unmount --generate-key --reuse-key --prepare --release --config-fd --passwd-fd --swapon --swapoff --version please report bugs to yesProject-Id-Version: cryptmount 6.0-1 Report-Msgid-Bugs-To: rwpenney@users.sourceforge.net PO-Revision-Date: 2022-09-11 20:18+0200 Last-Translator: Helge Kreutzmann 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 ext4-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-Chiffrenmodus Âť%sÂŤ nicht finden - RĂźckfalloption wird verwandt 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).Erlangen von Privilegien fĂźr LUKS-Container schlug fehl. 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. Initialisieren eines Gerätes fĂźr LUKS-SchlĂźsseldatei schlug fehl. Ö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 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. Mehrere Betriebsmodi werden nicht unterstĂźtzt Keine LUKS-UnterstĂźtzung verfĂźgbar - eingebauter SchlĂźsselverwalter wird verwandtKeine 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 konfiguriert. 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:Zu wenige Zufallszahlenquellen gefunden. Abschließende Befehlszeilen-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ässigAufruf: cryptmount [OPTION [Ziel …]] Die folgenden Optionen sind verfĂźgbar: -h | --help -a | --all -c | --change-password -k | --key-managers -l | --list -S | --status -m | --mount -u | --unmount --generate-key --reuse-key --prepare --release --config-fd --passwd-fd --swapon --swapoff --version Bitte melden Sie Fehler (auf Englisch) an . jacryptmount-6.2.0/po/insert-header.sin0000644000175000017500000000124011216245452014546 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-6.2.0/po/boldquot.sed0000644000175000017500000000033111216245452013627 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-6.2.0/po/fr.gmo0000644000175000017500000003721014316221570012421 00000000000000Ţ•rŹ<° @ą 0ň &# 3J (~ <§ ä * "0 S ˇl 2$ &W "~ 0Ą Ň ń  $ $D -i — (ľ Ţ .đ =]}$:ľ$đ0@FU‡.ÝÇ -Ô $# H!i0‹&ź#ă/&Vt“Ż-Ë,ů+&8R"‹#Ž,ŇF˙aF¨'ż%ç --+[‡$¤É ă',Ka}›şÚ&íH.]6Œ#ĂçAů-;*i"”ˇ#×!ű˛Đ2^s‘5ˆ;ÄfŐ:<-w%Ľ#Ë=ď@-Dn-łDá.&UZ]d~!~‚!M#8O#-ˆ#Aś#(ř#6!$%X$5~$)´$Ţ$ßű$EŰ%-!&0O&H€&'É&$ń&,' C'&d'7‹'Ă';á'(&7(5^(%”(ş(.Ó(8)+;)?g)K§)ró)7f*öž*5•+-Ë+0ů+(*,/S,@ƒ,.Ä,,ó,& -CG-/‹-,ť-&č-'.B7.7z.5˛.:č.*#/N/>n/?­/]í/K03a0;•0*Ń04ü0>11(p11™1'Ë1'ó1'2&C2j2.24Ž22ă2-3'D3l3OŒ3>Ü3C48_4˜49Ť4%ĺ4 5"+5N5$m5"’5ľľ5˘k6*7{97-ľ7xă78\8V•9&ě9=:$Q:"v:P™:\ę:WG;-Ÿ;OÍ;2< P<[<_<f<„>;p hRA'?e Zn-m:Tc2( ,>1SNlDk9@rjW)J3=bOgFHd+KQI[ ^/8%]"5C*&0EM 6`PX#UG.L<q!\iYVo4B7af_$ - 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 ext4 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 cipher mode "%s" - using fallback 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 acquire privileges for LUKS container 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 initialize device for LUKS keyfile 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...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 configured 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 donenoopaqueusage: cryptmount [OPTION [target ...]] available options are as follows: -h | --help -a | --all -c | --change-password -k | --key-managers -l | --list -S | --status -m | --mount -u | --unmount --generate-key --reuse-key --prepare --release --config-fd --passwd-fd --swapon --swapoff --version please report bugs to yesProject-Id-Version: cryptmount 4.0-1 Report-Msgid-Bugs-To: rwpenney@users.sourceforge.net 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 ext4 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 Mode de chiffrage "%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)Échec de l'acquisition des privilčges pour le fichier-clef LUKS 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é Échec de l'initialisation des appareils pour le fichier-clef LUKS 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...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ŕ configuré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)nonsecretusage: cryptmount [OPTION [cible ...]] les options disponible sont les suivants: -h | --help -a | --all -c | --change-password -k | --key-managers -l | --list -S | --status -m | --mount -u | --unmount --generate-key --reuse-key --prepare --release --config-fd --passwd-fd --swapon --swapoff --version veuillez notifier les bogues ŕ ouicryptmount-6.2.0/po/de.po0000644000175000017500000005764614316053167012262 00000000000000# German translation of the cryptmount language file resulting in de.po # Copyright Š 2008-2014 Kai Wasserbäch # 2020,2022 Helge Kreutzmann # This file is distributed under the same license as the cryptmount package. # msgid "" msgstr "" "Project-Id-Version: cryptmount 6.0-1\n" "Report-Msgid-Bugs-To: rwpenney@users.sourceforge.net\n" "POT-Creation-Date: 2022-10-01 12:52+0100\n" "PO-Revision-Date: 2022-09-11 20:18+0200\n" "Last-Translator: Helge Kreutzmann \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:570 armour-gcry.c:726 #, 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:789 #, 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:552 armour-gcry.c:707 #, 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:631 armour-gcry.c:785 #, c-format msgid "Failed to create new key file\n" msgstr "Erstellen einer neuen SchlĂźsseldatei schlug fehl.\n" #: armour-gcry.c:177 #, c-format msgid "Couldn't find libgcrypt cipher \"%s\"\n" msgstr "Konnte libgcrypt-Chiffre Âť%sÂŤ nicht finden.\n" #: armour-gcry.c:186 #, c-format msgid "Couldn't find libgcrypt cipher mode \"%s\" - using fallback\n" msgstr "" "Konnte libgcrypt-Chiffrenmodus Âť%sÂŤ nicht finden - RĂźckfalloption wird " "verwandt\n" #: armour-gcry.c:192 #, c-format msgid "Couldn't find libgcrypt digest \"%s\"\n" msgstr "Konnte libgcrypt-Hash Âť%sÂŤ nicht finden.\n" #: armour-gcry.c:513 #, c-format msgid "Bad keyfile format (libgcrypt)\n" msgstr "Falsches SchlĂźsseldateiformat (libgcrypt).\n" #: armour-gcry.c:556 #, 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:672 #, c-format msgid "Bad keyfile format (openssl-compat)\n" msgstr "Falsches SchlĂźsseldateiformat (openssl-compat).\n" #: armour-gcry.c:711 #, 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:217 #, c-format msgid "Failed to acquire privileges for LUKS container\n" msgstr "Erlangen von Privilegien fĂźr LUKS-Container schlug fehl.\n" #: armour-luks.c:310 armour-luks.c:394 #, c-format msgid "Failed to initialize device for LUKS keyfile\n" msgstr "Initialisieren eines Gerätes fĂźr LUKS-SchlĂźsseldatei schlug fehl.\n" #: armour-luks.c:320 #, 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:381 #, 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:410 #, 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:420 #, 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:433 #, c-format msgid "Setting password on LUKS keyslot-%u\n" msgstr "Setze Passwort fĂźr den LUKS-SchlĂźsselplatz Âť%uÂŤ\n" #: cryptmount.c:126 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" " -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" " 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:261 #, 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:393 #, c-format msgid "Failed to extract cipher key\n" msgstr "Auslesen des ChiffreschlĂźssels schlug fehl.\n" #: cryptmount.c:402 #, 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:410 #, c-format msgid "Failed to get size of \"%s\"\n" msgstr "Konnte Größe von Âť%sÂŤ nicht ermitteln.\n" #: cryptmount.c:420 #, c-format msgid "Bad device-mapper start/length" msgstr "Falsche(r) device-mapper-Beginn/Länge." #: cryptmount.c:447 #, 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:487 cryptmount.c:721 #, c-format msgid "Target \"%s\" does not appear to be configured\n" msgstr "Ziel Âť%sÂŤ scheint unkonfiguriert zu sein.\n" #: cryptmount.c:502 #, c-format msgid "Cannot stat \"%s\"\n" msgstr "Kann Status fĂźr Âť%sÂŤ nicht abfragen.\n" #: cryptmount.c:510 #, c-format msgid "Failed to remove device-mapper target \"%s\"\n" msgstr "Entfernen des device-mapper-Ziels Âť%sÂŤ schlug fehl.\n" #: cryptmount.c:543 #, c-format msgid "Target \"%s\" is already mounted\n" msgstr "Ziel Âť%sÂŤ ist bereits eingehängt.\n" #: cryptmount.c:601 #, 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:611 #, 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:617 #, 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:662 #, c-format msgid "Target \"%s\" is already configured\n" msgstr "Ziel Âť%sÂŤ ist bereits konfiguriert.\n" #: cryptmount.c:685 cryptmount.c:741 #, 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:773 #, 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:799 cryptmount.c:920 #, c-format msgid "Cannot open \"%s\" for writing\n" msgstr "Kann Âť%sÂŤ nicht zum Schreiben Ăśffnen.\n" #: cryptmount.c:814 #, c-format msgid "Retiring old key (%s -> %s) failed\n" msgstr "Ausmustern des alten SchlĂźssels (%s -> %s) schlug fehl.\n" #: cryptmount.c:822 #, c-format msgid "Installing new key (%s -> %s) failed\n" msgstr "Installation des neuen SchlĂźssels (%s -> %s) schlug fehl.\n" #: cryptmount.c:829 #, c-format msgid "Backup of previous key is in \"%s\"\n" msgstr "Eine Sicherheitskopie des vorherigen SchlĂźssels ist in Âť%sÂŤ.\n" #: cryptmount.c:869 cryptmount.c:1546 #, c-format msgid "Target name \"%s\" is not recognized\n" msgstr "Zielname Âť%sÂŤ wurde nicht erkannt.\n" #: cryptmount.c:875 #, c-format msgid "Bad key-length parameter" msgstr "Falscher SchlĂźssellängen-Parameter" #: cryptmount.c:887 #, 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:897 #, c-format msgid "Generating random key; please be patient...\n" msgstr "Erstelle zufälligen SchlĂźssel; bitte warten Sie …\n" #: cryptmount.c:901 #, c-format msgid "Failed to generate new key\n" msgstr "Generieren des neuen SchlĂźssels schlug fehl\n" #: cryptmount.c:934 #, c-format msgid "Installation of new keyfile \"%s\" failed" msgstr "Installation der neuen SchlĂźsseldatei Âť%sÂŤ schlug fehl." #: cryptmount.c:1070 #, c-format msgid "Only root can use option \"%s\"\n" msgstr "Nur root kann die Option Âť%sÂŤ verwenden.\n" #: cryptmount.c:1083 #, c-format msgid "Only root can configure \"%s\"\n" msgstr "Nur root kann Âť%sÂŤ konfigurieren.\n" #: cryptmount.c:1147 #, 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:1414 #, c-format msgid "Multiple operating modes not supported\n" msgstr "Mehrere Betriebsmodi werden nicht unterstĂźtzt\n" #: cryptmount.c:1469 #, c-format msgid "Memory-locking failed...\n" msgstr "Sperren des Arbeitsspeichers schlug fehl …\n" #: cryptmount.c:1497 #, c-format msgid "Bad file-descriptor (%d)\n" msgstr "Fehlerhafter Dateideskriptor (%d)\n" #: cryptmount.c:1507 #, c-format msgid "Security failure\n" msgstr "Sicherheitsfehler\n" #: cryptmount.c:1526 #, c-format msgid "Trailing command-line arguments given with '--all' option\n" msgstr "" "Abschließende Befehlszeilen-Argumente; wurden zusammen mit der Option Âť--" "allÂŤ angegeben.\n" #: cryptmount.c:1558 #, c-format msgid "Target security failure for \"%s\"\n" msgstr "Sicherheitsfehler fĂźr Ziel Âť%sÂŤ.\n" #: cryptmount.c:1567 #, c-format msgid "No targets specified\n" msgstr "Keine Ziele angegeben.\n" #: fsutils.c:267 #, c-format msgid "Unsuitable filesystem type \"%s\" for swapping\n" msgstr "Unpassender Dateisystemtyp Âť%sÂŤ zum Auslagern.\n" #: fsutils.c:297 #, 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:226 #, c-format msgid "Failed to free device (%d,%d)\n" msgstr "Konnte Gerät (%d,%d) nicht freigeben.\n" #: looputils.c:262 #, c-format msgid "No available loopback devices\n" msgstr "Keine verfĂźgbaren Loopback-Geräte.\n" #: looputils.c:276 #, 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:315 #, c-format msgid "Unable to allocate memory\n" msgstr "Konnte keinen Speicher reservieren.\n" #: utils.c:425 #, c-format msgid "Too few random-number sources found\n" msgstr "Zu wenige Zufallszahlenquellen gefunden.\n" #: utils.c:484 #, c-format msgid "Cannot read stdin" msgstr "Kann nicht von der Standardeingabe lesen." #: utils.c:496 #, c-format msgid "Failed to turn off keyboard echoing on terminal\n" msgstr "Konnte die Wiedergabe der Tastatureingabe nicht deaktivieren.\n" #: utils.c:526 #, c-format msgid "Enter new password for target \"%s\": " msgstr "Bitte geben Sie ein neues Passwort fĂźr das Ziel Âť%sÂŤ ein: " #: utils.c:527 #, c-format msgid "Enter password for target \"%s\": " msgstr "Bitte geben Sie das Passwort fĂźr das Ziel Âť%sÂŤ ein: " #: utils.c:536 #, c-format msgid "Confirm password: " msgstr "Passwort bestätigen: " #: utils.c:539 #, c-format msgid "Password mismatch\n" msgstr "Passworte stimmen nicht Ăźberein.\n" #: utils.c:578 sysinit/setupscript.sh.in:237 #, sh-format msgid "yes" msgstr "ja" #: utils.c:585 #, c-format msgid "Are you sure? (Type \"%s\" to proceed): " msgstr "Sind Sie sicher? (Geben Sie Âť%sÂŤ ein, um fortzufahren): " #: utils.c:588 #, 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:64 #, sh-format msgid "No LUKS support available - using built-in key manager" msgstr "" "Keine LUKS-UnterstĂźtzung verfĂźgbar - eingebauter SchlĂźsselverwalter wird " "verwandt" #: sysinit/setupscript.sh.in:123 #, sh-format msgid "opaque" msgstr "undurchlässig" #: sysinit/setupscript.sh.in:124 #, 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:125 #, sh-format msgid "The following target names have already been used:" msgstr "Die folgenden Zielnamen werden bereits verwandt:" #: sysinit/setupscript.sh.in:132 #, 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:136 #, sh-format msgid "The target-name \"${TargetName}\" has already been used" msgstr "Der Zielname Âť${TargetName}ÂŤ wird bereits verwandt." #: sysinit/setupscript.sh.in:144 #, 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:146 #, 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:152 #, 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:156 #, 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:160 #, sh-format msgid "${mount_dir} is not a valid directory name" msgstr "Âť${mount_dir}ÂŤ ist kein gĂźltiger Verzeichnisname." #: sysinit/setupscript.sh.in:168 #, 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:172 #, 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:177 #, sh-format msgid "${fs_size} is not a valid number" msgstr "Âť${fs_size}ÂŤ ist keine gĂźltige Zahl" #: sysinit/setupscript.sh.in:183 #, 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:187 #, 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:191 #, sh-format msgid "WARNING: ${crypto_dev} already exists" msgstr "WARNUNG: Âť${crypto_dev}ÂŤ existiert bereits." #: sysinit/setupscript.sh.in:204 #, 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:208 #, 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:212 #, sh-format msgid "WARNING: ${key_file} already exists" msgstr "WARNUNG: Âť${key_file}ÂŤ existiert bereits." #: sysinit/setupscript.sh.in:224 #, 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:225 #, sh-format msgid " - Creating the directory \"${mount_dir}\"" msgstr " - Erstellen des Verzeichnisses Âť${mount_dir}ÂŤ" #: sysinit/setupscript.sh.in:226 #, 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:227 #, 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:229 #, sh-format msgid " - Creating a key-file (\"${key_file}\")" msgstr " - Erstellen der SchlĂźsseldatei Âť${key_file}ÂŤ" #: sysinit/setupscript.sh.in:231 #, sh-format msgid " - Creating an ext4 filingsystem on \"${crypto_dev}\"" msgstr " - Erstellen eines ext4-Dateisystems auf Âť${crypto_dev}ÂŤ" #: sysinit/setupscript.sh.in:234 #, sh-format msgid " - Overwriting the backup configuration-file \"${bckp_cmtab}\"" msgstr "" " - Überschreiben der Sicherheitskopie der Konfigurationsdatei ${bckp_cmtab}" #: sysinit/setupscript.sh.in:236 #, 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:238 #, sh-format msgid "no" msgstr "nein" #: sysinit/setupscript.sh.in:239 #, 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:242 #, sh-format msgid "Installation abandoned" msgstr "Installation abgebrochen" #: sysinit/setupscript.sh.in:246 #, sh-format msgid "done" msgstr "erledigt" #: sysinit/setupscript.sh.in:248 #, sh-format msgid "Making mount-point (${mount_dir})..." msgstr "Erstelle Einhängepunkt Âť${mount_dir}ÂŤ …" #: sysinit/setupscript.sh.in:251 #, sh-format msgid "Creating filesystem container (${crypto_dev})..." msgstr "Erstelle Dateisystemcontainer Âť${crypto_dev}ÂŤ …" #: sysinit/setupscript.sh.in:256 #, 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:272 #, sh-format msgid "Generating filesystem access key..." msgstr "Erstelle ZugriffsschlĂźssel fĂźr das Dateisystem …" #: sysinit/setupscript.sh.in:280 #, sh-format msgid "Formatting encrypted filesystem..." msgstr "Formatiere das verschlĂźsselte Dateisystem …" #: sysinit/setupscript.sh.in:309 #, sh-format msgid "cryptmount setup script" msgstr "cryptmount-Einrichtungsskript" #: sysinit/setupscript.sh.in:311 #, 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:314 #, sh-format msgid "cryptmount comes with ABSOLUTELY NO WARRANTY." msgstr "cryptmount wird OHNE JEDWEDE GARANTIEN angeboten." #: sysinit/setupscript.sh.in:315 #, 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:342 #, 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:345 #, 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 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-6.2.0/po/POTFILES.in0000644000175000017500000000042712622073412013061 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-6.2.0/po/stamp-po0000644000175000017500000000001214316221570012757 00000000000000timestamp cryptmount-6.2.0/po/remove-potcdate.sin0000644000175000017500000000066011216245452015117 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-6.2.0/po/quot.sed0000644000175000017500000000023111216245452012765 00000000000000s/"\([^"]*\)"/“\1”/g s/`\([^`']*\)'/‘\1’/g s/ '\([^`']*\)' / ‘\1’ /g s/ '\([^`']*\)'$/ ‘\1’/g s/^'\([^`']*\)' /‘\1’ /g s/“”/""/g cryptmount-6.2.0/config.h.in0000644000175000017500000001221314356320432012710 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 CFLocaleCopyPreferredLanguages in the CoreFoundation framework. */ #undef HAVE_CFLOCALECOPYPREFERREDLANGUAGES /* 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 `syncfs' function. */ #undef HAVE_SYNCFS /* 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_SYSMACROS_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-6.2.0/doxygen.conf.in0000644000175000017500000002360612622073412013623 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-6.2.0/Makefile.am0000644000175000017500000000636314320460602012725 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 \ INSTALL.md README.md README.sshfs RELNOTES cryptmount.spec \ debian/changelog 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# or refer to ${CM_SYSCONF_DIR}/cmtab.example\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 test: cmtest cd testing && sudo ./mudslinger .PHONY: depend depend: ${CC} -MM ${DEFS} ${DEFAULT_INCLUDES} ${INCLUDES} ${AM_CPFLAGS} ${CPPFLAGS} ${cryptmount_NONHEADERS} > .depend -include .depend cryptmount-6.2.0/man/0000755000175000017500000000000014356320433011522 500000000000000cryptmount-6.2.0/man/cryptmount.8.in0000644000175000017500000003042414356316574014402 00000000000000.\" cryptmount manual page .\" (C)Copyright 2005-2023 RW Penney .\" .TH CRYPTMOUNT 8 "2023-01-07" "@PACKAGE_VERSION@" "User commands" .SH NAME cryptmount \- mount/unmount/configure an encrypted filesystem .\" -------------------------------- .SH SYNOPSIS .BI "cryptmount \fITARGET\fR [\fITARGET ...\fR]" .LP .BI "cryptmount \-\-unmount \fITARGET\fR [\fITARGET ...\fR]" .LP .BI "cryptmount \-\-change\-password \fITARGET\fR" .LP .BI "cryptmount \-\-generate\-key \fISIZE\fP \fITARGET\fR" ___DELETE_CSWAP_0 .LP .BI "cryptmount \-\-swapon \fITARGET\fR" .LP .BI "cryptmount \-\-swapoff \fITARGET\fR" ___END_CSWAP_0 .\" -------------------------------- .SH DESCRIPTION .B cryptmount allows an encrypted filesystem to be mounted or unmounted, without requiring superuser privileges, and assists the superuser in creating new encrypted filesystems. After initial configuration of the filesystem by the system administrator, the user needs only to provide the decryption password for that filing system in order for .B cryptmount to automatically configure device-mapper and loopback targets before mounting the filesystem. .B cryptmount was written in response to differences between the newer device-mapper infrastructure of the linux-2.6 kernel series, and the older cryptoloop infrastructure which allowed ordinary users access to encrypted filesystems directly through .B mount (8). .\" -------------------------------- .SH OPTIONS .TP .B \-a \-\-all act on all available targets, e.g. for mounting all targets. .TP .B \-m \-\-mount mount the specified target, configuring any required device-mapper or loopback devices. The user will be asked to supply a password to unlock the decryption key for the filesystem. .TP .B \-u \-\-unmount unmount the specified target, and deconfigure any underlying device-mapper or loopback devices. No password is required, although the operation will fail if the filesystem is in use, or if a non-root user tries to unmount a filesystem mounted by a different user. .TP .B \-S \-\-status provide information on whether the specified target is currently mounted or not .TP .B \-l \-\-list lists all available targets, including basic information about the filesystem and mount point of each. .TP .B \-c \-\-change\-password change the password protecting the decryption key for a given filesystem. .TP .B \-g \-\-generate\-key "\fIsize\fP" setup a decryption key for a new filesystem. .IR size\fP gives the length of the key in bytes. .TP .B \-e \-\-reuse\-key "\fIexisting-target\fP" setup a decryption key for a new filesystem, using an existing key from another filesystem, for example to translate between different file-formats for storing a single key. This option is only available to the superuser. .TP .B \-f \-\-config\-fd "\fInum\fP" read configuration information about targets from file-descriptor .IR num\fP instead of the default configuration file. This option is only available to the superuser. .TP .B \-w \-\-passwd\-fd "\fInum\fP" read passwords from file-descriptor .IR num\fP instead of from the terminal, e.g. for using cryptmount within scripts or GUI wrappers. Each password is read once only, in contrast to terminal-based operation where new passwords would be requested twice for verification. .TP .B \-p \-\-prepare prepare all the device-mapper and loopback devices needed to access a target, but do not mount. This is intended to allow the superuser to install a filesystem on an encrypted device. .TP .B \-r \-\-release releases all device-mapper and loopback devices associated with a particular target. This option is only available to the superuser. ___DELETE_CSWAP_0 .TP .B \-s \-\-swapon enable the specified target for paging and swapping. This option is only available to the superuser. .TP .B \-x \-\-swapoff disable the specified target for paging and swapping. This option is only available to the superuser. ___END_CSWAP_0 .TP .B \-k \-\-key-managers list all the available formats for protecting the filesystem access keys. .TP .B \-B \-\-system-boot setup all targets which have declared a "bootaction" parameter. This will typically be used to automatically mount encrypted filesystems, or setup encrypted swap partitions, on system startup. This option is only available to the superuser. .TP .B \-Q \-\-system-shutdown close-down all targets which have declared a "bootaction" parameter. This is essentially the opposite of the "\-\-system-boot" option. .TP .B \-n \-\-safetynet attempts to close-down any mounted targets that should normally have been shutdown with \-\-unmount or \-\-swapoff. This option is only available to the superuser, and intended .B exclusively for use during shutdown/reboot of the operating system. .TP .B \-v \-\-version show the version-number of the installed program. .\" -------------------------------- .SH RETURN CODES .B cryptmount returns zero on success. A non-zero value indicates a failure of some form, as follows: .TP .B 1 unrecognized command-line option; .TP .B 2 unrecognized filesystem target name; .TP .B 3 failed to execute helper program; .TP .B 100 insufficient privilege; .TP .B 101 security failure in installation. .\" -------------------------------- .SH EXAMPLE USAGE In order to create a new encrypted filesystem managed by cryptmount, you can use the supplied 'cryptmount-setup' program, which can be used by the superuser to interactively configure a basic setup. Alternatively, a manual setup allows more control of configuration settings. Before doing so, one should ensure that kernel support for /dev/loop and /dev/mapper is available, e.g. via .EX modprobe \-a loop dm\-crypt .EE Now suppose that we wish to setup a new encrypted filesystem, that will have a target-name of "opaque". If we have a free disk partition available, say /dev/sdb63, then we can use this directly to store the encrypted filesystem. Alternatively, if we want to store the encrypted filesystem within an ordinary file, we need to create space using a recipe such as: .EX dd if=/dev/zero of=/home/opaque.fs bs=1M count=512 .EE and then replace all occurrences of '/dev/sdb63' in the following with '/home/opaque.fs'. (/dev/urandom can be used in place of /dev/zero, debatably for extra security, but is rather slower.) First, we need to add an entry in @CM_SYSCONF_DIR@/cmtab, which describes the encryption that will be used to protect the filesystem itself and the access key, as follows: .EX opaque { dev=/dev/sdb63 dir=/home/crypt fstype=ext2 mountoptions=defaults cipher=twofish keyfile=@CM_SYSCONF_DIR@/opaque.key keyformat=builtin } .EE Here, we will be using the "twofish" algorithm to encrypt the filesystem itself, with the built-in key-manager being used to protect the decryption key (to be stored in @CM_SYSCONF_DIR@/opaque.key). In order to generate a secret decryption key (in @CM_SYSCONF_DIR@/opaque.key) that will be used to encrypt the filesystem itself, we can execute, as root: .EX cryptmount \-\-generate\-key 32 opaque .EE This will generate a 32-byte (256-bit) key, which is known to be supported by the Twofish cipher algorithm, and store it in encrypted form after asking the system administrator for a password. If we now execute, as root: .EX cryptmount \-\-prepare opaque .EE we will then be asked for the password that we used when setting up @CM_SYSCONF_DIR@/opaque.key, which will enable .B cryptmount to setup a device-mapper target (/dev/mapper/opaque). (If you receive an error message of the form .B "device-mapper ioctl cmd 9 failed: Invalid argument", this 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.) We can now use standard tools to create the actual filesystem on /dev/mapper/opaque: .EX mke2fs /dev/mapper/opaque .EE (It may be advisable, after the filesystem is first mounted, to check that the permissions of the top-level directory created by mke2fs are appropriate for your needs.) After executing .EX cryptmount \-\-release opaque mkdir /home/crypt .EE the encrypted filesystem is ready for use. Ordinary users can mount it by typing .EX cryptmount \-m opaque .EE or .EX cryptmount opaque .EE and unmount it using .EX cryptmount \-u opaque .EE .B cryptmount keeps a record of which user mounted each filesystem in order to provide a locking mechanism to ensure that only the same user (or root) can unmount it. .\" -------------------------------- .SH PASSWORD CHANGING After a filesystem has been in use for a while, one may want to change the access password. For an example target called "opaque", this can be performed by executing: .EX cryptmount \-\-change\-password opaque .EE After successfully supplying the old password, one can then choose a new password which will be used to re-encrypt the access key for the filesystem. (The filesystem itself is not altered or re-encrypted.) .\" -------------------------------- .SH LUKS ENCRYPTED FILESYSTEMS .B cryptmount can be used to provide easy access to encrypted filesystems compatible with the Linux Unified Key Setup (LUKS) capabilities of the .B cryptsetup application. In order to access an existing LUKS partition, an entry needs to be created within @CM_SYSCONF_DIR@/cmtab. For example, if the hard-disk partition /dev/sdb62 is used to contain a LUKS encrypted ext3 filesystem, an entry of the form: .EX LUKS { keyformat=luks dev=/dev/sdb62 keyfile=/dev/sdb62 dir=/home/luks-dir fstype=ext3 } .EE would allow this to be mounted via .B cryptmount beneath /home/luks-dir by executing .EX cryptmount LUKS .EE .B cryptmount will also allow any user that knows one of the access-passwords to change their password via .EX cryptmount \-\-change-password LUKS .EE .B cryptmount also provides basic support for creating new LUKS encrypted filesystems, which can be placed within ordinary files as well as disk partitions, via the '\-\-generate-key' recipe shown above. However, to exploit the full range of functionality within LUKS, such as for adding multiple passwords, one needs to use .B cryptsetup It is strongly recommended that you do not attempt to use LUKS support in combination with cryptmount's features for storing .I multiple encrypted filesystems within a single disk partition or an ordinary file. This is because of assumptions within the cryptsetup-luks design that the LUKS key-material is always stored at the beginning of the disk partition. ___DELETE_FSCK_1 .\" -------------------------------- .SH FILESYSTEM MAINTENANCE For filesystems that are mounted on system-startup, it is normal for checks on their integrity to be performed automatically at regular intervals, typically every few dozen mounts. If .B cryptmount has not been compiled with the '\-\-enable\-fsck' option, such checks need to be performed manually for filesystems managed by .B cryptmount , which will require the involvement of both the system administrator and the users who know the relevant access passwords for the filesystems involved. Suppose that we wish to check the filesystem associated with .B cryptmount target 'opaque', we first need to prepare the decryption devices: .EX cryptmount \-\-prepare opaque .EE this will create a device-mapper target accessible via '/dev/mapper/opaque', on which we can then run standard checking utilities: .EX fsck \-t auto /dev/mapper/opaque .EE After these tests have been completed, we can then release the devices: .EX cryptmount \-\-release opaque .EE and continue using the filesystem as before. ___END_FSCK_1 .\" -------------------------------- .SH FILES .I @CM_SYSCONF_DIR@/cmtab - main configuration file .LP .I @CM_SYSRUN_DIR@/cryptmount.status - record of mounted filesystems .SH "SEE ALSO" .BR cmtab (5), .BR cryptmount-setup (8), .BR cryptsetup (8), ___DELETE_FSCK_1 .BR fsck (8), ___END_FSCK_1 .BR mount (8) .\" -------------------------------- .SH BUGS The author would be grateful for any .B constructive suggestions and bug-reports, via https://github.com/rwpenney/cryptmount/issues .\" -------------------------------- .SH COPYRIGHT NOTICE .B cryptmount is Copyright 2005-2023, 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-6.2.0/man/cmtab.5.in0000644000175000017500000004573014354510761013237 00000000000000.\" cmtab (cryptmount) manual page .\" (C)Copyright 2005-2023 RW Penney .\" .\" ---- macro definitions ---- .de Sh \" Subsection heading .br .ne 5 .PP \fB\\$1\fR .PP .. .TH CMTAB 5 "2022-09-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 \(aq#' character, and can start at any point in a line, lasting to the end of the line. The backslash character \(aq\\' 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: .EX TARGET_NAME { dev=DEVICE # REQUIRED flags=FLAG,FLAG,... startsector=STARTSECTOR numsectors=NUMSECTORS loop=LOOPDEV dir=MOUNT_POINT # REQUIRED 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 } .EE Some fields, such as \(aqdev' and \(aqfstype' are mandatory, although many fields have sensible default values. Depending on the choice of KEYMANAGER, fields such as \(aqkeyhash', \(aqkeycipher', \(aqkeymaxlen' may need to be set explicitly. Any field which contains non-numerical values (e.g. not \(aqstartsector', \(aqivoffset' 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 : .EX $(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 .EE .\" -------------------------------- .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\t(required) sets the name of the raw device (e.g. /dev/sdb63) 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 .br * "user" (any user can mount), .br * "nouser" (only root can mount), .br * "fsck" (automatically check filesystem before mounting), .br * "nofsck" (don't check filesystem before mounting), .br * "mkswap" (format swap partition before use), .br * "nomkswap" (don't format swap partition) .br * "trim" (enable TRIM/discard support on solid-state disks), .br * "notrim" (disable SSD TRIM/discard support) .br 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\t(required) specifies the directory onto which the encrypted filesystem will be mounted. .\" ---- .TP .B fstype=TYPE\t(required) 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", with the default being "none". .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\t(required) 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: .br * cmtab must be owned by root .br * cmtab must be a regular file .br * cmtab must not be globally writable .br * the directory containing cmtab must be owned by root .br * the directory containing cmtab must not be globally writable .br In addition, for each target within @CM_SYSCONF_DIR@/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_SYSCONF_DIR@/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_SYSCONF_DIR@/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: .EX # @CM_SYSCONF_DIR@/cmtab # example file \- please modify before use _DEFAULTS_ { passwdretries=3 # allow 3 password attempts by default } luks { # partition created by cryptsetup-luks dev=/dev/sdb63 dir=/mnt/luks-partition-$(USERNAME) keyformat=luks fstype=ext3 } 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/sdb62 # 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_SYSCONF_DIR@/crypt_sdb62.key keyformat=openssl # use OpenSSL key-encryption keyhash=md5 keycipher=bf\-cbc # encryption of key file } subset { dev=/dev/sdb63 startsector=512 numsectors=16384 # use subset of partition dir=/mnt/encrypted\\ subset\\ of\\ sdb fstype=reiserfs mountoptions=defaults cipher=twofish-cbc-plain # filesystem encryption # information about file used to store decryption key: keyfile=@CM_SYSCONF_DIR@/crypt_sdb63.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 } # end of cmtab .EE 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-2023, 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-6.2.0/man/makeman.defs0000644000175000017500000000200614350655276013726 00000000000000# cryptmount makefile-rules for man-pages # 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 @echo "Preparing $@ from $<" @sed ${mantransform} $< > $@ cryptmount.8: cryptmount.8.in ${top_builddir}/config.status @echo "Preparing $@ from $<" @sed ${mantransform} $< > $@ cryptmount-setup.8: cryptmount-setup.8.in ${top_builddir}/config.status @echo "Preparing $@ from $<" @sed ${mantransform} $< > $@ cryptmount-6.2.0/man/Makefile.am0000644000175000017500000000032612150047355013476 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-6.2.0/man/Makefile.in0000644000175000017500000005662614356320427013531 00000000000000# Makefile.in generated by automake 1.16.3 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2020 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 = { \ if test -z '$(MAKELEVEL)'; then \ false; \ elif test -n '$(MAKE_HOST)'; then \ true; \ elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \ true; \ else \ false; \ fi; \ } 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 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) DIST_COMMON = $(srcdir)/Makefile.am $(am__DIST_COMMON) 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__maybe_remake_depfiles = 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 distdir-am 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) am__DIST_COMMON = $(srcdir)/Makefile.in $(top_srcdir)/mkinstalldirs 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@ MSGMERGE = @MSGMERGE@ MSGMERGE_FOR_MSGFMT_OPTION = @MSGMERGE_FOR_MSGFMT_OPTION@ 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@ runstatedir = @runstatedir@ 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) --foreign --ignore-deps man/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --foreign --ignore-deps man/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__maybe_remake_depfiles)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles);; \ 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: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) distdir-am distdir-am: $(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 .PRECIOUS: Makefile 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-6.2.0/man/cryptmount-setup.8.in0000644000175000017500000000205514356316574015537 00000000000000.\" cryptmount-setup manual page .\" (C)Copyright 2007-2023 RW Penney .\" .TH CRYPTMOUNT-SETUP 8 "2023-01-07" "@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 LUKS-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-2023, RW Penney .br and is supplied with NO WARRANTY. Licencing terms are as described in the file "COPYING" within the cryptmount source distribution. cryptmount-6.2.0/man/fr/0000755000175000017500000000000014356320433012131 500000000000000cryptmount-6.2.0/man/fr/cryptmount.8.in0000644000175000017500000002264714313357267015016 00000000000000.\" cryptmount (French) manual page .\" Copyright (c) 2006-2018 RW Penney .\" .TH CRYPTMOUNT 8 "2018-01-18" "@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: .EX dd if=/dev/zero of=/home/opaque.fs bs=1M count=512 .EE 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: .EX opaque { dev=/dev/hdb63 dir=/home/crypt fstype=ext2 mountoptions=defaults cipher=twofish keyfile=@CM_SYSCONF_DIR@/opaque.key keyformat=builtin } .EE 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: .EX cryptmount \-\-generate\-key 32 opaque .EE 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: .EX cryptmount \-\-prepare opaque .EE 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: .EX mke2fs /dev/mapper/opaque .EE Apr\[`e]s avoir ex\['e]cut\['e] .EX cryptmount \-\-release opaque mkdir /home/crypt .EE 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 .EX cryptmount \-m opaque .EE ou .EX cryptmount opaque .EE et pouvent d\['e]monter avec .EX cryptmount \-u opaque .EE .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: .EX cryptmount \-\-change\-password opaque .EE 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: .EX LUKS { keyformat=luks dev=/dev/hdb62 keyfile=/dev/hdb62 dir=/home/luks-dir fstype=ext3 } .EE Apr\[`e]s avoir faire \[,c]a, c'est possible de monter cette syst\[`e]me de fichiers sous /home/luks-dir avec .EX cryptmount LUKS .EE .\" -------------------------------- .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] https://github.com/rwpenney/cryptmount/issues .\" -------------------------------- .SH COPYRIGHT NOTICE .B cryptmount est Copyright 2005-2022 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-6.2.0/man/fr/cmtab.5.in0000644000175000017500000003643514320460602013637 00000000000000.\" cmtab (French) manual page .\" Copyright (c) 2006-2018 RW Penney .\" .\" ---- macro definitions ---- .de Sh \" Subsection heading .br .ne 5 .PP \fB\\$1\fR .PP .. .TH CMTAB 5 "2018-01-18" "@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 \(aq#', 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 \(aq\\' 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: .EX 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;... supath=SUPATH cipher=CHIFFRE ivoffset=IVOFFSET keyformat=FORMAT_CLEF keyfile=FICHIER_CLEF keyhash=HASH_CLEF keycipher=CHIFFRE_CLEF keymaxlen=MAX_CLEF passwdretries=NUMESSAYES } .EE Ici, les param\[`e]tres \(aqflags', \(aqstartsector', \(aqnumsectors', \(aqloop', \(aqivoffset', \(aqkeyformat', \(aqkeymaxlen' et \(aqpasswdretries' 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/sdb63) 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 .br * "user" (n'importe quel utilisateur peut monter), .br * "nouser" (seulement le super-utilisateur peut monter), .br * "fsck" (v\['e]rifier automatiquement le syst\[`e]me de fichiers avant de monter), .br * "nofsck" (ne v\['e]rifier pas le syst\[`e]me de fichiers avant de monter), .br * "mkswap" (formater la cible pour la pagination), .br * "nomkswap" (ne formater pas la cible), .br * "trim" (activer SSD TRIM/discard), .br * "notrim" (d\['e]sactiver SSD TRIM/discard). .br 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: .br * cmtab ne soit poss\['e]d\['e] par le super-utilisateur .br * cmtab ne soit un fichier r\['e]gulier .br * les permissions de cmtab ne contiennent pas d'\['e]criture universelle .br * le r\['e]pertoire, qui contient cmtab, ne soit poss\['e]d\['e] par le super-utilisateur .br * les permissions du r\['e]pertoire, qui contient cmtab, ne contiennent pas d'\['e]criture universelle. .br 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. .EX # @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 } luks { # partition cre\['e] avec cryptsetup-luks dev=/dev/sdb63 dir=/mnt/partition-luks keyformat=luks keyfile=/dev/sdb63 fstype=ext3 } 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/sdb62 # 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_sdb62.key keyformat=openssl # utiliser OpenSSL pour chiffrage de la clef keyhash=md5 keycipher=bf\-cbc # chiffrage du fichier de la clef } subset { dev=/dev/sdb63 startsector=512 numsectors=16384 # utiliser une partie d'une partition dir=/mnt/encrypted\\ subset\\ of\\ sdb 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_sdb63.key keyformat=libgcrypt keyhash=md5 keycipher=blowfish\-cbc # chiffrage de la clef d'acc\[`e]s } encswap { # pagination chiffr\['e]e dev=/dev/sdb63 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 } # fin de cmtab .EE La cible \(aqbasic' 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 \(aqpartition' 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 \(aqsubset' est semblable \[`a] la cible \(aqpartition' 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 \(aqencswap' 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-2022 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-2022, avec beaucoup d'assistance de FP. .\" vim: set ts=4 sw=4 et: cryptmount-6.2.0/man/fr/Makefile.am0000644000175000017500000000025112150047355014102 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-6.2.0/man/fr/Makefile.in0000644000175000017500000004214714356320427014131 00000000000000# Makefile.in generated by automake 1.16.3 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2020 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 = { \ if test -z '$(MAKELEVEL)'; then \ false; \ elif test -n '$(MAKE_HOST)'; then \ true; \ elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \ true; \ else \ false; \ fi; \ } 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 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) DIST_COMMON = $(srcdir)/Makefile.am $(am__DIST_COMMON) 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__maybe_remake_depfiles = 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) am__DIST_COMMON = $(srcdir)/Makefile.in $(top_srcdir)/mkinstalldirs 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@ MSGMERGE = @MSGMERGE@ MSGMERGE_FOR_MSGFMT_OPTION = @MSGMERGE_FOR_MSGFMT_OPTION@ 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@ runstatedir = @runstatedir@ 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) --foreign --ignore-deps man/fr/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --foreign --ignore-deps man/fr/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__maybe_remake_depfiles)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles);; \ 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: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) distdir-am distdir-am: $(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 .PRECIOUS: Makefile 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-6.2.0/INSTALL.md0000644000175000017500000001531114354510761012323 00000000000000Installing cryptmount ===================== There are three main routes by which cryptmount can be installed on a Linux-based system: * Using a pre-compiled package provided by your flavour of Linux * Compiling from a source bundle containing the "configure" script * Compiling from a clone of the GitHub repository and using "autoconf" tools All of these options will, at some stage, require root-level permissions, such as "sudo". Distro-provided packages ------------------------ A variety of flavours of Linux provide official pre-built cryptmount packages, and these can be installed using normal package-management tools. In general, this is by far the easiest method of installing cryptmount. For example, on Debian or Ubuntu systems, one can simply run sudo apt-get install cryptmount Manual compilation ------------------ If you want to compile cryptmount from its source-code, perhaps because you want to customize some of its features, then this may require additional packages to be available, and should be driven by the "configure" script. If the configure script is missing, for example if working with a clone of cryptmount's [GitHub repository](https://github.com/rwpenney/cryptmount), then you may need to set up [autoconf](https://www.gnu.org/software/autoconf/) (version 2.61 or later), and run aclocal; autoconf; automake -a -c -i Dependencies ------------ A number of development packages will need to be pre-installed in order to provide library functions on which cryptmount depends. (The precise naming of these packages may differ between Linux systems.) The following packages are essential: * kernel-headers (matching the running linux-image) * libdevmapper (version 1.02 or later) The following packages are also strongly recommended, and allow a wider range of much stronger cryptographic tools: * libcryptsetup (version 1.6 or later; this is essential for LUKS support) * libgcrypt (version 1.8 or later) * libudev (version 232 or later) * pkgconf or pkg-config 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. sudo modprobe -a loop dm-crypt This is automatically performed on system reboot by setup scripts supplied with cryptmount. Source configuration -------------------- The "configure" script will automatically identify the location of key libraries and header files needed by cryptmount, and allow customization of the directory locations where cryptmount will be installed. Typically, one can simply run: ./configure although additional command-line options can also be supplied, such as: --prefix=/usr # To install beneath /usr rather than /usr/local --sysconfdir=/etc/cryptmount # To specify the directory where the "cmtab" will be stored --disable-luks # Turn-off support for LUKS encrypted containers --with-systemd # Use systemd boot-up configuration, rather than sysvinit A full list of options can be obtained by running ./configure --help Compilation and installation ---------------------------- If "configure" has run successfully (generating a `config.h` file), it should now be sufficient to run: make sudo make install This should install both the `cryptmount` and `cryptmount-setup` executables, together with manual pages and an empty filesystem configuration file. Running sudo cryptmount-setup will allow interactive creation of a basic encrypted filesystem (using LUKS, if available). More sophisticated scenarios can be handled by manual editing of the `cmtab`, following the guidance in the manual pages: man cryptmount man 5 cmtab In outline, if not using the cryptmount-setup script, one can add an entry to /etc/cryptmount/cmtab that describes the encrypted filesystem that we want to create: crypt { dev=/home/crypt.fs dir=/mnt/crypt fstype=ext4 mountoptions=defaults keyformat=luks } Thereafter, one can prepare the key-file and filing system as follows: test -e /home/crypt.fs || sudo dd if=/dev/zero of=/home/crypt.fs bs=1M count=128 sudo mkdir /mnt/crypt sudo cryptmount --generate-key 32 crypt sudo cryptmount --prepare crypt sudo mke2fs -t ext4 /dev/mapper/crypt sudo cryptmount --release crypt 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 `/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 sudo 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, some 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: sudo modprobe -a dm-mod dm-crypt 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.) ** *** ***** ******* Please note that cryptmount comes with NO WARRANTY - see the "COPYING" file in the top-level directory for further details. cryptmount-6.2.0/looputils.c0000644000175000017500000002026014354510761013070 00000000000000/* * Loopback-device utilities for cryptmount * (C)Copyright 2005-2023, 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 "config.h" #include #include #include #include #include #include #include #include #include #if HAVE_SYS_SYSMACROS_H # include #endif #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" char *cm_strdup(const char *orig); /** * 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 #if HAVE_SYS_SYSMACROS_H # include #endif #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 = NULL; if (orig == NULL) return NULL; cpy = (char*)malloc(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 #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) { #if HAVE_SYNCFS syncfs(fileno(sf->fp)); #endif 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-2023, RW Penney */ cryptmount-6.2.0/fsutils.c0000644000175000017500000004564414354510761012544 00000000000000/* * Filesystem-related utilities for cryptmount * (C)Copyright 2005-2023, 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 "config.h" #include #include #include #include #include #include #include #include #include #include #include #if HAVE_SYS_SYSMACROS_H # include #endif #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) { mounted = 0; goto bail_out; } /* check entries in /etc/mtab: */ fp = setmntent(ETCMTAB, "r"); if (fp == NULL) { /* indeterminate case - assume not mounted */ mounted = 0; goto bail_out; } 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); bail_out: if (mntdev) free((void*)mntdev); 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-2023, RW Penney */ cryptmount-6.2.0/aclocal.m40000644000175000017500000051062314356320426012540 00000000000000# generated automatically by aclocal 1.16.3 -*- Autoconf -*- # Copyright (C) 1996-2020 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 71 (gettext-0.20.2) dnl Copyright (C) 1995-2014, 2016, 2018-2020 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 be used in projects which are not available under dnl the GNU General Public License or the GNU Lesser 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 Lesser General Public License, and the rest of the GNU dnl gettext 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 must be one of 'external', 'use-libtool'. dnl INTLSYMBOL should be 'external' for packages other than GNU gettext, and dnl 'use-libtool' for the packages 'gettext-runtime' and 'gettext-tools'. 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). 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], [use-libtool], , [errprint([ERROR: invalid first argument to AM_GNU_GETTEXT ])])])]) ifelse(ifelse([$1], [], [old])[]ifelse([$1], [no-libtool], [old]), [old], [errprint([ERROR: Use of AM_GNU_GETTEXT without [external] argument is no longer supported. ])]) 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], [no], [yes])) 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 not 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 #ifndef __GNU_GETTEXT_SUPPORTED_REVISION extern int _nl_msg_cat_cntr; extern int *_nl_domain_bindings; #define __GNU_GETTEXT_SYMBOL_EXPRESSION (_nl_msg_cat_cntr + *_nl_domain_bindings) #else #define __GNU_GETTEXT_SYMBOL_EXPRESSION 0 #endif $gt_revision_test_code ]], [[ bindtextdomain ("", ""); return * gettext ("")$gt_expression_test_code + __GNU_GETTEXT_SYMBOL_EXPRESSION ]])], [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 #ifndef __GNU_GETTEXT_SUPPORTED_REVISION extern int _nl_msg_cat_cntr; extern #ifdef __cplusplus "C" #endif const char *_nl_expand_alias (const char *); #define __GNU_GETTEXT_SYMBOL_EXPRESSION (_nl_msg_cat_cntr + *_nl_expand_alias ("")) #else #define __GNU_GETTEXT_SYMBOL_EXPRESSION 0 #endif $gt_revision_test_code ]], [[ bindtextdomain ("", ""); return * gettext ("")$gt_expression_test_code + __GNU_GETTEXT_SYMBOL_EXPRESSION ]])], [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 #ifndef __GNU_GETTEXT_SUPPORTED_REVISION extern int _nl_msg_cat_cntr; extern #ifdef __cplusplus "C" #endif const char *_nl_expand_alias (const char *); #define __GNU_GETTEXT_SYMBOL_EXPRESSION (_nl_msg_cat_cntr + *_nl_expand_alias ("")) #else #define __GNU_GETTEXT_SYMBOL_EXPRESSION 0 #endif $gt_revision_test_code ]], [[ bindtextdomain ("", ""); return * gettext ("")$gt_expression_test_code + __GNU_GETTEXT_SYMBOL_EXPRESSION ]])], [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.la $LIBICONV $LIBTHREAD" LTLIBINTL="ifelse([$3],[],\${top_builddir}/intl,[$3])/libintl.la $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 In GNU gettext we have to set BUILD_INCLUDED_LIBINTL to 'yes' dnl because some of the testsuite requires it. BUILD_INCLUDED_LIBINTL=yes 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 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], []) dnl Usage: AM_GNU_GETTEXT_REQUIRE_VERSION([gettext-version]) AC_DEFUN([AM_GNU_GETTEXT_REQUIRE_VERSION], []) # host-cpu-c-abi.m4 serial 13 dnl Copyright (C) 2002-2020 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 and Sam Steingold. dnl Sets the HOST_CPU variable to the canonical name of the CPU. dnl Sets the HOST_CPU_C_ABI variable to the canonical name of the CPU with its dnl C language ABI (application binary interface). dnl Also defines __${HOST_CPU}__ and __${HOST_CPU_C_ABI}__ as C macros in dnl config.h. dnl dnl This canonical name can be used to select a particular assembly language dnl source file that will interoperate with C code on the given host. dnl dnl For example: dnl * 'i386' and 'sparc' are different canonical names, because code for i386 dnl will not run on SPARC CPUs and vice versa. They have different dnl instruction sets. dnl * 'sparc' and 'sparc64' are different canonical names, because code for dnl 'sparc' and code for 'sparc64' cannot be linked together: 'sparc' code dnl contains 32-bit instructions, whereas 'sparc64' code contains 64-bit dnl instructions. A process on a SPARC CPU can be in 32-bit mode or in 64-bit dnl mode, but not both. dnl * 'mips' and 'mipsn32' are different canonical names, because they use dnl different argument passing and return conventions for C functions, and dnl although the instruction set of 'mips' is a large subset of the dnl instruction set of 'mipsn32'. dnl * 'mipsn32' and 'mips64' are different canonical names, because they use dnl different sizes for the C types like 'int' and 'void *', and although dnl the instruction sets of 'mipsn32' and 'mips64' are the same. dnl * The same canonical name is used for different endiannesses. You can dnl determine the endianness through preprocessor symbols: dnl - 'arm': test __ARMEL__. dnl - 'mips', 'mipsn32', 'mips64': test _MIPSEB vs. _MIPSEL. dnl - 'powerpc64': test _BIG_ENDIAN vs. _LITTLE_ENDIAN. dnl * The same name 'i386' is used for CPUs of type i386, i486, i586 dnl (Pentium), AMD K7, Pentium II, Pentium IV, etc., because dnl - Instructions that do not exist on all of these CPUs (cmpxchg, dnl MMX, SSE, SSE2, 3DNow! etc.) are not frequently used. If your dnl assembly language source files use such instructions, you will dnl need to make the distinction. dnl - Speed of execution of the common instruction set is reasonable across dnl the entire family of CPUs. If you have assembly language source files dnl that are optimized for particular CPU types (like GNU gmp has), you dnl will need to make the distinction. dnl See . AC_DEFUN([gl_HOST_CPU_C_ABI], [ AC_REQUIRE([AC_CANONICAL_HOST]) AC_REQUIRE([gl_C_ASM]) AC_CACHE_CHECK([host CPU and C ABI], [gl_cv_host_cpu_c_abi], [case "$host_cpu" in changequote(,)dnl i[34567]86 ) changequote([,])dnl gl_cv_host_cpu_c_abi=i386 ;; x86_64 ) # On x86_64 systems, the C compiler may be generating code in one of # these ABIs: # - 64-bit instruction set, 64-bit pointers, 64-bit 'long': x86_64. # - 64-bit instruction set, 64-bit pointers, 32-bit 'long': x86_64 # with native Windows (mingw, MSVC). # - 64-bit instruction set, 32-bit pointers, 32-bit 'long': x86_64-x32. # - 32-bit instruction set, 32-bit pointers, 32-bit 'long': i386. AC_COMPILE_IFELSE( [AC_LANG_SOURCE( [[#if (defined __x86_64__ || defined __amd64__ \ || defined _M_X64 || defined _M_AMD64) int ok; #else error fail #endif ]])], [AC_COMPILE_IFELSE( [AC_LANG_SOURCE( [[#if defined __ILP32__ || defined _ILP32 int ok; #else error fail #endif ]])], [gl_cv_host_cpu_c_abi=x86_64-x32], [gl_cv_host_cpu_c_abi=x86_64])], [gl_cv_host_cpu_c_abi=i386]) ;; changequote(,)dnl alphaev[4-8] | alphaev56 | alphapca5[67] | alphaev6[78] ) changequote([,])dnl gl_cv_host_cpu_c_abi=alpha ;; arm* | aarch64 ) # Assume arm with EABI. # On arm64 systems, the C compiler may be generating code in one of # these ABIs: # - aarch64 instruction set, 64-bit pointers, 64-bit 'long': arm64. # - aarch64 instruction set, 32-bit pointers, 32-bit 'long': arm64-ilp32. # - 32-bit instruction set, 32-bit pointers, 32-bit 'long': arm or armhf. AC_COMPILE_IFELSE( [AC_LANG_SOURCE( [[#ifdef __aarch64__ int ok; #else error fail #endif ]])], [AC_COMPILE_IFELSE( [AC_LANG_SOURCE( [[#if defined __ILP32__ || defined _ILP32 int ok; #else error fail #endif ]])], [gl_cv_host_cpu_c_abi=arm64-ilp32], [gl_cv_host_cpu_c_abi=arm64])], [# Don't distinguish little-endian and big-endian arm, since they # don't require different machine code for simple operations and # since the user can distinguish them through the preprocessor # defines __ARMEL__ vs. __ARMEB__. # But distinguish arm which passes floating-point arguments and # return values in integer registers (r0, r1, ...) - this is # gcc -mfloat-abi=soft or gcc -mfloat-abi=softfp - from arm which # passes them in float registers (s0, s1, ...) and double registers # (d0, d1, ...) - this is gcc -mfloat-abi=hard. GCC 4.6 or newer # sets the preprocessor defines __ARM_PCS (for the first case) and # __ARM_PCS_VFP (for the second case), but older GCC does not. echo 'double ddd; void func (double dd) { ddd = dd; }' > conftest.c # Look for a reference to the register d0 in the .s file. AC_TRY_COMMAND(${CC-cc} $CFLAGS $CPPFLAGS $gl_c_asm_opt conftest.c) >/dev/null 2>&1 if LC_ALL=C grep 'd0,' conftest.$gl_asmext >/dev/null; then gl_cv_host_cpu_c_abi=armhf else gl_cv_host_cpu_c_abi=arm fi rm -f conftest* ]) ;; hppa1.0 | hppa1.1 | hppa2.0* | hppa64 ) # On hppa, the C compiler may be generating 32-bit code or 64-bit # code. In the latter case, it defines _LP64 and __LP64__. AC_COMPILE_IFELSE( [AC_LANG_SOURCE( [[#ifdef __LP64__ int ok; #else error fail #endif ]])], [gl_cv_host_cpu_c_abi=hppa64], [gl_cv_host_cpu_c_abi=hppa]) ;; ia64* ) # On ia64 on HP-UX, the C compiler may be generating 64-bit code or # 32-bit code. In the latter case, it defines _ILP32. AC_COMPILE_IFELSE( [AC_LANG_SOURCE( [[#ifdef _ILP32 int ok; #else error fail #endif ]])], [gl_cv_host_cpu_c_abi=ia64-ilp32], [gl_cv_host_cpu_c_abi=ia64]) ;; mips* ) # We should also check for (_MIPS_SZPTR == 64), but gcc keeps this # at 32. AC_COMPILE_IFELSE( [AC_LANG_SOURCE( [[#if defined _MIPS_SZLONG && (_MIPS_SZLONG == 64) int ok; #else error fail #endif ]])], [gl_cv_host_cpu_c_abi=mips64], [# In the n32 ABI, _ABIN32 is defined, _ABIO32 is not defined (but # may later get defined by ), and _MIPS_SIM == _ABIN32. # In the 32 ABI, _ABIO32 is defined, _ABIN32 is not defined (but # may later get defined by ), and _MIPS_SIM == _ABIO32. AC_COMPILE_IFELSE( [AC_LANG_SOURCE( [[#if (_MIPS_SIM == _ABIN32) int ok; #else error fail #endif ]])], [gl_cv_host_cpu_c_abi=mipsn32], [gl_cv_host_cpu_c_abi=mips])]) ;; powerpc* ) # Different ABIs are in use on AIX vs. Mac OS X vs. Linux,*BSD. # No need to distinguish them here; the caller may distinguish # them based on the OS. # On powerpc64 systems, the C compiler may still be generating # 32-bit code. And on powerpc-ibm-aix systems, the C compiler may # be generating 64-bit code. AC_COMPILE_IFELSE( [AC_LANG_SOURCE( [[#if defined __powerpc64__ || defined _ARCH_PPC64 int ok; #else error fail #endif ]])], [# On powerpc64, there are two ABIs on Linux: The AIX compatible # one and the ELFv2 one. The latter defines _CALL_ELF=2. AC_COMPILE_IFELSE( [AC_LANG_SOURCE( [[#if defined _CALL_ELF && _CALL_ELF == 2 int ok; #else error fail #endif ]])], [gl_cv_host_cpu_c_abi=powerpc64-elfv2], [gl_cv_host_cpu_c_abi=powerpc64]) ], [gl_cv_host_cpu_c_abi=powerpc]) ;; rs6000 ) gl_cv_host_cpu_c_abi=powerpc ;; riscv32 | riscv64 ) # There are 2 architectures (with variants): rv32* and rv64*. AC_COMPILE_IFELSE( [AC_LANG_SOURCE( [[#if __riscv_xlen == 64 int ok; #else error fail #endif ]])], [cpu=riscv64], [cpu=riscv32]) # There are 6 ABIs: ilp32, ilp32f, ilp32d, lp64, lp64f, lp64d. # Size of 'long' and 'void *': AC_COMPILE_IFELSE( [AC_LANG_SOURCE( [[#if defined __LP64__ int ok; #else error fail #endif ]])], [main_abi=lp64], [main_abi=ilp32]) # Float ABIs: # __riscv_float_abi_double: # 'float' and 'double' are passed in floating-point registers. # __riscv_float_abi_single: # 'float' are passed in floating-point registers. # __riscv_float_abi_soft: # No values are passed in floating-point registers. AC_COMPILE_IFELSE( [AC_LANG_SOURCE( [[#if defined __riscv_float_abi_double int ok; #else error fail #endif ]])], [float_abi=d], [AC_COMPILE_IFELSE( [AC_LANG_SOURCE( [[#if defined __riscv_float_abi_single int ok; #else error fail #endif ]])], [float_abi=f], [float_abi='']) ]) gl_cv_host_cpu_c_abi="${cpu}-${main_abi}${float_abi}" ;; s390* ) # On s390x, the C compiler may be generating 64-bit (= s390x) code # or 31-bit (= s390) code. AC_COMPILE_IFELSE( [AC_LANG_SOURCE( [[#if defined __LP64__ || defined __s390x__ int ok; #else error fail #endif ]])], [gl_cv_host_cpu_c_abi=s390x], [gl_cv_host_cpu_c_abi=s390]) ;; sparc | sparc64 ) # UltraSPARCs running Linux have `uname -m` = "sparc64", but the # C compiler still generates 32-bit code. AC_COMPILE_IFELSE( [AC_LANG_SOURCE( [[#if defined __sparcv9 || defined __arch64__ int ok; #else error fail #endif ]])], [gl_cv_host_cpu_c_abi=sparc64], [gl_cv_host_cpu_c_abi=sparc]) ;; *) gl_cv_host_cpu_c_abi="$host_cpu" ;; esac ]) dnl In most cases, $HOST_CPU and $HOST_CPU_C_ABI are the same. HOST_CPU=`echo "$gl_cv_host_cpu_c_abi" | sed -e 's/-.*//'` HOST_CPU_C_ABI="$gl_cv_host_cpu_c_abi" AC_SUBST([HOST_CPU]) AC_SUBST([HOST_CPU_C_ABI]) # This was # AC_DEFINE_UNQUOTED([__${HOST_CPU}__]) # AC_DEFINE_UNQUOTED([__${HOST_CPU_C_ABI}__]) # earlier, but KAI C++ 3.2d doesn't like this. sed -e 's/-/_/g' >> confdefs.h < #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 am_cv_func_iconv_works=no for ac_iconv_const in '' 'const'; do AC_RUN_IFELSE( [AC_LANG_PROGRAM( [[ #include #include #ifndef ICONV_CONST # define ICONV_CONST $ac_iconv_const #endif ]], [[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 ICONV_CONST char input[] = "\342\202\254"; /* EURO SIGN */ char buf[10]; ICONV_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, &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 ICONV_CONST char input[] = "\263"; char buf[10]; ICONV_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, &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 ICONV_CONST char input[] = "\304"; static char buf[2] = { (char)0xDE, (char)0xAD }; ICONV_CONST char *inptr = input; size_t inbytesleft = 1; char *outptr = buf; size_t outbytesleft = 1; size_t res = iconv (cd_88591_to_utf8, &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 ICONV_CONST char input[] = "\304rger mit b\366sen B\374bchen ohne Augenma\337"; char buf[50]; ICONV_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, &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. */ { /* Try standardized names. */ iconv_t cd1 = iconv_open ("UTF-8", "EUC-JP"); /* Try IRIX, OSF/1 names. */ iconv_t cd2 = iconv_open ("UTF-8", "eucJP"); /* Try AIX names. */ iconv_t cd3 = iconv_open ("UTF-8", "IBM-eucJP"); /* Try HP-UX names. */ iconv_t cd4 = iconv_open ("utf8", "eucJP"); if (cd1 == (iconv_t)(-1) && cd2 == (iconv_t)(-1) && cd3 == (iconv_t)(-1) && cd4 == (iconv_t)(-1)) result |= 16; if (cd1 != (iconv_t)(-1)) iconv_close (cd1); if (cd2 != (iconv_t)(-1)) iconv_close (cd2); if (cd3 != (iconv_t)(-1)) iconv_close (cd3); if (cd4 != (iconv_t)(-1)) iconv_close (cd4); } return result; ]])], [am_cv_func_iconv_works=yes], , [case "$host_os" in aix* | hpux*) am_cv_func_iconv_works="guessing no" ;; *) am_cv_func_iconv_works="guessing yes" ;; esac]) test "$am_cv_func_iconv_works" = no || break done 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]) else dnl When compiling GNU libiconv on a system that does not have iconv yet, dnl pick the POSIX compliant declaration without 'const'. am_cv_proto_iconv_arg1="" fi 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 ]) ]) # intlmacosx.m4 serial 8 (gettext-0.20.2) dnl Copyright (C) 2004-2014, 2016, 2019-2020 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 be used in projects which are not available under dnl the GNU General Public License or the GNU Lesser 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 Lesser General Public License, and the rest of the GNU dnl gettext 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.4. 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 Don't check for the API introduced in Mac OS X 10.5, CFLocaleCopyCurrent, dnl because in macOS 10.13.4 it has the following behaviour: dnl When two or more languages are specified in the dnl "System Preferences > Language & Region > Preferred Languages" panel, dnl it returns en_CC where CC is the territory (even when English is not among dnl the preferred languages!). What we want instead is what dnl CFLocaleCopyCurrent returned in earlier macOS releases and what dnl CFPreferencesCopyAppValue still returns, namely ll_CC where ll is the dnl first among the preferred languages and CC is the territory. AC_CACHE_CHECK([for CFLocaleCopyPreferredLanguages], [gt_cv_func_CFLocaleCopyPreferredLanguages], [gt_save_LIBS="$LIBS" LIBS="$LIBS -Wl,-framework -Wl,CoreFoundation" AC_LINK_IFELSE( [AC_LANG_PROGRAM( [[#include ]], [[CFLocaleCopyPreferredLanguages();]])], [gt_cv_func_CFLocaleCopyPreferredLanguages=yes], [gt_cv_func_CFLocaleCopyPreferredLanguages=no]) LIBS="$gt_save_LIBS"]) if test $gt_cv_func_CFLocaleCopyPreferredLanguages = yes; then AC_DEFINE([HAVE_CFLOCALECOPYPREFERREDLANGUAGES], [1], [Define to 1 if you have the Mac OS X function CFLocaleCopyPreferredLanguages in the CoreFoundation framework.]) fi INTL_MACOSX_LIBS= if test $gt_cv_func_CFPreferencesCopyAppValue = yes \ || test $gt_cv_func_CFLocaleCopyPreferredLanguages = yes; then INTL_MACOSX_LIBS="-Wl,-framework -Wl,CoreFoundation" fi AC_SUBST([INTL_MACOSX_LIBS]) ]) # lib-ld.m4 serial 9 dnl Copyright (C) 1996-2003, 2009-2020 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 if test -n "$LD"; then AC_MSG_CHECKING([for ld]) elif test "$GCC" = yes; then AC_MSG_CHECKING([for ld used by $CC]) elif test "$with_gnu_ld" = yes; then AC_MSG_CHECKING([for GNU ld]) else AC_MSG_CHECKING([for non-GNU ld]) fi if test -n "$LD"; then # Let the user override the test with a path. : else AC_CACHE_VAL([acl_cv_path_LD], [ acl_cv_path_LD= # Final result of this test ac_prog=ld # Program to search in $PATH if test "$GCC" = yes; then # Check if gcc -print-prog-name=ld gives a path. case $host in *-*-mingw*) # gcc leaves a trailing carriage return which upsets mingw acl_output=`($CC -print-prog-name=ld) 2>&5 | tr -d '\015'` ;; *) acl_output=`($CC -print-prog-name=ld) 2>&5` ;; esac case $acl_output in # Accept absolute paths. [[\\/]]* | ?:[[\\/]]*) re_direlt='/[[^/]][[^/]]*/\.\./' # Canonicalize the pathname of ld acl_output=`echo "$acl_output" | sed 's%\\\\%/%g'` while echo "$acl_output" | grep "$re_direlt" > /dev/null 2>&1; do acl_output=`echo $acl_output | sed "s%$re_direlt%/%"` done # Got the pathname. No search in PATH is needed. acl_cv_path_LD="$acl_output" ac_prog= ;; "") # If it fails, then pretend we aren't using GCC. ;; *) # If it is relative, then search for the first ld in PATH. with_gnu_ld=unknown ;; esac fi if test -n "$ac_prog"; then # Search for $ac_prog in $PATH. 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 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 By default, look in $includedir and $libdir. use_additional=yes AC_LIB_WITH_FINAL_PREFIX([ eval additional_includedir=\"$includedir\" eval additional_libdir=\"$libdir\" eval additional_libdir2=\"$exec_prefix/$acl_libdirstem2\" eval additional_libdir3=\"$exec_prefix/$acl_libdirstem3\" ]) AC_ARG_WITH(PACK[-prefix], [[ --with-]]PACK[[-prefix[=DIR] search for ]PACKLIBS[ in DIR/include and DIR/lib --without-]]PACK[[-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\" eval additional_libdir2=\"$exec_prefix/$acl_libdirstem2\" eval additional_libdir3=\"$exec_prefix/$acl_libdirstem3\" ]) else additional_includedir="$withval/include" additional_libdir="$withval/$acl_libdirstem" additional_libdir2="$withval/$acl_libdirstem2" additional_libdir3="$withval/$acl_libdirstem3" fi fi ]) if test "X$additional_libdir2" = "X$additional_libdir"; then additional_libdir2= fi if test "X$additional_libdir3" = "X$additional_libdir"; then additional_libdir3= 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 for additional_libdir_variable in additional_libdir additional_libdir2 additional_libdir3; do if test "X$found_dir" = "X"; then eval dir=\$$additional_libdir_variable if test -n "$dir"; then 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" && acl_is_expected_elfclass < "$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" && acl_is_expected_elfclass < "$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" && acl_is_expected_elfclass < "$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" && ${AR-ar} -p "$dir/$libname.$acl_libext" | acl_is_expected_elfclass; 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 fi done 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" && acl_is_expected_elfclass < "$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" && acl_is_expected_elfclass < "$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" && acl_is_expected_elfclass < "$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" && ${AR-ar} -p "$dir/$libname.$acl_libext" | acl_is_expected_elfclass; 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" \ || test "X$found_dir" = "X/usr/$acl_libdirstem3"; 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" ;; */$acl_libdirstem3 | */$acl_libdirstem3/) basedir=`echo "X$found_dir" | sed -e 's,^X,,' -e "s,/$acl_libdirstem3/"'*$,,'` 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*) dependency_libdir=`echo "X$dep" | sed -e 's/^X-L//'` dnl Potentially add $dependency_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$dependency_libdir" != "X/usr/$acl_libdirstem" \ && test "X$dependency_libdir" != "X/usr/$acl_libdirstem2" \ && test "X$dependency_libdir" != "X/usr/$acl_libdirstem3"; then haveit= if test "X$dependency_libdir" = "X/usr/local/$acl_libdirstem" \ || test "X$dependency_libdir" = "X/usr/local/$acl_libdirstem2" \ || test "X$dependency_libdir" = "X/usr/local/$acl_libdirstem3"; 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$dependency_libdir"; then haveit=yes break fi done if test -z "$haveit"; then if test -d "$dependency_libdir"; then dnl Really add $dependency_libdir to $LIBNAME. LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }-L$dependency_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$dependency_libdir"; then haveit=yes break fi done if test -z "$haveit"; then if test -d "$dependency_libdir"; then dnl Really add $dependency_libdir to $LTLIBNAME. LTLIB[]NAME="${LTLIB[]NAME}${LTLIB[]NAME:+ }-L$dependency_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([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" \ && test "X$dir" != "X/usr/$acl_libdirstem3"; 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" \ && test "X$dir" != "X/usr/$acl_libdirstem3"; 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 17 dnl Copyright (C) 2001-2005, 2008-2020 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_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_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 function acl_is_expected_elfclass, that tests whether standard input dn; has a 32-bit or 64-bit ELF header, depending on the host CPU ABI, dnl - 3 variables acl_libdirstem, acl_libdirstem2, acl_libdirstem3, containing dnl the basename of the libdir to try in turn, either "lib" or "lib64" or dnl "lib/64" or "lib32" or "lib/sparcv9" or "lib/amd64" or similar. AC_DEFUN([AC_LIB_PREPARE_MULTILIB], [ dnl There is no formal standard regarding lib, lib32, and lib64. dnl On most 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. However, on dnl Arch Linux based distributions, it's the opposite: 32-bit libraries go dnl under $prefix/lib32 and 64-bit libraries go under $prefix/lib. dnl We determine the compiler's default mode by looking at the compiler's dnl library search path. If at least one of its elements ends in /lib64 or dnl points to a directory whose absolute pathname ends in /lib64, we use that dnl for 64-bit ABIs. Similarly for 32-bit ABIs. Otherwise we use the default, dnl 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]) AC_REQUIRE([gl_HOST_CPU_C_ABI_32BIT]) AC_CACHE_CHECK([for ELF binary format], [gl_cv_elf], [AC_EGREP_CPP([Extensible Linking Format], [#ifdef __ELF__ Extensible Linking Format #endif ], [gl_cv_elf=yes], [gl_cv_elf=no]) ]) if test $gl_cv_elf; then # Extract the ELF class of a file (5th byte) in decimal. # Cf. https://en.wikipedia.org/wiki/Executable_and_Linkable_Format#File_header if od -A x < /dev/null >/dev/null 2>/dev/null; then # Use POSIX od. func_elfclass () { od -A n -t d1 -j 4 -N 1 } else # Use BSD hexdump. func_elfclass () { dd bs=1 count=1 skip=4 2>/dev/null | hexdump -e '1/1 "%3d "' echo } fi changequote(,)dnl case $HOST_CPU_C_ABI_32BIT in yes) # 32-bit ABI. acl_is_expected_elfclass () { test "`func_elfclass | sed -e 's/[ ]//g'`" = 1 } ;; no) # 64-bit ABI. acl_is_expected_elfclass () { test "`func_elfclass | sed -e 's/[ ]//g'`" = 2 } ;; *) # Unknown. acl_is_expected_elfclass () { : } ;; esac changequote([,])dnl else acl_is_expected_elfclass () { : } fi dnl Allow the user to override the result by setting acl_cv_libdirstems. AC_CACHE_CHECK([for the common suffixes of directories in the library search path], [acl_cv_libdirstems], [dnl Try 'lib' first, because that's the default for libdir in GNU, see dnl . acl_libdirstem=lib acl_libdirstem2= acl_libdirstem3= 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. if test $HOST_CPU_C_ABI_32BIT = no; then acl_libdirstem2=lib/64 case "$host_cpu" in sparc*) acl_libdirstem3=lib/sparcv9 ;; i*86 | x86_64) acl_libdirstem3=lib/amd64 ;; esac fi ;; *) dnl If $CC generates code for a 32-bit ABI, the libraries are dnl surely under $prefix/lib or $prefix/lib32, not $prefix/lib64. dnl Similarly, if $CC generates code for a 64-bit ABI, the libraries dnl are surely under $prefix/lib or $prefix/lib64, not $prefix/lib32. dnl Find the compiler's search path. However, non-system compilers dnl sometimes have odd library search paths. But we can't simply invoke dnl '/usr/bin/gcc -print-search-dirs' because that would not take into dnl account the -m32/-m31 or -m64 options from the $CC or $CFLAGS. searchpath=`(LC_ALL=C $CC $CPPFLAGS $CFLAGS -print-search-dirs) 2>/dev/null \ | sed -n -e 's,^libraries: ,,p' | sed -e 's,^=,,'` if test $HOST_CPU_C_ABI_32BIT != no; then # 32-bit or unknown ABI. if test -d /usr/lib32; then acl_libdirstem2=lib32 fi fi if test $HOST_CPU_C_ABI_32BIT != yes; then # 64-bit or unknown ABI. if test -d /usr/lib64; then acl_libdirstem3=lib64 fi fi if test -n "$searchpath"; then acl_save_IFS="${IFS= }"; IFS=":" for searchdir in $searchpath; do if test -d "$searchdir"; then case "$searchdir" in */lib32/ | */lib32 ) acl_libdirstem2=lib32 ;; */lib64/ | */lib64 ) acl_libdirstem3=lib64 ;; */../ | */.. ) # Better ignore directories of this form. They are misleading. ;; *) searchdir=`cd "$searchdir" && pwd` case "$searchdir" in */lib32 ) acl_libdirstem2=lib32 ;; */lib64 ) acl_libdirstem3=lib64 ;; esac ;; esac fi done IFS="$acl_save_IFS" if test $HOST_CPU_C_ABI_32BIT = yes; then # 32-bit ABI. acl_libdirstem3= fi if test $HOST_CPU_C_ABI_32BIT = no; then # 64-bit ABI. acl_libdirstem2= fi fi ;; esac test -n "$acl_libdirstem2" || acl_libdirstem2="$acl_libdirstem" test -n "$acl_libdirstem3" || acl_libdirstem3="$acl_libdirstem" acl_cv_libdirstems="$acl_libdirstem,$acl_libdirstem2,$acl_libdirstem3" ]) dnl Decompose acl_cv_libdirstems into acl_libdirstem, acl_libdirstem2, and dnl acl_libdirstem3. changequote(,)dnl acl_libdirstem=`echo "$acl_cv_libdirstems" | sed -e 's/,.*//'` acl_libdirstem2=`echo "$acl_cv_libdirstems" | sed -e 's/^[^,]*,//' -e 's/,.*//'` acl_libdirstem3=`echo "$acl_cv_libdirstems" | sed -e 's/^[^,]*,[^,]*,//' -e 's/,.*//'` changequote([,])dnl ]) # nls.m4 serial 6 (gettext-0.20.2) dnl Copyright (C) 1995-2003, 2005-2006, 2008-2014, 2016, 2019-2020 Free dnl 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 be used in projects which are not available under dnl the GNU General Public License or the GNU Lesser 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 Lesser General Public License, and the rest of the GNU dnl gettext 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 11 (pkg-config-0.29.1) dnl Copyright Š 2004 Scott James Remnant . dnl Copyright Š 2012-2015 Dan Nicholson dnl dnl This program is free software; you can redistribute it and/or modify dnl it under the terms of the GNU General Public License as published by dnl the Free Software Foundation; either version 2 of the License, or dnl (at your option) any later version. dnl dnl This program is distributed in the hope that it will be useful, but dnl WITHOUT ANY WARRANTY; without even the implied warranty of dnl MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU dnl General Public License for more details. dnl dnl You should have received a copy of the GNU General Public License dnl along with this program; if not, write to the Free Software dnl Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA dnl 02111-1307, USA. dnl dnl As a special exception to the GNU General Public License, if you dnl distribute this file as part of a program that contains a dnl configuration script generated by Autoconf, you may include it under dnl the same distribution terms that you use for the rest of that dnl program. dnl PKG_PREREQ(MIN-VERSION) dnl ----------------------- dnl Since: 0.29 dnl dnl Verify that the version of the pkg-config macros are at least dnl MIN-VERSION. Unlike PKG_PROG_PKG_CONFIG, which checks the user's dnl installed version of pkg-config, this checks the developer's version dnl of pkg.m4 when generating configure. dnl dnl To ensure that this macro is defined, also add: dnl m4_ifndef([PKG_PREREQ], dnl [m4_fatal([must install pkg-config 0.29 or later before running autoconf/autogen])]) dnl dnl See the "Since" comment for each macro you use to see what version dnl of the macros you require. m4_defun([PKG_PREREQ], [m4_define([PKG_MACROS_VERSION], [0.29.1]) m4_if(m4_version_compare(PKG_MACROS_VERSION, [$1]), -1, [m4_fatal([pkg.m4 version $1 or higher is required but ]PKG_MACROS_VERSION[ found])]) ])dnl PKG_PREREQ dnl PKG_PROG_PKG_CONFIG([MIN-VERSION]) dnl ---------------------------------- dnl Since: 0.16 dnl dnl Search for the pkg-config tool and set the PKG_CONFIG variable to dnl first found in the path. Checks that the version of pkg-config found dnl is at least MIN-VERSION. If MIN-VERSION is not specified, 0.9.0 is dnl used since that's the first version where most current features of dnl pkg-config existed. 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 ])dnl PKG_PROG_PKG_CONFIG dnl PKG_CHECK_EXISTS(MODULES, [ACTION-IF-FOUND], [ACTION-IF-NOT-FOUND]) dnl ------------------------------------------------------------------- dnl Since: 0.18 dnl dnl Check to see whether a particular set of modules exists. Similar to dnl PKG_CHECK_MODULES(), but does not set variables or print errors. dnl dnl Please remember that m4 expands AC_REQUIRE([PKG_PROG_PKG_CONFIG]) dnl only at the first occurence in configure.ac, so if the first place dnl it's called might be skipped (such as if it is within an "if", you dnl 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]) dnl _PKG_CONFIG([VARIABLE], [COMMAND], [MODULES]) dnl --------------------------------------------- dnl Internal wrapper calling pkg-config via PKG_CONFIG and setting dnl pkg_failed based on the result. 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 ])dnl _PKG_CONFIG dnl _PKG_SHORT_ERRORS_SUPPORTED dnl --------------------------- dnl Internal check to see if pkg-config supports short errors. 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 ])dnl _PKG_SHORT_ERRORS_SUPPORTED dnl PKG_CHECK_MODULES(VARIABLE-PREFIX, MODULES, [ACTION-IF-FOUND], dnl [ACTION-IF-NOT-FOUND]) dnl -------------------------------------------------------------- dnl Since: 0.4.0 dnl dnl Note that if there is a possibility the first call to dnl PKG_CHECK_MODULES might not happen, you should be sure to include an dnl 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 ])dnl PKG_CHECK_MODULES dnl PKG_CHECK_MODULES_STATIC(VARIABLE-PREFIX, MODULES, [ACTION-IF-FOUND], dnl [ACTION-IF-NOT-FOUND]) dnl --------------------------------------------------------------------- dnl Since: 0.29 dnl dnl Checks for existence of MODULES and gathers its build flags with dnl static libraries enabled. Sets VARIABLE-PREFIX_CFLAGS from --cflags dnl and VARIABLE-PREFIX_LIBS from --libs. dnl dnl Note that if there is a possibility the first call to dnl PKG_CHECK_MODULES_STATIC might not happen, you should be sure to dnl include an explicit call to PKG_PROG_PKG_CONFIG in your dnl configure.ac. AC_DEFUN([PKG_CHECK_MODULES_STATIC], [AC_REQUIRE([PKG_PROG_PKG_CONFIG])dnl _save_PKG_CONFIG=$PKG_CONFIG PKG_CONFIG="$PKG_CONFIG --static" PKG_CHECK_MODULES($@) PKG_CONFIG=$_save_PKG_CONFIG[]dnl ])dnl PKG_CHECK_MODULES_STATIC dnl PKG_INSTALLDIR([DIRECTORY]) dnl ------------------------- dnl Since: 0.27 dnl dnl Substitutes the variable pkgconfigdir as the location where a module dnl should install pkg-config .pc files. By default the directory is dnl $libdir/pkgconfig, but the default can be changed by passing dnl DIRECTORY. The user can override through the --with-pkgconfigdir dnl 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 dnl PKG_NOARCH_INSTALLDIR([DIRECTORY]) dnl -------------------------------- dnl Since: 0.27 dnl dnl Substitutes the variable noarch_pkgconfigdir as the location where a dnl module should install arch-independent pkg-config .pc files. By dnl default the directory is $datadir/pkgconfig, but the default can be dnl changed by passing DIRECTORY. The user can override through the dnl --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 dnl PKG_CHECK_VAR(VARIABLE, MODULE, CONFIG-VARIABLE, dnl [ACTION-IF-FOUND], [ACTION-IF-NOT-FOUND]) dnl ------------------------------------------- dnl Since: 0.28 dnl dnl 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 ])dnl PKG_CHECK_VAR dnl PKG_WITH_MODULES(VARIABLE-PREFIX, MODULES, dnl [ACTION-IF-FOUND],[ACTION-IF-NOT-FOUND], dnl [DESCRIPTION], [DEFAULT]) dnl ------------------------------------------ dnl dnl Prepare a "--with-" configure option using the lowercase dnl [VARIABLE-PREFIX] name, merging the behaviour of AC_ARG_WITH and dnl PKG_CHECK_MODULES in a single macro. AC_DEFUN([PKG_WITH_MODULES], [ m4_pushdef([with_arg], m4_tolower([$1])) m4_pushdef([description], [m4_default([$5], [build with ]with_arg[ support])]) m4_pushdef([def_arg], [m4_default([$6], [auto])]) m4_pushdef([def_action_if_found], [AS_TR_SH([with_]with_arg)=yes]) m4_pushdef([def_action_if_not_found], [AS_TR_SH([with_]with_arg)=no]) m4_case(def_arg, [yes],[m4_pushdef([with_without], [--without-]with_arg)], [m4_pushdef([with_without],[--with-]with_arg)]) AC_ARG_WITH(with_arg, AS_HELP_STRING(with_without, description[ @<:@default=]def_arg[@:>@]),, [AS_TR_SH([with_]with_arg)=def_arg]) AS_CASE([$AS_TR_SH([with_]with_arg)], [yes],[PKG_CHECK_MODULES([$1],[$2],$3,$4)], [auto],[PKG_CHECK_MODULES([$1],[$2], [m4_n([def_action_if_found]) $3], [m4_n([def_action_if_not_found]) $4])]) m4_popdef([with_arg]) m4_popdef([description]) m4_popdef([def_arg]) ])dnl PKG_WITH_MODULES dnl PKG_HAVE_WITH_MODULES(VARIABLE-PREFIX, MODULES, dnl [DESCRIPTION], [DEFAULT]) dnl ----------------------------------------------- dnl dnl Convenience macro to trigger AM_CONDITIONAL after PKG_WITH_MODULES dnl check._[VARIABLE-PREFIX] is exported as make variable. AC_DEFUN([PKG_HAVE_WITH_MODULES], [ PKG_WITH_MODULES([$1],[$2],,,[$3],[$4]) AM_CONDITIONAL([HAVE_][$1], [test "$AS_TR_SH([with_]m4_tolower([$1]))" = "yes"]) ])dnl PKG_HAVE_WITH_MODULES dnl PKG_HAVE_DEFINE_WITH_MODULES(VARIABLE-PREFIX, MODULES, dnl [DESCRIPTION], [DEFAULT]) dnl ------------------------------------------------------ dnl dnl Convenience macro to run AM_CONDITIONAL and AC_DEFINE after dnl PKG_WITH_MODULES check. HAVE_[VARIABLE-PREFIX] is exported as make dnl and preprocessor variable. AC_DEFUN([PKG_HAVE_DEFINE_WITH_MODULES], [ PKG_HAVE_WITH_MODULES([$1],[$2],[$3],[$4]) AS_IF([test "$AS_TR_SH([with_]m4_tolower([$1]))" = "yes"], [AC_DEFINE([HAVE_][$1], 1, [Enable ]m4_tolower([$1])[ support])]) ])dnl PKG_HAVE_DEFINE_WITH_MODULES # po.m4 serial 31 (gettext-0.20.2) dnl Copyright (C) 1995-2014, 2016, 2018-2020 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 be used in projects which are not available under dnl the GNU General Public License or the GNU Lesser 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 Lesser General Public License, and the rest of the GNU dnl gettext 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.20]) 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 `$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 Test whether it is GNU msgmerge >= 0.20. if LC_ALL=C $MSGMERGE --help | grep ' --for-msgfmt ' >/dev/null; then MSGMERGE_FOR_MSGFMT_OPTION='--for-msgfmt' else dnl Test whether it is GNU msgmerge >= 0.12. if LC_ALL=C $MSGMERGE --help | grep ' --no-fuzzy-matching ' >/dev/null; then MSGMERGE_FOR_MSGFMT_OPTION='--no-fuzzy-matching --no-location --quiet' else dnl With these old versions, $(MSGMERGE) $(MSGMERGE_FOR_MSGFMT_OPTION) is dnl slow. But this is not a big problem, as such old gettext versions are dnl hardly in use any more. MSGMERGE_FOR_MSGFMT_OPTION='--no-location --quiet' fi fi AC_SUBST([MSGMERGE_FOR_MSGFMT_OPTION]) 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"` POMAKEFILEDEPS="$POMAKEFILEDEPS LINGUAS" else # The set of available languages was given in configure.in. 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. 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-2020 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.16' 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.16.3], [], [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.16.3])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-2020 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-2020 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-2020 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 (and possibly the TAP driver). 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 The trailing newline in this macro's definition is deliberate, for dnl backward compatibility and to allow trailing 'dnl'-style comments dnl after the AM_INIT_AUTOMAKE invocation. See automake bug#16841. ]) 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-2020 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+set}" != 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-2020 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-2020 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 MISSING="\${SHELL} '$am_aux_dir/missing'" 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-2020 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-2020 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-2020 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-2020 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-2020 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-2020 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-2020 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-2020 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-6.2.0/tables.h0000644000175000017500000000445014354510761012320 00000000000000/* * Declarations for config-table & mount-table utilities for cryptmount * (C)Copyright 2005-2023, 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 _TABLES_H #define _TABLES_H /*! \addtogroup cmtab_utils * @{ */ extern const char *cm_status_filename; struct tgtdefn; /*! * Record for persistent storage of target status. * * This is used to populate entries in /run/cryptmount.status * where each target that is either mounted or active as a swap device * is listed together with the user-id of its owner. */ typedef struct tgtstat { char *ident; /*!< Unique identifying name of target */ unsigned long uid; /*!< User-ID responsible for mounting filesystem */ struct tgtstat *nx; /*!< Form into linked list */ } tgtstat_t; void init_env_dictionary(); void clear_env_dictionary(); struct tgtdefn *alloc_tgtdefn(const struct tgtdefn *prototype); const struct tgtdefn *get_tgtdefn(const struct tgtdefn *head, const char *ident); struct tgtdefn *clone_tgtdefn(const struct tgtdefn *orig); void free_tgtdefn(struct tgtdefn *tgt); struct tgtdefn *parse_config(const char *cfgname); struct tgtdefn *parse_config_fd(int fd); void free_config(struct tgtdefn **head); tgtstat_t *alloc_tgtstatus(const struct tgtdefn *tgt); tgtstat_t *get_tgtstatus(const struct tgtdefn *tgt); tgtstat_t *get_all_tgtstatus(); int put_tgtstatus(const struct tgtdefn *tgt, const tgtstat_t *tstat); void free_tgtstatus(tgtstat_t *tstat); int is_cmstatus_intact(); /** @} */ #endif /* _TABLES_H */ /* * (C)Copyright 2005-2023, RW Penney */ cryptmount-6.2.0/armour-builtin.c0000644000175000017500000003502714354510761014016 00000000000000/* * Methods for encryption/security mechanisms for cryptmount * (C)Copyright 2007-2023, 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 "config.h" #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; /*!< File-format version, default==1 since version 4.0 */ } 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-2023, RW Penney */ cryptmount-6.2.0/Makefile.in0000644000175000017500000010106114356320427012736 00000000000000# Makefile.in generated by automake 1.16.3 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2020 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 = { \ if test -z '$(MAKELEVEL)'; then \ false; \ elif test -n '$(MAKE_HOST)'; then \ true; \ elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \ true; \ else \ false; \ fi; \ } 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 = . 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) DIST_COMMON = $(srcdir)/Makefile.am $(top_srcdir)/configure \ $(am__configure_deps) $(am__DIST_COMMON) 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__maybe_remake_depfiles = 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 distdir-am 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) am__DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/config.h.in \ $(srcdir)/delegates.h.in $(srcdir)/doxygen.conf.in AUTHORS \ COPYING ChangeLog compile config.guess config.rpath config.sub \ install-sh missing mkinstalldirs 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 # Exists only to be overridden by the user if desired. AM_DISTCHECK_DVI_TARGET = dvi 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@ MSGMERGE = @MSGMERGE@ MSGMERGE_FOR_MSGFMT_OPTION = @MSGMERGE_FOR_MSGFMT_OPTION@ 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@ runstatedir = @runstatedir@ 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 \ INSTALL.md README.md README.sshfs RELNOTES cryptmount.spec \ debian/changelog 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) --foreign --ignore-deps'; \ $(am__cd) $(srcdir) && $(AUTOMAKE) --foreign --ignore-deps \ && exit 0; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign --ignore-deps Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --foreign --ignore-deps 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__maybe_remake_depfiles)'; \ cd $(top_builddir) && $(SHELL) ./config.status $@ $(am__maybe_remake_depfiles);; \ 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: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) distdir-am distdir-am: $(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) | eval GZIP= gzip $(GZIP_ENV) -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-zstd: distdir tardir=$(distdir) && $(am__tar) | zstd -c $${ZSTD_CLEVEL-$${ZSTD_OPT--19}} >$(distdir).tar.zst $(am__post_remove_distdir) dist-tarZ: 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 tardir=$(distdir) && $(am__tar) | compress -c >$(distdir).tar.Z $(am__post_remove_distdir) dist-shar: distdir @echo WARNING: "Support for shar distribution archives is" \ "deprecated." >&2 @echo WARNING: "It will be removed altogether in Automake 2.0" >&2 shar $(distdir) | eval GZIP= gzip $(GZIP_ENV) -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*) \ eval GZIP= gzip $(GZIP_ENV) -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*) \ eval GZIP= gzip $(GZIP_ENV) -dc $(distdir).shar.gz | unshar ;;\ *.zip*) \ unzip $(distdir).zip ;;\ *.tar.zst*) \ zstd -dc $(distdir).tar.zst | $(am__untar) ;;\ esac chmod -R a-w $(distdir) chmod u+w $(distdir) mkdir $(distdir)/_build $(distdir)/_build/sub $(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/sub \ && ../../configure \ $(AM_DISTCHECK_CONFIGURE_FLAGS) \ $(DISTCHECK_CONFIGURE_FLAGS) \ --srcdir=../.. --prefix="$$dc_install_base" \ && $(MAKE) $(AM_MAKEFLAGS) \ && $(MAKE) $(AM_MAKEFLAGS) $(AM_DISTCHECK_DVI_TARGET) \ && $(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 dist-zstd \ 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 .PRECIOUS: Makefile 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# or refer to ${CM_SYSCONF_DIR}/cmtab.example\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 test: cmtest cd testing && sudo ./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-6.2.0/install-sh0000755000175000017500000003577614305064554012720 00000000000000#!/bin/sh # install - install a program, script, or datafile scriptversion=2020-11-14.01; # UTC # 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. tab=' ' nl=' ' IFS=" $tab$nl" # Set DOITPROG to "echo" to test this script. doit=${DOITPROG-} doit_exec=${doit:-exec} # Put in absolute file names if you don't have them in your path; # or use environment vars. chgrpprog=${CHGRPPROG-chgrp} chmodprog=${CHMODPROG-chmod} chownprog=${CHOWNPROG-chown} cmpprog=${CMPPROG-cmp} cpprog=${CPPROG-cp} mkdirprog=${MKDIRPROG-mkdir} mvprog=${MVPROG-mv} rmprog=${RMPROG-rm} stripprog=${STRIPPROG-strip} posix_mkdir= # Desired mode of installed file. mode=0755 # Create dirs (including intermediate dirs) using mode 755. # This is like GNU 'install' as of coreutils 8.32 (2020). mkdir_umask=22 backupsuffix= chgrpcmd= chmodcmd=$chmodprog chowncmd= mvcmd=$mvprog rmcmd="$rmprog -f" stripcmd= src= dst= dir_arg= dst_arg= copy_on_change=false is_target_a_directory=possibly 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: --help display this help and exit. --version display version info and exit. -c (ignored) -C install only if different (preserve data modification time) -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. -p pass -p to $cpprog. -s $stripprog installed files. -S SUFFIX attempt to back up existing files, with suffix SUFFIX. -t DIRECTORY install into DIRECTORY. -T report an error if DSTFILE is a directory. Environment variables override the default commands: CHGRPPROG CHMODPROG CHOWNPROG CMPPROG CPPROG MKDIRPROG MVPROG RMPROG STRIPPROG By default, rm is invoked with -f; when overridden with RMPROG, it's up to you to specify -f if you want it. If -S is not specified, no backups are attempted. Email bug reports to bug-automake@gnu.org. Automake home page: https://www.gnu.org/software/automake/ " while test $# -ne 0; do case $1 in -c) ;; -C) copy_on_change=true;; -d) dir_arg=true;; -g) chgrpcmd="$chgrpprog $2" shift;; --help) echo "$usage"; exit $?;; -m) mode=$2 case $mode in *' '* | *"$tab"* | *"$nl"* | *'*'* | *'?'* | *'['*) echo "$0: invalid mode: $mode" >&2 exit 1;; esac shift;; -o) chowncmd="$chownprog $2" shift;; -p) cpprog="$cpprog -p";; -s) stripcmd=$stripprog;; -S) backupsuffix="$2" shift;; -t) is_target_a_directory=always dst_arg=$2 # Protect names problematic for 'test' and other utilities. case $dst_arg in -* | [=\(\)!]) dst_arg=./$dst_arg;; esac shift;; -T) is_target_a_directory=never;; --version) echo "$0 $scriptversion"; exit $?;; --) shift break;; -*) echo "$0: invalid option: $1" >&2 exit 1;; *) break;; esac shift done # We allow the use of options -d and -T together, by making -d # take the precedence; this is for compatibility with GNU install. if test -n "$dir_arg"; then if test -n "$dst_arg"; then echo "$0: target directory not allowed when installing a directory." >&2 exit 1 fi fi if test $# -ne 0 && test -z "$dir_arg$dst_arg"; then # When -d is used, all remaining arguments are directories to create. # When -t is used, the destination is already specified. # Otherwise, the last argument is the destination. Remove it from $@. for arg do if test -n "$dst_arg"; then # $@ is not empty: it contains at least $arg. set fnord "$@" "$dst_arg" shift # fnord fi shift # arg dst_arg=$arg # Protect names problematic for 'test' and other utilities. case $dst_arg in -* | [=\(\)!]) dst_arg=./$dst_arg;; esac done fi if test $# -eq 0; 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 if test -z "$dir_arg"; then if test $# -gt 1 || test "$is_target_a_directory" = always; then if test ! -d "$dst_arg"; then echo "$0: $dst_arg: Is not a directory." >&2 exit 1 fi fi fi if test -z "$dir_arg"; then do_exit='(exit $ret); exit $ret' trap "ret=129; $do_exit" 1 trap "ret=130; $do_exit" 2 trap "ret=141; $do_exit" 13 trap "ret=143; $do_exit" 15 # Set umask so as not to create temps with too-generous modes. # However, 'strip' requires both read and write access to temps. case $mode in # Optimize common cases. *644) cp_umask=133;; *755) cp_umask=22;; *[0-7]) if test -z "$stripcmd"; then u_plus_rw= else u_plus_rw='% 200' fi cp_umask=`expr '(' 777 - $mode % 1000 ')' $u_plus_rw`;; *) if test -z "$stripcmd"; then u_plus_rw= else u_plus_rw=,u+rw fi cp_umask=$mode$u_plus_rw;; esac fi for src do # Protect names problematic for 'test' and other utilities. case $src in -* | [=\(\)!]) src=./$src;; esac if test -n "$dir_arg"; then dst=$src dstdir=$dst test -d "$dstdir" dstdir_status=$? # Don't chown directories that already exist. if test $dstdir_status = 0; then chowncmd="" 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 "$dst_arg"; then echo "$0: no destination specified." >&2 exit 1 fi dst=$dst_arg # If destination is a directory, append the input filename. if test -d "$dst"; then if test "$is_target_a_directory" = never; then echo "$0: $dst_arg: Is a directory" >&2 exit 1 fi dstdir=$dst dstbase=`basename "$src"` case $dst in */) dst=$dst$dstbase;; *) dst=$dst/$dstbase;; esac dstdir_status=0 else dstdir=`dirname "$dst"` test -d "$dstdir" dstdir_status=$? fi fi case $dstdir in */) dstdirslash=$dstdir;; *) dstdirslash=$dstdir/;; esac obsolete_mkdir_used=false if test $dstdir_status != 0; then case $posix_mkdir in '') # With -d, create the new directory with the user-specified mode. # Otherwise, rely on $mkdir_umask. if test -n "$dir_arg"; then mkdir_mode=-m$mode else mkdir_mode= fi posix_mkdir=false # The $RANDOM variable is not portable (e.g., dash). Use it # here however when possible just to lower collision chance. tmpdir=${TMPDIR-/tmp}/ins$RANDOM-$$ trap ' ret=$? rmdir "$tmpdir/a/b" "$tmpdir/a" "$tmpdir" 2>/dev/null exit $ret ' 0 # Because "mkdir -p" follows existing symlinks and we likely work # directly in world-writeable /tmp, make sure that the '$tmpdir' # directory is successfully created first before we actually test # 'mkdir -p'. if (umask $mkdir_umask && $mkdirprog $mkdir_mode "$tmpdir" && exec $mkdirprog $mkdir_mode -p -- "$tmpdir/a/b") >/dev/null 2>&1 then if test -z "$dir_arg" || { # Check for POSIX incompatibilities with -m. # HP-UX 11.23 and IRIX 6.5 mkdir -m -p sets group- or # other-writable bit of parent directory when it shouldn't. # FreeBSD 6.1 mkdir -m -p sets mode of existing directory. test_tmpdir="$tmpdir/a" ls_ld_tmpdir=`ls -ld "$test_tmpdir"` case $ls_ld_tmpdir in d????-?r-*) different_mode=700;; d????-?--*) different_mode=755;; *) false;; esac && $mkdirprog -m$different_mode -p -- "$test_tmpdir" && { ls_ld_tmpdir_1=`ls -ld "$test_tmpdir"` test "$ls_ld_tmpdir" = "$ls_ld_tmpdir_1" } } then posix_mkdir=: fi rmdir "$tmpdir/a/b" "$tmpdir/a" "$tmpdir" else # Remove any dirs left behind by ancient mkdir implementations. rmdir ./$mkdir_mode ./-p ./-- "$tmpdir" 2>/dev/null fi trap '' 0;; esac if $posix_mkdir && ( umask $mkdir_umask && $doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir" ) then : else # mkdir does not conform to POSIX, # or it failed possibly due to a race condition. Create the # directory the slow way, step by step, checking for races as we go. case $dstdir in /*) prefix='/';; [-=\(\)!]*) prefix='./';; *) prefix='';; esac oIFS=$IFS IFS=/ set -f set fnord $dstdir shift set +f IFS=$oIFS prefixes= for d do test X"$d" = X && continue prefix=$prefix$d if test -d "$prefix"; then prefixes= else if $posix_mkdir; then (umask $mkdir_umask && $doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir") && break # Don't fail if two instances are running concurrently. test -d "$prefix" || exit 1 else case $prefix in *\'*) qprefix=`echo "$prefix" | sed "s/'/'\\\\\\\\''/g"`;; *) qprefix=$prefix;; esac prefixes="$prefixes '$qprefix'" fi fi prefix=$prefix/ done if test -n "$prefixes"; then # Don't fail if two instances are running concurrently. (umask $mkdir_umask && eval "\$doit_exec \$mkdirprog $prefixes") || test -d "$dstdir" || exit 1 obsolete_mkdir_used=true fi fi fi if test -n "$dir_arg"; then { test -z "$chowncmd" || $doit $chowncmd "$dst"; } && { test -z "$chgrpcmd" || $doit $chgrpcmd "$dst"; } && { test "$obsolete_mkdir_used$chowncmd$chgrpcmd" = false || test -z "$chmodcmd" || $doit $chmodcmd $mode "$dst"; } || exit 1 else # Make a couple of temp file names in the proper directory. dsttmp=${dstdirslash}_inst.$$_ rmtmp=${dstdirslash}_rm.$$_ # Trap to clean up those temp files at exit. trap 'ret=$?; rm -f "$dsttmp" "$rmtmp" && exit $ret' 0 # Copy the file name to the temp name. (umask $cp_umask && { test -z "$stripcmd" || { # Create $dsttmp read-write so that cp doesn't create it read-only, # which would cause strip to fail. if test -z "$doit"; then : >"$dsttmp" # No need to fork-exec 'touch'. else $doit touch "$dsttmp" fi } } && $doit_exec $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 $mode "$dsttmp"; } && # If -C, don't bother to copy if it wouldn't change the file. if $copy_on_change && old=`LC_ALL=C ls -dlL "$dst" 2>/dev/null` && new=`LC_ALL=C ls -dlL "$dsttmp" 2>/dev/null` && set -f && set X $old && old=:$2:$4:$5:$6 && set X $new && new=:$2:$4:$5:$6 && set +f && test "$old" = "$new" && $cmpprog "$dst" "$dsttmp" >/dev/null 2>&1 then rm -f "$dsttmp" else # If $backupsuffix is set, and the file being installed # already exists, attempt a backup. Don't worry if it fails, # e.g., if mv doesn't support -f. if test -n "$backupsuffix" && test -f "$dst"; then $doit $mvcmd -f "$dst" "$dst$backupsuffix" 2>/dev/null fi # Rename the file to the real destination. $doit $mvcmd -f "$dsttmp" "$dst" 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. { test ! -f "$dst" || $doit $rmcmd "$dst" 2>/dev/null || { $doit $mvcmd -f "$dst" "$rmtmp" 2>/dev/null && { $doit $rmcmd "$rmtmp" 2>/dev/null; :; } } || { echo "$0: cannot unlink or rename $dst" >&2 (exit 1); exit 1 } } && # Now rename the file to the real destination. $doit $mvcmd "$dsttmp" "$dst" } fi || exit 1 trap '' 0 fi done # Local variables: # eval: (add-hook 'before-save-hook 'time-stamp) # time-stamp-start: "scriptversion=" # time-stamp-format: "%:y-%02m-%02d.%02H" # time-stamp-time-zone: "UTC0" # time-stamp-end: "; # UTC" # End: cryptmount-6.2.0/config.rpath0000755000175000017500000003744414305046672013217 00000000000000#! /bin/sh # Output a system dependent set of variables, describing how to set the # run time search path of shared libraries in an executable. # # Copyright 1996-2006 Free Software Foundation, Inc. # Taken from GNU libtool, 2001 # Originally by Gordon Matzigkeit , 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=/' < #include #include #include #include #if HAVE_SYS_SYSMACROS_H # include #endif #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" #if !HAVE_LIBUDEV 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); #endif // !HAVE_LIBUDEV 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) || !dmi->exists) { config = 0; } if (dmt != NULL) dm_task_destroy(dmt); return config; } int udev_settle() /*! Allow time for udev events to be processed */ { double totdelay = 0.0; time_t starttime; #if HAVE_LIBUDEV struct udev *udev_ctx; struct udev_queue *udev_qu; #else struct udev_queue_loc *udev_mode; struct stat sbuff; #endif #if HAVE_NANOSLEEP struct timespec delay; #endif int inc_ms = 250, settling = 1; const double timeout = 10.0; /* 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); #else /* 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; } #endif /* Keep waiting until there are no more queued udev events: */ do { #if HAVE_NANOSLEEP delay.tv_sec = inc_ms / 1000; delay.tv_nsec = (inc_ms % 1000) * 1000 * 1000; nanosleep(&delay, NULL); #else sleep((unsigned)ceil(inc_ms * 1e-3)); #endif totdelay += inc_ms * 1e-3; inc_ms += inc_ms / 3; #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; } #if !HAVE_LIBUDEV 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) goto bail_out; 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; } } bail_out: 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; } #endif // !HAVE_LIBUDEV /* * (C)Copyright 2005-2023, RW Penney */ cryptmount-6.2.0/cmtesting.c0000644000175000017500000000555514354510761013045 00000000000000/* * Methods for unit-testing utiltities for cryptmount * (C)Copyright 2006-2023, 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 "config.h" #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-2023, RW Penney */ cryptmount-6.2.0/testing/0000755000175000017500000000000014356320433012424 500000000000000cryptmount-6.2.0/testing/passwd.fs0000644000175000017500000000100011402211766014163 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~`/dev/null for i in 0 1; do ${LOSETUP} -f "${dummy_lf}" done for lp in `${LOSETUP} -j "${dummy_lf}" -O NAME | sed '1d'`; do ${LOSETUP} -d ${lp} done rm -f "${dummy_lf}" ${LOSETUP} -l -O NAME | \ sed '1d' > ${TMPDIR}/usedLoops ls /dev/loop[0-9]* | \ grep -v -x -f ${TMPDIR}/usedLoops | \ sort -r > ${TMPDIR}/availableLoops }; function dd_sync() { ${DD} $@ sync }; function blank_mke2fs() { # Preceed mke2fs with device-prefix zeroing to avoid valid-data tests # BEWARE - this assumes we are certain we can safely reformat the given device dev_arg="${@: -1}" if [ -b "${dev_arg}" ]; then ${DD} if=/dev/zero of="${dev_arg}" bs=1M count=1 2>/dev/null mke2fs "$@" else echo "${dev_arg} is not a block device" false fi }; # # 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_sync if=/dev/urandom bs=${1}c count=1 2>/dev/null | \ openssl enc -e -pass pass:"${PASSWD}" -md $2 -${3} 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 blank_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 blank_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_sync if=/dev/zero of=${TMPDIR}/roloopfile bs=1M count=32 2>/dev/null ${LOSETUP} "${LOOPDEV2}" ${TMPDIR}/roloopfile blank_mke2fs -q "${LOOPDEV2}" mount -t ext2 "${LOOPDEV2}" ${TMPDIR}/romnt dd_sync if=/dev/zero of=${TMPDIR}/romnt/lpfl bs=1M count=16 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 blank_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 fstype=ext3 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 7< /dev/null 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_sync 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 blank_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 dd_sync if=/dev/zero of=/dev/mapper/target${idx} bs=1M count=1 2>/dev/null if blank_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 blank_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 dd_sync if=/dev/zero of=/dev/mapper/target${idx} bs=1M count=1 2>/dev/null if blank_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-ecb aes-256-cbc camellia-128-cbc; do # Beware cfb*, ofb modes seem incompatible for unknown reasons for keyhash in md5 sha1 sha256; 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 dd_sync if=/dev/zero of=/dev/mapper/target${idx} bs=1M count=1 2>/dev/null if blank_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 aes192 blowfish cast5-ecb camellia-256-xts 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 dd_sync if=/dev/zero of=/dev/mapper/target${idx} bs=1M count=1 2>/dev/null if blank_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="aes-128-cbc:md5:aes-cbc:md5 \ aes-192-ecb:sha224:aes192-ecb:sha224 \ aes-256-cbc:md5:aes256-cbc:md5 \ camellia-256-cbc:sha1:camellia256-cbc:sha1 \ des3:sha384:3des-cbc:sha384" 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 dd_sync if=/dev/zero of=/dev/mapper/target${idx} bs=1M count=1 2>/dev/null if blank_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 blank_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 blank_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 blank_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_sync if=/dev/zero of=${LOOPDEV} bs=1M count=32 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_sync 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_sync if=/dev/zero of=${LOOPDEV} bs=1M count=4 2>/dev/null ;; blank) blank_mke2fs -q ${LOOPDEV} ;; rand) dd_sync if=/dev/urandom of=${LOOPDEV} bs=1M count=4 2>/dev/null ;; data) dd_sync 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_sync 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 2>/dev/null for cipher in blowfish serpent; do for length in 16384 32768; 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_sync if=/dev/zero of=/dev/mapper/cstarget${idx} \ bs=16k count=16 2>/dev/null blank_mke2fs -q -j /dev/mapper/cstarget${idx} wait_udev cryptsetup remove cstarget${idx} 2>&3 wait_udev 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_loopdev() { # Check operation of LUKS container via loopback device if test_start "LUKS loopback"; then true; else return; fi if ${CM} --key-managers 2>/dev/null | grep -q luks; then true; else test_fail "No LUKS support"; return; fi idx=`mkrandshort` cat < ${TMPDIR}/cmtab target${idx} { keyformat=luks loop=auto dev=${TMPDIR}/loopfile dir=${TMPDIR}/mnt fstype=ext3 flags=nofsck } EOF if ${CM} --config-dir ${TMPDIR} --newpassword "${PASSWD}" --generate-key 32 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 blank_mke2fs -t ext3 -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 "${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} --password "${PASSWD}" --newpassword ${NEWPASSWD} --change-password target${idx} 1>&3 2>&3; then true; else test_fail "changing password"; return; fi 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 twofish-xts-plain64,256 serpent-cbc-essiv:sha256,96 do tupelize $CipherLen cipher len echo "config: $CipherLen" 1>&3 # Setup partition with cryptsetup-luks: TMPTGT="mudslinger-`mkrandshort`" if dd_sync if=/dev/zero of=${LOOPDEV} bs=1M 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 sync cryptsetup --key-file ${TMPDIR}/keymat0 --cipher ${cipher} --key-slot 2 luksAddKey "${LOOPDEV}" ${TMPDIR}/keymat 1>&3 2>&3 sync; wait_udev cryptsetup --key-file ${TMPDIR}/keymat luksOpen "${LOOPDEV}" "${TMPTGT}" 1>&3 2>&3 sync; wait_udev if [ ! -b /dev/mapper/${TMPTGT} ]; then test_fail "luksOpen"; return; fi if blank_mke2fs -q -j "/dev/mapper/${TMPTGT}"; then true; else test_fail mke2fs; return; fi wait_udev cryptsetup luksClose "${TMPTGT}" 2>&3 sync; wait_udev; sleep 1 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 sync; wait_udev 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 sync; 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 cipher=${cipher}-${mode} } EOF if dd_sync if=/dev/zero of=${LOOPDEV} bs=1M 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 blank_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 sync; 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 test -r /etc/debian_version && echo "Debian version: `cat /etc/debian_version`" >&3 test -r /etc/redhat-release && echo "Redhat release: `cat /etc/redhat-release`" >&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_sync if=/dev/zero of=${TMPDIR}/loopfile bs=1M count=64 2>&3 1>&2 dd_sync if=/dev/zero of=${TMPDIR}/devfile bs=1M count=64 2>&3 1>&2 listLoopDevs LOOPDEV=`sed -n '1p' "${TMPDIR}/availableLoops"` LOOPDEV2=`sed -n '2p' "${TMPDIR}/availableLoops"` if ${LOSETUP} ${LOOPDEV} ${TMPDIR}/devfile; then true; else echo "Failed to setup ${LOOPDEV}"; exit 2; fi 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_loopdev 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 \ ${TMPDIR}/usedLoops ${TMPDIR}/availableLoops rmdir ${TMPDIR}/mnt* ${TMPDIR} exit 0 # vim: set ts=4 sw=4 et: cryptmount-6.2.0/testing/Makefile.am0000644000175000017500000000120712612755121014377 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-6.2.0/testing/Makefile.in0000644000175000017500000003173014356320427014420 00000000000000# Makefile.in generated by automake 1.16.3 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2020 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 = { \ if test -z '$(MAKELEVEL)'; then \ false; \ elif test -n '$(MAKE_HOST)'; then \ true; \ elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \ true; \ else \ false; \ fi; \ } 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 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) DIST_COMMON = $(srcdir)/Makefile.am $(am__DIST_COMMON) 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__maybe_remake_depfiles = 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) am__DIST_COMMON = $(srcdir)/Makefile.in $(top_srcdir)/mkinstalldirs 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@ MSGMERGE = @MSGMERGE@ MSGMERGE_FOR_MSGFMT_OPTION = @MSGMERGE_FOR_MSGFMT_OPTION@ 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@ runstatedir = @runstatedir@ 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) --foreign --ignore-deps testing/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --foreign --ignore-deps testing/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__maybe_remake_depfiles)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles);; \ 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: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) distdir-am distdir-am: $(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 .PRECIOUS: Makefile 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-6.2.0/testing/keys/0000755000175000017500000000000014356320433013377 500000000000000cryptmount-6.2.0/testing/keys/4.0_builtin_sha1_blowfish-cbc_00000644000175000017500000000006012000461340021025 00000000000000cm-blti@öVyŸţ…vAŠŤä]ť/‘ŻÔŸźŔżÎ[Źňő¤îm 5cryptmount-6.2.0/testing/keys/3.0.2_openssl-compat_md5_blowfish_00000644000175000017500000000005011402211766021577 00000000000000Salted__úvm%ݜĽ„Xpo_L)6ľVůř8ŔNž]ęH‡cryptmount-6.2.0/testing/keys/1.1.2_openssl_md5_bf-cbc_00000644000175000017500000000005011402211766017614 00000000000000Salted__îEĽ0Aĺ‰ŔŞ †#ąCkę -ŞPc °—"c㟔cryptmount-6.2.0/testing/keys/2.0.1_openssl_md4_aes-192-cbc_00000644000175000017500000000006011402211766020305 00000000000000Salted__č|qŞç)Ă$Č0 śźť2‚x€Ryr,ćj&8?‰21˜źTńcryptmount-6.2.0/testing/keys/4.0_libgcrypt_sha256_des_00000644000175000017500000000006012000461340017743 00000000000000cm-gcry"g‡żuŤŽ%ěh0˛XŠ6>_äÖćÖ|UAGzC‡ÜŻôž„acryptmount-6.2.0/testing/keys/1.1.2_libgcrypt_sha512_cast5_00000644000175000017500000000006011402211766020352 00000000000000cm-gcryGA(ë2"ŞIRXÉŽA#ŔÔ Ký]čŞĘÉc őëzŔôŞ$M–j ­]Ź˜á´˘J^ȚB:fZcryptmount-6.2.0/testing/keys/3.1.2_libgcrypt_md5_blowfish_00000644000175000017500000000006011402211766020634 00000000000000cm-gcryX'u˘Q¸ů%ŢŮ˗˜‘2_jľšŘ4’„âąg“¸[ë kUcryptmount-6.2.0/testing/keys/3.0.2_raw_none_none_00000644000175000017500000000002011402211766017015 00000000000000cryptmount012345cryptmount-6.2.0/testing/keys/3.1.2_luks_md5_blowfish_0.hdr0000644000175000017500000020500012400360510020357 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ˇ´šŇns9ž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˛eeßŁŽ‚Ň$Ď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ŃŠ<Ǖ<Ǜ#–ˇtuŸ—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ŮNJ4,Ä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ł=}8q˝ç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%Ă> zg6Cšđ!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ŁFWK¸Ć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˙ ×§NÄł›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…@A3† ď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’g8fŠ$[ĐŹęđč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ÉfSގ„ 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=˘xsŁ{ą ό‡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đƒ<mq™âŮËg^#”ńĂ'¸Qk¨Ý¤é¤Đý\ֆ{î!ˇŤÉšk}Ąüş3ÉUŞĆUP+iÍfށIşäfbŤrbžZL“X41ʐ ¨oűÁ?ӎí¸cđp$GÓ(Ęśws5¨SÄÉ]G–U/r|‰2üA aEƒ_9'ľ.ŢŢşşăă˛óq䇮óMŕš(˙Ůťˆ¤§k(ÚeëăNwź_C˘zFŚĆÜ/Ö´ÝřđÂ$Ĺ5ż‹źTcHĄa=ű3Ź#wá-Y_D>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őý4Jwœ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~ă؏ •QCEŔű"üŔĆ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`’ۍĎ[ÂĎďÄ\?ĺqOS!Ő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 ÄłšYa٨űôĽ1sfZ†X0@…Đżś­Šęœň šˇ\2Ö^[‰ŽćŮΎsýĚ_ů˛#RţŤ×—nÁ…MAD )mxá˜0–=Ű ź9‰ĚZˆľE5ˆ)Nţńęvę÷}ä›mŻČ,ńQg&řD˜ŁQ„äŔ*„FFÉŚbţ_ Ž š¤io SŠ–_8Wg×ߒč?Eœ„Í,ťŽvłrĽD›šz‰Qh;Kď ĆŮíY րGĘöYďžG‘Đó`Ľ€o%̈ ŹŢ8J;Ć0Ő2=ŽY(%rÝPVŞő0„fIö5t§]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î7bf:­€';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,Ďý#ĂÁ@ß_zf“ď W~끐čŠD:ś!fvIű(€ľ4ÚG›xšŰ؂cK9Œ“ÝXcčš[v­ůV%˙[~­?–éiUĽ”˘´ý–.dśmLŽdűşfžbśZ´ŐŞnCLľŃ)-řßMnó6…(UŒĂţöč>sA;űď|&¸űPL­‘VŹéËůÇp>´›]3ôDžŮxbóIaMΌ9ÁŮG FŠT˝ńo&KZę—{iës‡zŸcUKó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ɶđˆŤnGQ0c$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ôé贒âӁxu„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ĹĽsNj!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(úĹŰ6yÇ~éň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ĺ§íÎřĘHX”¤Â[éů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ą39o8noŠÔüËëô•Ő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Ř+'f8RMÎÉĄ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ˆrtrLsł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#ő¸:ĎńťŻí|Œ Ç˘'"‘@ö6gII€}˝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ź7tK4VÄÎ(ľ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č¤kajVţS•I§ćą§ š9|-ƒ/!ßšÚ0Bž×gČ­İ@Ěü¨Z ůŤbp2Ŕ™‰N?ŃĄ‚„m§n!Ď|˛„řđ?á>!]ňäË+x Ż9Ď4“•ÓB6“š˜r旚> \ţő,sxy˙ŏ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š™É}plźé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Á×/˜Şą’ÓHVn5M9Šś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ĎŚUBÄ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Œî˛‰LEË$ꍏ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ţÓdk;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˜CbFm5ôŚ/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بtt,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Ţ4a”7żóœVţ¤c5ĽA:Ľk ŠţŸŁ]1ߌ˛ €ßěR7ŘŚJ8Üă^ˆ§cŹŕˀQË9Ť–Yq뒅S´_÷zeo˙őJR '1|ŹŠ˝Ź"Ů9šđ/[ÝCOA˙Ň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ĎŢĺóqBnF’ĚĎ~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ňBAmSń|$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ˇQgrž#—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“bSúŒŢ”šÉjůŻD´iyŚU,8tjĹľ.ÍncôŽG%ě57€3pÝJ݉YŚdEp”B9;2uŠ´|ęœ„8Ÿ’+葛yfˇ™LfÝőÁL'@Decú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¸î•(ŻzG+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=)+"čmxÝÚß˝܅͗ŰӘ´(Đťźv"nŢ_‚‘=h"GyůŰßšw$ˆ¤‘¨ë™gPEÝÇ|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Óý™§mUI˛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đ3oŰŢ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Ɂ<ˆŹü( Ť­á*DwǞ§-}ąÎđĂ*€[aĘ㠛Żńć2¸ŠËťÚ:+0Řź“p7§žqzÇĚ_’Žî݁,ś ĽpÎ Œ“/œP˙"˛mHrwgľö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ˆúPOÉ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"•“1sö‹ţ¨Ţ-şç´ŒŮć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´*őHUDŽż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.$ń˜Đ-JOŰč´`>|™M&řuĆĚŽ˝ób˙°vr§áýőĹ**ôłí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_ż!ÂŇîdPGT¨Ň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–™éŔůę<]žžý°ł|JFF—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‘NJ%mc8 Q@ Núŕ!ƒŽ|ˇ%ƒ| pg¨âxŁŻÍ"AoT˝,˝Ůa*ć0âż×S6ń“&řňĎŹŐĐ Żł÷ĺű݆˘“řĘn)i0qâ@Ž­‰hF:i>ŐZF™•ŞFZúW­/{ŕiůSĎSpLŻŞ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ƒ€3to⊄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Ť4Dmý€ˇđXŁ ąk#{żOŽ•ÉŔę–O/QŒFíO`Â"Ńmž‹0sá‹@ ž ¤ëÜ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ź×ľ-SdWo˜–,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Ń]RL~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”ˇ‰Ľ,řfnjЧébAéšÓžĺBˆŢÝpnž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ÍćŢ0UřĽ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•ç”r3Š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Č xsh@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ąýź´ú™‘- {šě;hQcÓ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_VdFÔřˆ!"đ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&Œă1kôŠÇ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"¤ud’€„ł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Ë׎‘úŘEG^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-6.2.0/testing/keys/2.0.1_raw_none_none_00000644000175000017500000000002011402211766017013 00000000000000cryptmount012345cryptmount-6.2.0/testing/keys/1.1.2_raw_none_none_00000644000175000017500000000002011402211766017014 00000000000000cryptmount012345cryptmount-6.2.0/testing/keys/2.0.1_libgcrypt_ripemd160_twofish_00000644000175000017500000000007011402211766021522 00000000000000cm-gcrySľ&Ĥ $ٟ¸ę,eXƒˇŮ*$oÍůŚ&s2LŁĐ"jÜEˆżě?ˇ&b ă+cryptmount-6.2.0/testing/keys/3.1.2_builtin_sha1_blowfish-cbc_00000644000175000017500000000005411402211766021202 00000000000000cm-bltiW<Ř1{ă4˛“ĚDyccç˛*o奏ç2SLç5wFăžcryptmount-6.2.0/testing/keys/4.1_luks_ripemd160_twofish_0.hdr0000644000175000017500000041000012400360510021106 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;›™ş/Ž‹š˛ÇßŃť´™]íĘçPtqW†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čŔŮ“ë!íŢ̡Ücdił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=Ě]-ҙ×úrohQó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ú>Œ‡9dRÍĹ&Ё@\äŠ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Ë]ŚXÇąCňŽ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Ł4Yß˜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ʈšGMDž°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†#ő@™ĚjIrNj Šőt"[§Ľ/C†Rš‘kq˛j‹1Jч§Ň&§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:EOĂ&ŚĚIIPÎćck&$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 BS 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Ş5gÍ3.Ü-tÂÁLɃH]3éh'.Đ@dp%´u:ApË"kšŕáą-ĂFCÇDtže’ţĚW"=Ef#iáŐ.%ŽÝƒÓΘ$„+´tď.ĚИD".@€*ýw§¨8ƞ8§Ş((cŽřŔ\ îSŐ)3@-Bnj‰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ŻŹtnǏłŹ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 ÇłRŢľ“|ůě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ŐŤdNJé]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ŽéˇL8č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Ą^čŠ%œťš1MJގĄ<đýÈ\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ňŒa9LÖ¸dHˇ lŢž …ĚŠäkţ‘Šł9ćşłţŹéƍŕnj‹ľt›C™ žÇđó"Á‡éWfŮ*€ ś=>ښŔRď˘gśĄ!ˆ˝ŻłŢ% WAľů@ Ş}ľr˛-RGç€řŮ`fá3Ńâ(C$ Ťr(Çä„ëć îČőJĺ3xĄU™”˛:Ś=)F ‰ąPš 86BŁYĆOÝ čnęůšÜ”`˛âN÷S4p[{Ó Š0ÖWŕ“g‡ Žž upƒˆœs‰\ĄlÁłS˘ń&ĐܹNJÄj…ƒĆŇalŃ)št›(ŇĹע Ń]˝­+:ű§ýÖz××ţË05ŞőŮÇŞ."ŁĄř@4ZĂhË{ęÖ„äפ 'ôĽY ×.÷÷ĹÚŞÔ&ÖňĹ5[šöáY7Z†h´Ý bOţéÖ ů0C˝ $™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”Š÷°żô&ş6Włœ Š ’!ĚIDH¸ŰӀ¸I˘¸ó€Çƒ"nÝř§ŒăuѐëáÚÜÍ.‹{Đłü˝!ĐńćMœ4;䫛ËúáZ}>Q[şĄ~ë5œm kYR÷”ŮÓ${ĄŤY$n\űÍŚHž}6ťÄ?ăŘíˆ *Żęb-žřěD†‹•ŰCąŒďD#gCß:˜ Ţ*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âĄçżbUoÆgĺŐ˘+ëB–§Ijb Ę1mgĚś×ůn˜Žü’І´{#”‹rÍy8SĚjGEÚ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‰ç; hIHâ›Ř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ő˝0u>ę}ϸԡ â¸ŕĺ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đőƒ(¨$ąŕ녕" x7Ť]°'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+Ž­ëË%ăý›ô‰&—gcőĺÚ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‘mNšş 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›FUIˆÁÇŔá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ä)ŘCcC3m´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 ŐŃá™%ӇšDyi͙~ý/ł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 ˆQYË;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óĘ!θ"÷Z3|Ýäʝͨ™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žŻ Ž!nj€~ÎĂ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‚–Z3kÚŞÄéËżÓĎâ–Ń š'˛ƒ†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łń̤&zK<´¸÷䉂Œ@Đ. 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}šĎ!KKrő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Łńë*kAA<+ß÷§ěJűż‚Ĺž5”[žáoźG \ŽoԸ璜vsƒ{Ŕ×Đ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}fVF ˘˛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:őŻTG=÷„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čŇâ€ĎáÚ>tn[÷-•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äueԉÓ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’€!˝jB[˝™ěš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¸+‚ŮäieӖJč9QŘ$9očŽBżçÜČŠ˘œLyZĚ#ŘťăË\‰ß€[m‰8|˙Ԇ‚sDžů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Ćż^†ŹĂ+DdDŤňťŞŞ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´&VhyWkˆ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š˛Žąâćš؂áND|$͚ë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ŕʅ.lgx_áÁ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]Äřé"RsҢ–î˛Ŕ^˘”׿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Ů}+ŽËľĄÎLWfvZz 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ýŠ “PzRTHX‰­ Ô[,§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˜Oz|ÝĚóĽ\8°xĄĂŚĹݟ(”T“zЏ™u F^—xkĺәQ‘˝œÓF=Mu?ŇŁS#×b€=ŕó‘n´†MМű™¤ĎÍöÄ7÷Čúl2$sĎÍŁz*I‹ží8Œ …c/SŇ{üŸaIfg\ŮčǑ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?Ţ Ę>TgvĐ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%O2‰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†bbÖ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.ŁdfŠĽ;´ntř˝bÖĽ?י ⣹N <Âi“RjÍsĐJQľ3y×đżĘ öďĹf¸"ŃČ9‰X8É=&ľźş ń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đîăŁÁq75ҖÇ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ŤÄچ°Ŕ]KE (ˆ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~ëę‘ YCYfF‚ #,Ţ<‰Ý$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ăëR0D‰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ÎbF4¸€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§Ů|wk7wN…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ťôƒťBnj.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ŒŤU5iՍů¸Ň­´ůFŚŘšŢGlFDRéĹžœę…: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ă _rDWć™ĺ:;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œ“Ôüٰßô…ńýDŽŮ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 RcŽ ˘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‚úŸ> •Ů0td;&Ę˝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ć×ZR ]Ę'ŕ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\Ţ'Cg/˙¸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ŁÔ0q,ę Ň-<Ś’ 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´"{Ŕxm2°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*.ŁĚ× ztOt.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‘@.IcyG­/ˇĹC âא7o#dWÚcł’/Č#„CçU˜ćK BáňČ Ş2ÔĽt™$Ňuö10\) YWhÖGÝMźshHa„ •›áehfƒ+éôyFźŻ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ževňŽ—‡Ňţ”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…kxľśă 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 Ú~†ńŘǸ —ôĺSBkatľ<ÓŠ­Ěă†ă%ş—‹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“şđP1cZD•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 żŃ30 €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Ëňḿ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Ł=œ°„6mVŃţ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|5bxU‰ýÖć‚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ÚPooĄ˝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˝MA°–čŒŤ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 ÷‘Ă)6OdŠôů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ÄŠë>KPx¨ăąŐŸÄő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 ç:­54Ůß[}€˝ű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…„Ž­îËŞ"łßŐÄb2E 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÷ő&[ƒŰ[;ä€scĄ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Ś€úBtż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ɐËZOaťçY +"2Čçč˘ŸÁ˝—I{ĄßhĎRłÜč‰<˜6Ď×Ă}x1†łKF?0gUţwUńočTä˙/xä>ôžE„ŕŹöĘóWKzJáﺉ¨`ö:â‚ڜŘ ĺł¨š?˙Ĺ~I=z ąŻA69ŽŠVC's&~/çČó­ą/ťw X4ŹySِ4íö#čW×?Ykš{Ë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?ˆ-–çbeú>z›Âjnü`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¤Ď^^­{ÖĐfR#˙)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›¨űЈÜEVNîÖu5ÍđpŘşŞŕ„†ĎuˇŠĐ@rýĆ vę~’C‘č"ÜFdć!Oň–ËuGŹŽ˙çţy‚3ӊ• *b=­Q0ô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´&CeDlřŃދ[Łí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óPtü([mĺŠnΤڿĹ@Ă aWhű'~’#:ÖŔ Jh‚Š`‚1ŞĂ0 E2–ă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–ŠŔâŰÜťnc,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ޞ’‰UP1tlýČÉĆŤ‹Ę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,ÍŮVw§€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Đ0CŠ‚ĎݲŠŠß\›Ü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—”M9Şš+‚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š)ŸĎ„Ü*ÓkXWĐ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Űu5]Qă?^ŃýßÂ4‚Ł>‚ćo•;ËŔPxŮî ŠžĎż MsŤ†ť?Ć#LłH uÉéĐWGI~ďľA9Šě9ďÝ%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%QÄłTÁ*¸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&sR+ŮĄ:`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ŽđMXk[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‡^˙KZÓÂâ›ÇŁ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ů7KlŔ˘$]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ü4L~Š•őT[ÝÔUpJ´(Cg04ś|י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ˆŐp9H&\Ň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§)…wYüÔ]Ë˝ňœŮ:Č<9/ȝ@/Ű ŹÜ[ń{l4ŒRaKdáZ~\‹°FÖ$čî°V śë‹t ďďˇy‹‹´N#ÖNjľ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ë˙Ü)=žsw×*Âb荚(ŁŠ‚n`|WŻ­Ţ­>Ű˘@+ŰěńÖ÷™¸`MPE&^żÎřĆmwqG|łĄ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˘[6Ib70•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Á<ŘsdbEX2ý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ě Ç+Rhčü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âaGtő)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$$’7Hhý#ƒ—ť„‰^ਪ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.vw٠閴Äßč/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)Ć"€Ů,Çą˝Ŕ™žG˜N)Yů¤É dA´˛nˇ(álӄ1ŰS§ˆ0A”ďëŻBňČ"‡Ź;ĺżHƒŽ”7o ř,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óŤzjƒ~=Ś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ý$üňěů€ZK{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Ě돕Ďőnjef‘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ŸTrX­}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ä cGëôŁ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‘0WýŽ ńUəeČűٍaÁ8B<ú"Œ7™’ÍĂçzÓ@4Ur÷ŻŮ'tvćó%żtm!´ćý‹ĘĂĎÜMü¸…˛ŽĹ?ÁĎ@ŒâdD˙€Ł2`.›čs3Oŕ?2s¤ úÓňT~ó@œ‡¨ c¨FşJ=ś÷ó0M€”"áŮŇ7RPčŚcTᏡ†‘q`ýWMhŽńÔ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âDžŻ}éŢ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šbjo…× ę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ŚâěYEĄ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)ˇ4BNÍÓé’Ů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ţ´ ‡ŒĽeA§^Œ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žËüŰHrBł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;Ž:šjcjŔ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˘š‚:zaV˜šŠâ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şôžĐXxl ďŔ€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ő+˙ŁRs9đŮ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ďœćB2{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Κ”ľľLcLď{Ú"¨Ł{;#„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ßnfˇ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ĎĆĘü…)Pi™ľń}‰ 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éÇł‘jËKz]a’˘÷ÚóŢşŘOÔďŒrć‹KˇQ4xŤĐŹ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Ő›D4fHd^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ý20š‹¸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!ŕľłç†To>űěuOćvIÜßŖ*”.${y˝×ŒĄÍ˛BoÜ{"˜ƒ…ëÚg8‰&¤=¨†yp›IS´Đ/ă+Ůqh–S8¤îi”Ófs=Üö` ű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-6.2.0/testing/keys/3.1.2_openssl-compat_md5_blowfish_00000644000175000017500000000005011402211766021600 00000000000000Salted__Žď…Ţ…ö„fK_ćżş-A9ś‰ţ$VIuőv+qPcryptmount-6.2.0/testing/keys/3.1.2_raw_none_none_00000644000175000017500000000002011402211766017016 00000000000000cryptmount012345cryptmount-6.2.0/testing/keys/1.1.2_openssl_rmd160_aes256_00000644000175000017500000000006011402211766020032 00000000000000Salted__,Ôżř|}? ćăÖÇŢ „{L0 č3I˝bÜ:˛|äg¤˝xšcryptmount-6.2.0/testing/keys/4.0_openssl-compat_md4_cast_00000644000175000017500000000005012000461340020542 00000000000000Salted__6rs4ŠŔo‚•ʰëgŢŻéčËJwv+-˛őĂ[͟âcryptmount-6.2.0/testing/keys/2.0.1_builtin_sha1_blowfish-cbc_00000644000175000017500000000005411402211766021177 00000000000000cm-bltićő8&†2L)F$lrw˙ݐˇ…÷?+㳝ßNjŰcryptmount-6.2.0/testing/keys/2.0.1_libgcrypt_md5_blowfish_00000644000175000017500000000006011402211766020631 00000000000000cm-gcry°gíŘľ­>Œ“z@RPZúpśŠ ´ŘMJއÇZü¤Ĺcryptmount-6.2.0/testing/keys/1.1.2_libgcrypt_md5_blowfish_00000644000175000017500000000006011402211766020632 00000000000000cm-gcryeŹĐč +8XŇǙŚ›íŤ;ŢôÁ-Î*kü€˝aR’ß\].cryptmount-6.2.0/testing/keys/3.0.2_builtin_sha1_blowfish-cbc_00000644000175000017500000000005411402211766021201 00000000000000cm-blti‘NęçA‰6mŠ\LňfďÁľ7ŚŇă0 šŔÖQ ™AMqcryptmount-6.2.0/testing/keys/3.0.2_libgcrypt_md5_blowfish_00000644000175000017500000000006011402211766020633 00000000000000cm-gcryšW5˛ňŚW%Ćkœâ‡ç|cU @ŔV^&´]mô Ů˸cryptmount-6.2.0/delegates.h.in0000644000175000017500000000371214354510761013410 00000000000000/* * Delegation-related declations for cryptmount * (C)Copyright 2006-2023, 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-2023, RW Penney */ cryptmount-6.2.0/armour.c0000644000175000017500000005465014354510761012355 00000000000000/* * Methods for encryption/security mechanisms for cryptmount * (C)Copyright 2005-2023, 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 "config.h" #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); if (fp_key != NULL) { int fd = fileno(fp_key); #if HAVE_SYNCFS syncfs(fd); #else fsync(fd); #endif } 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 eflag=ERR_BADMUTEX; #if HAVE_NANOSLEEP int delay_ms; unsigned dither = ((size_t)&fname % 250) + 1; struct timespec delay; #endif const unsigned MAX_ATTEMPTS = 10; (void)cm_path(&fname, CM_SYSRUN_PFX, cm_lock_filename); snprintf(ident, sizeof(ident), "%u-%u", (unsigned)getpid(), (unsigned)getuid()); for (unsigned attempt=0; attempt. # # # 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.uk about your system, including any $0: error possibly output before this message. Then install $0: a modern shell, or manually run the script under such a $0: 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='6.2.0' PACKAGE_STRING='cryptmount 6.2.0' PACKAGE_BUGREPORT='cryptmount@rwpenney.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_FOR_MSGFMT_OPTION MSGMERGE XGETTEXT_015 XGETTEXT GMSGFMT_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 runstatedir 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' runstatedir='${localstatedir}/run' 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 ;; -runstatedir | --runstatedir | --runstatedi | --runstated \ | --runstate | --runstat | --runsta | --runst | --runs \ | --run | --ru | --r) ac_prev=runstatedir ;; -runstatedir=* | --runstatedir=* | --runstatedi=* | --runstated=* \ | --runstate=* | --runstat=* | --runsta=* | --runst=* | --runs=* \ | --run=* | --ru=* | --r=*) runstatedir=$ac_optarg ;; -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 runstatedir 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 6.2.0 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] --runstatedir=DIR modifiable per-process data [LOCALSTATEDIR/run] --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 6.2.0:";; 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 use libudev for /dev events (default is YES) --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 6.2.0 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.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 6.2.0, 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 test "$sysconfdir" = '${prefix}/etc' && sysconfdir=/etc 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.16' 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 MISSING="\${SHELL} '$am_aux_dir/missing'" 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+set}" != 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='6.2.0' 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 (and possibly the TAP driver). 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 sys/sysmacros.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 syncfs 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="yes" 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.20 # 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 `$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 if LC_ALL=C $MSGMERGE --help | grep ' --for-msgfmt ' >/dev/null; then MSGMERGE_FOR_MSGFMT_OPTION='--for-msgfmt' else if LC_ALL=C $MSGMERGE --help | grep ' --no-fuzzy-matching ' >/dev/null; then MSGMERGE_FOR_MSGFMT_OPTION='--no-fuzzy-matching --no-location --quiet' else MSGMERGE_FOR_MSGFMT_OPTION='--no-location --quiet' fi fi 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 if test -n "$LD"; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ld" >&5 $as_echo_n "checking for ld... " >&6; } elif test "$GCC" = yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ld used by $CC" >&5 $as_echo_n "checking for ld used by $CC... " >&6; } 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 test -n "$LD"; then # Let the user override the test with a path. : else if ${acl_cv_path_LD+:} false; then : $as_echo_n "(cached) " >&6 else acl_cv_path_LD= # Final result of this test ac_prog=ld # Program to search in $PATH if test "$GCC" = yes; then # Check if gcc -print-prog-name=ld gives a path. case $host in *-*-mingw*) # gcc leaves a trailing carriage return which upsets mingw acl_output=`($CC -print-prog-name=ld) 2>&5 | tr -d '\015'` ;; *) acl_output=`($CC -print-prog-name=ld) 2>&5` ;; esac case $acl_output in # Accept absolute paths. [\\/]* | ?:[\\/]*) re_direlt='/[^/][^/]*/\.\./' # Canonicalize the pathname of ld acl_output=`echo "$acl_output" | sed 's%\\\\%/%g'` while echo "$acl_output" | grep "$re_direlt" > /dev/null 2>&1; do acl_output=`echo $acl_output | sed "s%$re_direlt%/%"` done # Got the pathname. No search in PATH is needed. acl_cv_path_LD="$acl_output" ac_prog= ;; "") # If it fails, then pretend we aren't using GCC. ;; *) # If it is relative, then search for the first ld in PATH. with_gnu_ld=unknown ;; esac fi if test -n "$ac_prog"; then # Search for $ac_prog in $PATH. 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 conftest.$ac_ext /* end confdefs.h. */ #if defined __powerpc64__ || defined _ARCH_PPC64 int ok; #else error fail #endif _ACEOF if ac_fn_c_try_compile "$LINENO"; then : # The compiler produces 64-bit code. Add option '-b64' so that the # linker groks 64-bit object files. case "$acl_cv_path_LD " in *" -b64 "*) ;; *) acl_cv_path_LD="$acl_cv_path_LD -b64" ;; esac fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ;; sparc64-*-netbsd*) cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #if defined __sparcv9 || defined __arch64__ int ok; #else error fail #endif _ACEOF if ac_fn_c_try_compile "$LINENO"; then : else # The compiler produces 32-bit code. Add option '-m elf32_sparc' # so that the linker groks 32-bit object files. case "$acl_cv_path_LD " in *" -m elf32_sparc "*) ;; *) acl_cv_path_LD="$acl_cv_path_LD -m elf32_sparc" ;; esac fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ;; esac fi LD="$acl_cv_path_LD" fi if test -n "$LD"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $LD" >&5 $as_echo "$LD" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } as_fn_error $? "no acceptable ld found in \$PATH" "$LINENO" 5 fi { $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 { $as_echo "$as_me:${as_lineno-$LINENO}: checking 32-bit host C ABI" >&5 $as_echo_n "checking 32-bit host C ABI... " >&6; } if ${gl_cv_host_cpu_c_abi_32bit+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$gl_cv_host_cpu_c_abi"; then case "$gl_cv_host_cpu_c_abi" in i386 | x86_64-x32 | arm | armhf | arm64-ilp32 | hppa | ia64-ilp32 | mips | mipsn32 | powerpc | riscv*-ilp32* | s390 | sparc) gl_cv_host_cpu_c_abi_32bit=yes ;; x86_64 | alpha | arm64 | hppa64 | ia64 | mips64 | powerpc64 | powerpc64-elfv2 | riscv*-lp64* | s390x | sparc64 ) gl_cv_host_cpu_c_abi_32bit=no ;; *) gl_cv_host_cpu_c_abi_32bit=unknown ;; esac else case "$host_cpu" in # CPUs that only support a 32-bit ABI. arc \ | bfin \ | cris* \ | csky \ | epiphany \ | ft32 \ | h8300 \ | m68k \ | microblaze | microblazeel \ | nds32 | nds32le | nds32be \ | nios2 | nios2eb | nios2el \ | or1k* \ | or32 \ | sh | sh1234 | sh1234elb \ | tic6x \ | xtensa* ) gl_cv_host_cpu_c_abi_32bit=yes ;; # CPUs that only support a 64-bit ABI. alpha | alphaev[4-8] | alphaev56 | alphapca5[67] | alphaev6[78] \ | mmix ) gl_cv_host_cpu_c_abi_32bit=no ;; i[34567]86 ) gl_cv_host_cpu_c_abi_32bit=yes ;; x86_64 ) # On x86_64 systems, the C compiler may be generating code in one of # these ABIs: # - 64-bit instruction set, 64-bit pointers, 64-bit 'long': x86_64. # - 64-bit instruction set, 64-bit pointers, 32-bit 'long': x86_64 # with native Windows (mingw, MSVC). # - 64-bit instruction set, 32-bit pointers, 32-bit 'long': x86_64-x32. # - 32-bit instruction set, 32-bit pointers, 32-bit 'long': i386. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #if (defined __x86_64__ || defined __amd64__ \ || defined _M_X64 || defined _M_AMD64) \ && !(defined __ILP32__ || defined _ILP32) int ok; #else error fail #endif _ACEOF if ac_fn_c_try_compile "$LINENO"; then : gl_cv_host_cpu_c_abi_32bit=no else gl_cv_host_cpu_c_abi_32bit=yes fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ;; arm* | aarch64 ) # Assume arm with EABI. # On arm64 systems, the C compiler may be generating code in one of # these ABIs: # - aarch64 instruction set, 64-bit pointers, 64-bit 'long': arm64. # - aarch64 instruction set, 32-bit pointers, 32-bit 'long': arm64-ilp32. # - 32-bit instruction set, 32-bit pointers, 32-bit 'long': arm or armhf. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #if defined __aarch64__ && !(defined __ILP32__ || defined _ILP32) int ok; #else error fail #endif _ACEOF if ac_fn_c_try_compile "$LINENO"; then : gl_cv_host_cpu_c_abi_32bit=no else gl_cv_host_cpu_c_abi_32bit=yes fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ;; hppa1.0 | hppa1.1 | hppa2.0* | hppa64 ) # On hppa, the C compiler may be generating 32-bit code or 64-bit # code. In the latter case, it defines _LP64 and __LP64__. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #ifdef __LP64__ int ok; #else error fail #endif _ACEOF if ac_fn_c_try_compile "$LINENO"; then : gl_cv_host_cpu_c_abi_32bit=no else gl_cv_host_cpu_c_abi_32bit=yes fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ;; ia64* ) # On ia64 on HP-UX, the C compiler may be generating 64-bit code or # 32-bit code. In the latter case, it defines _ILP32. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #ifdef _ILP32 int ok; #else error fail #endif _ACEOF if ac_fn_c_try_compile "$LINENO"; then : gl_cv_host_cpu_c_abi_32bit=yes else gl_cv_host_cpu_c_abi_32bit=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ;; mips* ) # We should also check for (_MIPS_SZPTR == 64), but gcc keeps this # at 32. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #if defined _MIPS_SZLONG && (_MIPS_SZLONG == 64) int ok; #else error fail #endif _ACEOF if ac_fn_c_try_compile "$LINENO"; then : gl_cv_host_cpu_c_abi_32bit=no else gl_cv_host_cpu_c_abi_32bit=yes fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ;; powerpc* ) # Different ABIs are in use on AIX vs. Mac OS X vs. Linux,*BSD. # No need to distinguish them here; the caller may distinguish # them based on the OS. # On powerpc64 systems, the C compiler may still be generating # 32-bit code. And on powerpc-ibm-aix systems, the C compiler may # be generating 64-bit code. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #if defined __powerpc64__ || defined _ARCH_PPC64 int ok; #else error fail #endif _ACEOF if ac_fn_c_try_compile "$LINENO"; then : gl_cv_host_cpu_c_abi_32bit=no else gl_cv_host_cpu_c_abi_32bit=yes fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ;; rs6000 ) gl_cv_host_cpu_c_abi_32bit=yes ;; riscv32 | riscv64 ) # There are 6 ABIs: ilp32, ilp32f, ilp32d, lp64, lp64f, lp64d. # Size of 'long' and 'void *': cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #if defined __LP64__ int ok; #else error fail #endif _ACEOF if ac_fn_c_try_compile "$LINENO"; then : gl_cv_host_cpu_c_abi_32bit=no else gl_cv_host_cpu_c_abi_32bit=yes fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ;; s390* ) # On s390x, the C compiler may be generating 64-bit (= s390x) code # or 31-bit (= s390) code. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #if defined __LP64__ || defined __s390x__ int ok; #else error fail #endif _ACEOF if ac_fn_c_try_compile "$LINENO"; then : gl_cv_host_cpu_c_abi_32bit=no else gl_cv_host_cpu_c_abi_32bit=yes fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ;; sparc | sparc64 ) # UltraSPARCs running Linux have `uname -m` = "sparc64", but the # C compiler still generates 32-bit code. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #if defined __sparcv9 || defined __arch64__ int ok; #else error fail #endif _ACEOF if ac_fn_c_try_compile "$LINENO"; then : gl_cv_host_cpu_c_abi_32bit=no else gl_cv_host_cpu_c_abi_32bit=yes fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ;; *) gl_cv_host_cpu_c_abi_32bit=unknown ;; esac fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_host_cpu_c_abi_32bit" >&5 $as_echo "$gl_cv_host_cpu_c_abi_32bit" >&6; } HOST_CPU_C_ABI_32BIT="$gl_cv_host_cpu_c_abi_32bit" { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ELF binary format" >&5 $as_echo_n "checking for ELF binary format... " >&6; } if ${gl_cv_elf+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #ifdef __ELF__ Extensible Linking Format #endif _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | $EGREP "Extensible Linking Format" >/dev/null 2>&1; then : gl_cv_elf=yes else gl_cv_elf=no fi rm -f conftest* fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_elf" >&5 $as_echo "$gl_cv_elf" >&6; } if test $gl_cv_elf; then # Extract the ELF class of a file (5th byte) in decimal. # Cf. https://en.wikipedia.org/wiki/Executable_and_Linkable_Format#File_header if od -A x < /dev/null >/dev/null 2>/dev/null; then # Use POSIX od. func_elfclass () { od -A n -t d1 -j 4 -N 1 } else # Use BSD hexdump. func_elfclass () { dd bs=1 count=1 skip=4 2>/dev/null | hexdump -e '1/1 "%3d "' echo } fi case $HOST_CPU_C_ABI_32BIT in yes) # 32-bit ABI. acl_is_expected_elfclass () { test "`func_elfclass | sed -e 's/[ ]//g'`" = 1 } ;; no) # 64-bit ABI. acl_is_expected_elfclass () { test "`func_elfclass | sed -e 's/[ ]//g'`" = 2 } ;; *) # Unknown. acl_is_expected_elfclass () { : } ;; esac else acl_is_expected_elfclass () { : } fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for the common suffixes of directories in the library search path" >&5 $as_echo_n "checking for the common suffixes of directories in the library search path... " >&6; } if ${acl_cv_libdirstems+:} false; then : $as_echo_n "(cached) " >&6 else acl_libdirstem=lib acl_libdirstem2= acl_libdirstem3= case "$host_os" in solaris*) if test $HOST_CPU_C_ABI_32BIT = no; then acl_libdirstem2=lib/64 case "$host_cpu" in sparc*) acl_libdirstem3=lib/sparcv9 ;; i*86 | x86_64) acl_libdirstem3=lib/amd64 ;; esac fi ;; *) searchpath=`(LC_ALL=C $CC $CPPFLAGS $CFLAGS -print-search-dirs) 2>/dev/null \ | sed -n -e 's,^libraries: ,,p' | sed -e 's,^=,,'` if test $HOST_CPU_C_ABI_32BIT != no; then # 32-bit or unknown ABI. if test -d /usr/lib32; then acl_libdirstem2=lib32 fi fi if test $HOST_CPU_C_ABI_32BIT != yes; then # 64-bit or unknown ABI. if test -d /usr/lib64; then acl_libdirstem3=lib64 fi fi if test -n "$searchpath"; then acl_save_IFS="${IFS= }"; IFS=":" for searchdir in $searchpath; do if test -d "$searchdir"; then case "$searchdir" in */lib32/ | */lib32 ) acl_libdirstem2=lib32 ;; */lib64/ | */lib64 ) acl_libdirstem3=lib64 ;; */../ | */.. ) # Better ignore directories of this form. They are misleading. ;; *) searchdir=`cd "$searchdir" && pwd` case "$searchdir" in */lib32 ) acl_libdirstem2=lib32 ;; */lib64 ) acl_libdirstem3=lib64 ;; esac ;; esac fi done IFS="$acl_save_IFS" if test $HOST_CPU_C_ABI_32BIT = yes; then # 32-bit ABI. acl_libdirstem3= fi if test $HOST_CPU_C_ABI_32BIT = no; then # 64-bit ABI. acl_libdirstem2= fi fi ;; esac test -n "$acl_libdirstem2" || acl_libdirstem2="$acl_libdirstem" test -n "$acl_libdirstem3" || acl_libdirstem3="$acl_libdirstem" acl_cv_libdirstems="$acl_libdirstem,$acl_libdirstem2,$acl_libdirstem3" fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $acl_cv_libdirstems" >&5 $as_echo "$acl_cv_libdirstems" >&6; } acl_libdirstem=`echo "$acl_cv_libdirstems" | sed -e 's/,.*//'` acl_libdirstem2=`echo "$acl_cv_libdirstems" | sed -e 's/^[^,]*,//' -e 's/,.*//'` acl_libdirstem3=`echo "$acl_cv_libdirstems" | sed -e 's/^[^,]*,[^,]*,//' -e 's/,.*//'` 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\" eval additional_libdir2=\"$exec_prefix/$acl_libdirstem2\" eval additional_libdir3=\"$exec_prefix/$acl_libdirstem3\" 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\" eval additional_libdir2=\"$exec_prefix/$acl_libdirstem2\" eval additional_libdir3=\"$exec_prefix/$acl_libdirstem3\" exec_prefix="$acl_save_exec_prefix" prefix="$acl_save_prefix" else additional_includedir="$withval/include" additional_libdir="$withval/$acl_libdirstem" additional_libdir2="$withval/$acl_libdirstem2" additional_libdir3="$withval/$acl_libdirstem3" fi fi fi if test "X$additional_libdir2" = "X$additional_libdir"; then additional_libdir2= fi if test "X$additional_libdir3" = "X$additional_libdir"; then additional_libdir3= 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 for additional_libdir_variable in additional_libdir additional_libdir2 additional_libdir3; do if test "X$found_dir" = "X"; then eval dir=\$$additional_libdir_variable if test -n "$dir"; then if test -n "$acl_shlibext"; then if test -f "$dir/$libname$shrext" && acl_is_expected_elfclass < "$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" && acl_is_expected_elfclass < "$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" && acl_is_expected_elfclass < "$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" && ${AR-ar} -p "$dir/$libname.$acl_libext" | acl_is_expected_elfclass; 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 fi done 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" && acl_is_expected_elfclass < "$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" && acl_is_expected_elfclass < "$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" && acl_is_expected_elfclass < "$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" && ${AR-ar} -p "$dir/$libname.$acl_libext" | acl_is_expected_elfclass; 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" \ || test "X$found_dir" = "X/usr/$acl_libdirstem3"; 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" ;; */$acl_libdirstem3 | */$acl_libdirstem3/) basedir=`echo "X$found_dir" | sed -e 's,^X,,' -e "s,/$acl_libdirstem3/"'*$,,'` 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*) dependency_libdir=`echo "X$dep" | sed -e 's/^X-L//'` if test "X$dependency_libdir" != "X/usr/$acl_libdirstem" \ && test "X$dependency_libdir" != "X/usr/$acl_libdirstem2" \ && test "X$dependency_libdir" != "X/usr/$acl_libdirstem3"; then haveit= if test "X$dependency_libdir" = "X/usr/local/$acl_libdirstem" \ || test "X$dependency_libdir" = "X/usr/local/$acl_libdirstem2" \ || test "X$dependency_libdir" = "X/usr/local/$acl_libdirstem3"; 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$dependency_libdir"; then haveit=yes break fi done if test -z "$haveit"; then if test -d "$dependency_libdir"; then LIBICONV="${LIBICONV}${LIBICONV:+ }-L$dependency_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$dependency_libdir"; then haveit=yes break fi done if test -z "$haveit"; then if test -d "$dependency_libdir"; then LTLIBICONV="${LTLIBICONV}${LTLIBICONV:+ }-L$dependency_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 CFLocaleCopyPreferredLanguages" >&5 $as_echo_n "checking for CFLocaleCopyPreferredLanguages... " >&6; } if ${gt_cv_func_CFLocaleCopyPreferredLanguages+:} 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 () { CFLocaleCopyPreferredLanguages(); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : gt_cv_func_CFLocaleCopyPreferredLanguages=yes else gt_cv_func_CFLocaleCopyPreferredLanguages=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_CFLocaleCopyPreferredLanguages" >&5 $as_echo "$gt_cv_func_CFLocaleCopyPreferredLanguages" >&6; } if test $gt_cv_func_CFLocaleCopyPreferredLanguages = yes; then $as_echo "#define HAVE_CFLOCALECOPYPREFERREDLANGUAGES 1" >>confdefs.h fi INTL_MACOSX_LIBS= if test $gt_cv_func_CFPreferencesCopyAppValue = yes \ || test $gt_cv_func_CFLocaleCopyPreferredLanguages = 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 #ifndef __GNU_GETTEXT_SUPPORTED_REVISION extern int _nl_msg_cat_cntr; extern int *_nl_domain_bindings; #define __GNU_GETTEXT_SYMBOL_EXPRESSION (_nl_msg_cat_cntr + *_nl_domain_bindings) #else #define __GNU_GETTEXT_SYMBOL_EXPRESSION 0 #endif $gt_revision_test_code int main () { bindtextdomain ("", ""); return * gettext ("")$gt_expression_test_code + __GNU_GETTEXT_SYMBOL_EXPRESSION ; 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 am_cv_func_iconv_works=no for ac_iconv_const in '' 'const'; do 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 #ifndef ICONV_CONST # define ICONV_CONST $ac_iconv_const #endif 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 ICONV_CONST char input[] = "\342\202\254"; /* EURO SIGN */ char buf[10]; ICONV_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, &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 ICONV_CONST char input[] = "\263"; char buf[10]; ICONV_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, &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 ICONV_CONST char input[] = "\304"; static char buf[2] = { (char)0xDE, (char)0xAD }; ICONV_CONST char *inptr = input; size_t inbytesleft = 1; char *outptr = buf; size_t outbytesleft = 1; size_t res = iconv (cd_88591_to_utf8, &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 ICONV_CONST char input[] = "\304rger mit b\366sen B\374bchen ohne Augenma\337"; char buf[50]; ICONV_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, &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. */ { /* Try standardized names. */ iconv_t cd1 = iconv_open ("UTF-8", "EUC-JP"); /* Try IRIX, OSF/1 names. */ iconv_t cd2 = iconv_open ("UTF-8", "eucJP"); /* Try AIX names. */ iconv_t cd3 = iconv_open ("UTF-8", "IBM-eucJP"); /* Try HP-UX names. */ iconv_t cd4 = iconv_open ("utf8", "eucJP"); if (cd1 == (iconv_t)(-1) && cd2 == (iconv_t)(-1) && cd3 == (iconv_t)(-1) && cd4 == (iconv_t)(-1)) result |= 16; if (cd1 != (iconv_t)(-1)) iconv_close (cd1); if (cd2 != (iconv_t)(-1)) iconv_close (cd2); if (cd3 != (iconv_t)(-1)) iconv_close (cd3); if (cd4 != (iconv_t)(-1)) iconv_close (cd4); } return result; ; return 0; } _ACEOF if ac_fn_c_try_run "$LINENO"; then : am_cv_func_iconv_works=yes fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi test "$am_cv_func_iconv_works" = no || break done 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\" eval additional_libdir2=\"$exec_prefix/$acl_libdirstem2\" eval additional_libdir3=\"$exec_prefix/$acl_libdirstem3\" 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\" eval additional_libdir2=\"$exec_prefix/$acl_libdirstem2\" eval additional_libdir3=\"$exec_prefix/$acl_libdirstem3\" exec_prefix="$acl_save_exec_prefix" prefix="$acl_save_prefix" else additional_includedir="$withval/include" additional_libdir="$withval/$acl_libdirstem" additional_libdir2="$withval/$acl_libdirstem2" additional_libdir3="$withval/$acl_libdirstem3" fi fi fi if test "X$additional_libdir2" = "X$additional_libdir"; then additional_libdir2= fi if test "X$additional_libdir3" = "X$additional_libdir"; then additional_libdir3= 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 for additional_libdir_variable in additional_libdir additional_libdir2 additional_libdir3; do if test "X$found_dir" = "X"; then eval dir=\$$additional_libdir_variable if test -n "$dir"; then if test -n "$acl_shlibext"; then if test -f "$dir/$libname$shrext" && acl_is_expected_elfclass < "$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" && acl_is_expected_elfclass < "$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" && acl_is_expected_elfclass < "$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" && ${AR-ar} -p "$dir/$libname.$acl_libext" | acl_is_expected_elfclass; 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 fi done 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" && acl_is_expected_elfclass < "$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" && acl_is_expected_elfclass < "$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" && acl_is_expected_elfclass < "$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" && ${AR-ar} -p "$dir/$libname.$acl_libext" | acl_is_expected_elfclass; 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" \ || test "X$found_dir" = "X/usr/$acl_libdirstem3"; 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" ;; */$acl_libdirstem3 | */$acl_libdirstem3/) basedir=`echo "X$found_dir" | sed -e 's,^X,,' -e "s,/$acl_libdirstem3/"'*$,,'` 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*) dependency_libdir=`echo "X$dep" | sed -e 's/^X-L//'` if test "X$dependency_libdir" != "X/usr/$acl_libdirstem" \ && test "X$dependency_libdir" != "X/usr/$acl_libdirstem2" \ && test "X$dependency_libdir" != "X/usr/$acl_libdirstem3"; then haveit= if test "X$dependency_libdir" = "X/usr/local/$acl_libdirstem" \ || test "X$dependency_libdir" = "X/usr/local/$acl_libdirstem2" \ || test "X$dependency_libdir" = "X/usr/local/$acl_libdirstem3"; 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$dependency_libdir"; then haveit=yes break fi done if test -z "$haveit"; then if test -d "$dependency_libdir"; then LIBINTL="${LIBINTL}${LIBINTL:+ }-L$dependency_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$dependency_libdir"; then haveit=yes break fi done if test -z "$haveit"; then if test -d "$dependency_libdir"; then LTLIBINTL="${LTLIBINTL}${LTLIBINTL:+ }-L$dependency_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 #ifndef __GNU_GETTEXT_SUPPORTED_REVISION extern int _nl_msg_cat_cntr; extern #ifdef __cplusplus "C" #endif const char *_nl_expand_alias (const char *); #define __GNU_GETTEXT_SYMBOL_EXPRESSION (_nl_msg_cat_cntr + *_nl_expand_alias ("")) #else #define __GNU_GETTEXT_SYMBOL_EXPRESSION 0 #endif $gt_revision_test_code int main () { bindtextdomain ("", ""); return * gettext ("")$gt_expression_test_code + __GNU_GETTEXT_SYMBOL_EXPRESSION ; 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 #ifndef __GNU_GETTEXT_SUPPORTED_REVISION extern int _nl_msg_cat_cntr; extern #ifdef __cplusplus "C" #endif const char *_nl_expand_alias (const char *); #define __GNU_GETTEXT_SYMBOL_EXPRESSION (_nl_msg_cat_cntr + *_nl_expand_alias ("")) #else #define __GNU_GETTEXT_SYMBOL_EXPRESSION 0 #endif $gt_revision_test_code int main () { bindtextdomain ("", ""); return * gettext ("")$gt_expression_test_code + __GNU_GETTEXT_SYMBOL_EXPRESSION ; 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 6.2.0, 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 6.2.0 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. 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"` POMAKEFILEDEPS="$POMAKEFILEDEPS LINGUAS" else # The set of available languages was given in configure.in. 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: $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: $udevlib LUKS support: $msg_luks " >&6;} cryptmount-6.2.0/compile0000755000175000017500000001624512521463357012262 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-6.2.0/AUTHORS0000644000175000017500000000353314305064466011750 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) László Böszörményi (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) Jens Guenther (improving compatibility with cryptsetup-2.x) Helge Kreutzmann (updating German translations) 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-6.2.0/cryptmount.h0000644000175000017500000001165114354510761013273 00000000000000/* * General declarations for cryptmount * (C)Copyright 2005-2023, 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 "config.h" #include #if HAVE_INTTYPES_H # include #else # if HAVE_STDINT_H # include # else typedef unsigned char 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 extern uid_t cm_initial_uid; 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, /*!< Filesystem is already unmounted */ WRN_NOPASSWD, WRN_LOWENTROPY, WRN_MOUNTED, /*!< Filesystem is already mounted */ 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-2023, RW Penney */ cryptmount-6.2.0/armour-luks.c0000644000175000017500000003666414354510761013336 00000000000000/* * Methods for LUKS-related key-management for cryptmount * (C)Copyright 2005-2023, 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 "config.h" #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; } /*! @brief Change UID to match EUID when mounting via loopback device * * This is a workaround for recent versions of libcryptsetup * (since January 2017), which check that both uid==0 and euid==0 * before attempting to create a loopback device * for a filesystem in an ordinary file. Setting up the loopback * device usually only requires euid==0. * * For filesystems in ordinary block devices, this function has no effect. * Otherwise, this will call setuid() to attempt to make uid==euid==0, * which appears to be an irreversible change, so will persist * across any other actions taken by cryptmount within the same process. * * @returns The previous value of UID. */ static uid_t luks_patch_uid(const bound_tgtdefn_t* boundtgt) { const uid_t olduid = getuid(); const char* filename = boundtgt->tgt->key.filename; struct stat sbuff; if (stat(filename, &sbuff) == 0 && S_ISREG(sbuff.st_mode)) { if (setuid(geteuid()) != 0) { fprintf(stderr, _("Failed to acquire privileges for LUKS container\n")); } } return olduid; } /*! @brief 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(). */ luks_patch_uid(boundtgt); 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 { int lukserr = 0; 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); lukserr = kmluks_change_slot_passwd(luks_ctxt, keyslot, key, keylen, passwd); if (lukserr < 0) { fprintf(stderr, "LUKS error code %d\n", -lukserr); 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