From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from list by lists.gnu.org with archive (Exim 4.71) id 1UEfuD-0000I0-O0 for mharc-grub-devel@gnu.org; Sun, 10 Mar 2013 09:03:13 -0400 Received: from eggs.gnu.org ([208.118.235.92]:49893) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1UEfu9-00009t-TU for grub-devel@gnu.org; Sun, 10 Mar 2013 09:03:12 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1UEfu5-0005K4-6e for grub-devel@gnu.org; Sun, 10 Mar 2013 09:03:09 -0400 Received: from mail-wg0-f46.google.com ([74.125.82.46]:37322) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1UEfu4-0005Ju-U8 for grub-devel@gnu.org; Sun, 10 Mar 2013 09:03:05 -0400 Received: by mail-wg0-f46.google.com with SMTP id fg15so3955081wgb.13 for ; Sun, 10 Mar 2013 06:03:04 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=x-received:message-id:date:from:user-agent:mime-version:to:subject :references:in-reply-to:x-enigmail-version:content-type; bh=GHJUmMEwhLopGW8h+E0USXm2JjR9gGKRq8wSCXHvwew=; b=WPxWj9I7AP5O8PyY4WL2wCZWy+z88aqpyyoHjuitbYs+sKsYUsj9/oddAax+W89Dnh hPRHLLTlwVQP5cR2h4CiQItwGxFz6nsGRDLXYrqFAgZloVI1p5e6KzubopVJkG8ZfArM Ix5VaOHAKodkQ/AutYauyMyInOK796tC7ndY8ATjudoun3Jyy2RE5p16NU3Y6aTPUGbW dvIYgIFxuwRV0QQvYzRV0bTzErKpdep7g2j18ECcpDbKUZ+Dq7UfGd4v8V56bbI7Us58 R/xTX/JPBdSRoFdvdWpFUEGETQQaSfjSrrihWL/q9dPCT9PTsWScvRbUD/azQalKN6Jb unQA== X-Received: by 10.181.12.5 with SMTP id em5mr7250564wid.24.1362920584218; Sun, 10 Mar 2013 06:03:04 -0700 (PDT) Received: from debian.x201.phnet (245-188.1-85.cust.bluewin.ch. [85.1.188.245]) by mx.google.com with ESMTPS id n10sm10501644wia.0.2013.03.10.06.03.03 (version=TLSv1 cipher=ECDHE-RSA-RC4-SHA bits=128/128); Sun, 10 Mar 2013 06:03:03 -0700 (PDT) Message-ID: <513C847C.602@gmail.com> Date: Sun, 10 Mar 2013 14:02:52 +0100 From: =?UTF-8?B?VmxhZGltaXIgJ8+GLWNvZGVyL3BoY29kZXInIFNlcmJpbmVua28=?= User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:10.0.12) Gecko/20130116 Icedove/10.0.12 MIME-Version: 1.0 To: The development of GNU GRUB Subject: Re: [PATCH] Ignore symlink traversal failures in grub-mount readdir References: <20121012160954.GH17188@riva.dynamic.greenend.org.uk> <20130309204726.5e70c448@opensuse.site> <513C8441.60106@gmail.com> In-Reply-To: <513C8441.60106@gmail.com> X-Enigmail-Version: 1.4.1 Content-Type: multipart/signed; micalg=pgp-sha512; protocol="application/pgp-signature"; boundary="------------enigD8DC1CA4CC16439F9ED18D15" X-detected-operating-system: by eggs.gnu.org: GNU/Linux 3.x [fuzzy] X-Received-From: 74.125.82.46 X-BeenThere: grub-devel@gnu.org X-Mailman-Version: 2.1.14 Precedence: list Reply-To: The development of GNU GRUB List-Id: The development of GNU GRUB List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Sun, 10 Mar 2013 13:03:12 -0000 This is an OpenPGP/MIME signed message (RFC 2440 and 3156) --------------enigD8DC1CA4CC16439F9ED18D15 Content-Type: multipart/mixed; boundary="------------020407010201010500000808" This is a multi-part message in MIME format. --------------020407010201010500000808 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: quoted-printable On 10.03.2013 14:01, Vladimir '=CF=86-coder/phcoder' Serbinenko wrote: > On 09.03.2013 17:47, Andrey Borzenkov wrote: >=20 >> =D0=92 Fri, 12 Oct 2012 17:09:54 +0100 >> Colin Watson =D0=BF=D0=B8=D1=88=D0=B5=D1=82: >> >>> This is very much a temporary hack, so I'm sending it here for >>> discussion rather than just committing it even though it's quite simp= le. >>> >>> r3036.1.15 introduced support for filling in the attributes of files = in >>> fuse_readdir. However, symlinks to directories are passed to call_fi= ll >>> with info.dir unset; call_fill will then try to open them with >>> grub_file_open, and get GRUB_ERR_BAD_FILE_TYPE because it's ultimatel= y a >>> directory not a regular file. It then causes the whole readdir call = to >>> fail. The net effect is that if you, for example, have a symlink >>> anywhere in the top level of a filesystem, then the entire filesystem= >>> appears empty in grub-mount. This is the root cause of >>> https://bugs.launchpad.net/bugs/1051306. >>> >>> I think that the proper solution is to pass the full >>> grub_fshelp_filetype to dirhook functions, which would permit >>> implementing true symlink support in grub-mount. That would be a fai= rly >>> large change that I don't have time for at the moment. As a stopgap,= I >>> suggest that we ignore errors from individual grub_file_open calls >>> during fuse_readdir. How does this patch look? >>> >> >> The only reason to call grub_file_open() is to fetch file size, and fi= le >> size is already available when hooks are called. So what about patch >> below? It fixes problem for me, and it trivial enough. This allows >> directory listing to work again. I can extend it with info.is_link to >> return proper filetype to FUSE, but implementing full support needs >> adding readlink that is a separate topic. >> >> I tested it with ext4 and cpio and it works. Testing on more systems >> (in particular, NTFS, which is the only one with non-trivial change) i= s >> appreciated. >> >=20 > Some time ago I made a similar patch but for another motivation: curren= t > code is way too inefficient for large directories as you have to rescan= > directory for every file. The problem with this patch is 10 bytes > increase of core.img. This may be acceptable given this problem (it > happens in ls on runtime as well) and inefficency of scanning. >=20 --------------020407010201010500000808 Content-Type: text/x-diff; name="size.diff" Content-Transfer-Encoding: quoted-printable Content-Disposition: attachment; filename="size.diff" =3D=3D=3D modified file 'grub-core/commands/ls.c' --- grub-core/commands/ls.c 2013-01-21 16:46:24 +0000 +++ grub-core/commands/ls.c 2013-03-10 00:21:42 +0000 @@ -118,34 +118,12 @@ =20 if (! info->dir) { - grub_file_t file; - char *pathname; - - if (ctx->dirname[grub_strlen (ctx->dirname) - 1] =3D=3D '/') - pathname =3D grub_xasprintf ("%s%s", ctx->dirname, filename); - else - pathname =3D grub_xasprintf ("%s/%s", ctx->dirname, filename); - - if (!pathname) - return 1; - - /* XXX: For ext2fs symlinks are detected as files while they - should be reported as directories. */ - grub_file_filter_disable_compression (); - file =3D grub_file_open (pathname); - if (! file) - { - grub_errno =3D 0; - grub_free (pathname); - return 0; - } - if (! ctx->human) - grub_printf ("%-12llu", (unsigned long long) file->size); + grub_printf ("%-12llu", (unsigned long long) info->size); else { - grub_uint64_t fsize =3D file->size * 100ULL; - grub_uint64_t fsz =3D file->size; + grub_uint64_t fsize =3D info->size * 100ULL; + grub_uint64_t fsz =3D info->size; int units =3D 0; char buf[20]; =20 @@ -168,11 +146,9 @@ grub_printf ("%-12s", buf); } else - grub_printf ("%-12llu", (unsigned long long) file->size); + grub_printf ("%-12llu", (unsigned long long) info->size); =20 } - grub_file_close (file); - grub_free (pathname); } else grub_printf ("%-12s", _("DIR")); =3D=3D=3D modified file 'grub-core/fs/affs.c' --- grub-core/fs/affs.c 2013-02-27 16:19:15 +0000 +++ grub-core/fs/affs.c 2013-03-10 00:21:07 +0000 @@ -565,6 +565,7 @@ info.dir =3D ((filetype & GRUB_FSHELP_TYPE_MASK) =3D=3D GRUB_FSHELP_DI= R); info.mtimeset =3D 1; info.mtime =3D aftime2ctime (&node->di.mtime); + info.size =3D grub_be_to_cpu32 (node->di.size); grub_free (node); return ctx->hook (filename, &info, ctx->hook_data); } =3D=3D=3D modified file 'grub-core/fs/bfs.c' --- grub-core/fs/bfs.c 2013-02-27 16:19:15 +0000 +++ grub-core/fs/bfs.c 2013-03-10 00:11:14 +0000 @@ -890,6 +890,7 @@ #else info.mtime =3D grub_bfs_to_cpu64 (ino.ino.mtime) >> 16; #endif + info.size =3D grub_bfs_to_cpu64 (ino.ino.size); info.dir =3D ((grub_bfs_to_cpu32 (ino.ino.mode) & ATTR_TYPE) =3D=3D AT= TR_DIR); return ctx->hook (name, &info, ctx->hook_data); } =3D=3D=3D modified file 'grub-core/fs/btrfs.c' --- grub-core/fs/btrfs.c 2013-01-21 01:33:46 +0000 +++ grub-core/fs/btrfs.c 2013-03-10 00:05:22 +0000 @@ -1581,6 +1581,7 @@ { info.mtime =3D grub_le_to_cpu64 (inode.mtime.sec); info.mtimeset =3D 1; + info.size =3D grub_le_to_cpu64 (inode.size); } c =3D cdirel->name[grub_le_to_cpu16 (cdirel->n)]; cdirel->name[grub_le_to_cpu16 (cdirel->n)] =3D 0; =3D=3D=3D modified file 'grub-core/fs/cpio.c' --- grub-core/fs/cpio.c 2013-01-21 01:33:46 +0000 +++ grub-core/fs/cpio.c 2013-03-10 00:05:22 +0000 @@ -573,6 +573,7 @@ info.dir =3D (p !=3D NULL) || ((mode & ATTR_TYPE) =3D=3D ATTR_DIR= ); info.mtime =3D mtime; info.mtimeset =3D 1; + info.size =3D data->size; =20 if (hook (n, &info, hook_data)) { =3D=3D=3D modified file 'grub-core/fs/ext2.c' --- grub-core/fs/ext2.c 2013-02-27 16:19:15 +0000 +++ grub-core/fs/ext2.c 2013-03-10 12:08:40 +0000 @@ -884,6 +884,8 @@ { info.mtimeset =3D 1; info.mtime =3D grub_le_to_cpu32 (node->inode.mtime); + info.size =3D grub_le_to_cpu32 (node->inode.size) + | (((grub_off_t) grub_le_to_cpu32 (node->inode.size_high)) << 32); } =20 info.dir =3D ((filetype & GRUB_FSHELP_TYPE_MASK) =3D=3D GRUB_FSHELP_DI= R); =3D=3D=3D modified file 'grub-core/fs/fat.c' --- grub-core/fs/fat.c 2013-02-27 16:19:15 +0000 +++ grub-core/fs/fat.c 2013-03-10 12:46:55 +0000 @@ -894,6 +894,7 @@ =20 info.dir =3D !! (ctxt.dir.attr & GRUB_FAT_ATTR_DIRECTORY); info.case_insensitive =3D 1; + info.size =3D ctxt.dir.file_size; =20 #ifdef MODE_EXFAT if (!ctxt.dir.have_stream) =3D=3D=3D modified file 'grub-core/fs/hfs.c' --- grub-core/fs/hfs.c 2013-03-02 10:31:00 +0000 +++ grub-core/fs/hfs.c 2013-03-10 00:13:16 +0000 @@ -1225,6 +1225,7 @@ info.dir =3D 0; info.mtimeset =3D 1; info.mtime =3D grub_be_to_cpu32 (frec->mtime) - 2082844800; + info.size =3D grub_be_to_cpu32 (frec->size); return ctx->hook (fname, &info, ctx->hook_data); } =20 =3D=3D=3D modified file 'grub-core/fs/hfsplus.c' --- grub-core/fs/hfsplus.c 2013-03-01 13:02:27 +0000 +++ grub-core/fs/hfsplus.c 2013-03-10 00:13:52 +0000 @@ -1012,6 +1012,7 @@ info.dir =3D ((filetype & GRUB_FSHELP_TYPE_MASK) =3D=3D GRUB_FSHELP_DI= R); info.mtimeset =3D 1; info.mtime =3D node->mtime; + info.size =3D node->size; info.case_insensitive =3D !! (filetype & GRUB_FSHELP_CASE_INSENSITIVE)= ; grub_free (node); return ctx->hook (filename, &info, ctx->hook_data); =3D=3D=3D modified file 'grub-core/fs/iso9660.c' --- grub-core/fs/iso9660.c 2013-03-07 08:11:36 +0000 +++ grub-core/fs/iso9660.c 2013-03-10 00:14:17 +0000 @@ -861,6 +861,7 @@ grub_memset (&info, 0, sizeof (info)); info.dir =3D ((filetype & GRUB_FSHELP_TYPE_MASK) =3D=3D GRUB_FSHELP_DI= R); info.mtimeset =3D !!iso9660_to_unixtime2 (&node->dirents[0].mtime, &in= fo.mtime); + info.size =3D get_node_size (node); =20 grub_free (node); return ctx->hook (filename, &info, ctx->hook_data); =3D=3D=3D modified file 'grub-core/fs/jfs.c' --- grub-core/fs/jfs.c 2013-02-28 09:51:32 +0000 +++ grub-core/fs/jfs.c 2013-03-10 00:14:41 +0000 @@ -832,6 +832,7 @@ & GRUB_JFS_FILETYPE_MASK) =3D=3D GRUB_JFS_FILETYPE_DIR; info.mtimeset =3D 1; info.mtime =3D grub_le_to_cpu32 (inode.mtime.sec); + info.size =3D grub_le_to_cpu64 (inode.size); if (hook (diro->name, &info, hook_data)) goto fail; } =3D=3D=3D modified file 'grub-core/fs/minix.c' --- grub-core/fs/minix.c 2013-02-28 09:50:01 +0000 +++ grub-core/fs/minix.c 2013-03-10 00:05:22 +0000 @@ -587,6 +587,7 @@ & GRUB_MINIX_IFDIR) =3D=3D GRUB_MINIX_IFDIR); info.mtimeset =3D 1; info.mtime =3D grub_minix_to_cpu32 (data->inode.mtime); + info.size =3D GRUB_MINIX_INODE_SIZE (data); =20 if (hook (filename, &info, hook_data) ? 1 : 0) break; =3D=3D=3D modified file 'grub-core/fs/nilfs2.c' --- grub-core/fs/nilfs2.c 2013-02-27 16:19:15 +0000 +++ grub-core/fs/nilfs2.c 2013-03-10 00:15:05 +0000 @@ -1056,6 +1056,7 @@ { info.mtimeset =3D 1; info.mtime =3D grub_le_to_cpu64 (node->inode.i_mtime); + info.size =3D grub_le_to_cpu64 (node->inode.i_size); } =20 info.dir =3D ((filetype & GRUB_FSHELP_TYPE_MASK) =3D=3D GRUB_FSHELP_DI= R); =3D=3D=3D modified file 'grub-core/fs/ntfs.c' --- grub-core/fs/ntfs.c 2013-02-27 16:19:15 +0000 +++ grub-core/fs/ntfs.c 2013-03-10 00:15:49 +0000 @@ -1019,10 +1019,13 @@ =20 grub_memset (&info, 0, sizeof (info)); info.dir =3D ((filetype & GRUB_FSHELP_TYPE_MASK) =3D=3D GRUB_FSHELP_DI= R); + init_file (node, node->ino); info.mtimeset =3D 1; info.mtime =3D grub_divmod64 (node->mtime, 10000000, 0)=20 - 86400ULL * 365 * (1970 - 1601) - 86400ULL * ((1970 - 1601) / 4) + 86400ULL * ((1970 - 1601) / 100);= + info.size =3D node->size; + free_file (node); grub_free (node); return ctx->hook (filename, &info, ctx->hook_data); } =3D=3D=3D modified file 'grub-core/fs/reiserfs.c' --- grub-core/fs/reiserfs.c 2013-02-27 16:19:15 +0000 +++ grub-core/fs/reiserfs.c 2013-03-10 00:05:22 +0000 @@ -875,6 +875,7 @@ entry_v1_stat.rdev, entry_v1_stat.first_direct_byte); #endif + entry_item->size =3D (grub_off_t) grub_le_to_cpu64 (entry_v1_sta= t.size); entry_item->mtime =3D grub_le_to_cpu32 (entry_v1_stat.mtime); if ((grub_le_to_cpu16 (entry_v1_stat.mode) & S_IFLNK) =3D=3D S_IFLNK) @@ -923,6 +924,7 @@ entry_v2_stat.blocks, entry_v2_stat.first_direct_byte); #endif + entry_item->size =3D (grub_off_t) grub_le_to_cpu64 (entry_v2_sta= t.size); entry_item->mtime =3D grub_le_to_cpu32 (entry_v2_stat.mtime); entry_item->size =3D (grub_off_t) grub_le_to_cpu64 (entry_v2_sta= t.size); if ((grub_le_to_cpu16 (entry_v2_stat.mode) & S_IFLNK) =3D=3D=3D modified file 'grub-core/fs/romfs.c' --- grub-core/fs/romfs.c 2013-02-27 16:19:15 +0000 +++ grub-core/fs/romfs.c 2013-03-10 00:16:08 +0000 @@ -331,6 +331,7 @@ grub_memset (&info, 0, sizeof (info)); =20 info.dir =3D ((filetype & GRUB_FSHELP_TYPE_MASK) =3D=3D GRUB_FSHELP_DI= R); + info.size =3D grub_be_to_cpu32 (node->file.size); grub_free (node); return ctx->hook (filename, &info, ctx->hook_data); } =3D=3D=3D modified file 'grub-core/fs/sfs.c' --- grub-core/fs/sfs.c 2013-02-27 16:19:15 +0000 +++ grub-core/fs/sfs.c 2013-03-10 00:16:47 +0000 @@ -671,6 +671,7 @@ info.dir =3D ((filetype & GRUB_FSHELP_TYPE_MASK) =3D=3D GRUB_FSHELP_DI= R); info.mtime =3D node->mtime + 8 * 365 * 86400 + 86400 * 2; info.mtimeset =3D 1; + info.size =3D node->size; grub_free (node->cache); grub_free (node); return ctx->hook (filename, &info, ctx->hook_data); =3D=3D=3D modified file 'grub-core/fs/squash4.c' --- grub-core/fs/squash4.c 2013-01-21 01:33:46 +0000 +++ grub-core/fs/squash4.c 2013-03-10 00:17:17 +0000 @@ -656,6 +656,16 @@ info.dir =3D ((filetype & GRUB_FSHELP_TYPE_MASK) =3D=3D GRUB_FSHELP_DI= R); info.mtimeset =3D 1; info.mtime =3D grub_le_to_cpu32 (node->ino.mtime); + switch (node->ino.type) + { + case grub_cpu_to_le16_compile_time (SQUASH_TYPE_LONG_REGULAR): + info.size =3D grub_le_to_cpu64 (node->ino.long_file.size); + break; + case grub_cpu_to_le16_compile_time (SQUASH_TYPE_REGULAR): + info.size =3D grub_le_to_cpu32 (node->ino.file.size); + break; + } + grub_free (node); return ctx->hook (filename, &info, ctx->hook_data); } =3D=3D=3D modified file 'grub-core/fs/udf.c' --- grub-core/fs/udf.c 2013-02-27 16:19:15 +0000 +++ grub-core/fs/udf.c 2013-03-10 00:17:39 +0000 @@ -1026,6 +1026,7 @@ =20 grub_memset (&info, 0, sizeof (info)); info.dir =3D ((filetype & GRUB_FSHELP_TYPE_MASK) =3D=3D GRUB_FSHELP_DI= R); + info.size =3D U64 (node->block.fe.file_size); if (U16 (node->block.fe.tag.tag_ident) =3D=3D GRUB_UDF_TAG_IDENT_FE) tstamp =3D &node->block.fe.modification_time; else if (U16 (node->block.fe.tag.tag_ident) =3D=3D GRUB_UDF_TAG_IDENT_= EFE) =3D=3D=3D modified file 'grub-core/fs/ufs.c' --- grub-core/fs/ufs.c 2013-02-27 16:19:15 +0000 +++ grub-core/fs/ufs.c 2013-03-10 00:17:58 +0000 @@ -696,6 +696,12 @@ #endif info.mtimeset =3D 1; =20 +#ifdef MODE_UFS2 + info.size =3D grub_le_to_cpu64 (inode.size); +#else + info.size =3D grub_le_to_cpu32 (inode.size); +#endif + if (hook (filename, &info, hook_data)) break; } =3D=3D=3D modified file 'grub-core/fs/xfs.c' --- grub-core/fs/xfs.c 2013-02-27 16:19:15 +0000 +++ grub-core/fs/xfs.c 2013-03-10 00:18:18 +0000 @@ -731,6 +731,7 @@ { info.mtimeset =3D 1; info.mtime =3D grub_be_to_cpu32 (node->inode.mtime.sec); + info.size =3D grub_be_to_cpu64 (node->inode.size); } info.dir =3D ((filetype & GRUB_FSHELP_TYPE_MASK) =3D=3D GRUB_FSHELP_DI= R); grub_free (node); =3D=3D=3D modified file 'grub-core/fs/zfs/zfs.c' --- grub-core/fs/zfs/zfs.c 2013-01-21 01:33:46 +0000 +++ grub-core/fs/zfs/zfs.c 2013-03-10 00:05:22 +0000 @@ -3768,12 +3768,14 @@ hdrsize =3D SA_HDR_SIZE (((sa_hdr_phys_t *) sahdrp)); info->mtimeset =3D 1; info->mtime =3D grub_zfs_to_cpu64 (grub_get_unaligned64 ((char *) = sahdrp + hdrsize + SA_MTIME_OFFSET), dn.endian); + info->size =3D grub_zfs_to_cpu64 (grub_get_unaligned64 ((char *) s= ahdrp + hdrsize + SA_SIZE_OFFSET), dn.endian); } =20 if (dn.dn.dn_bonustype =3D=3D DMU_OT_ZNODE) { info->mtimeset =3D 1; info->mtime =3D grub_zfs_to_cpu64 (((znode_phys_t *) DN_BONUS (&dn= =2Edn))->zp_mtime[0], dn.endian); + info->size =3D grub_zfs_to_cpu64 (((znode_phys_t *) DN_BONUS (&dat= a->dnode.dn))->zp_size, dn.endian); } return; } =3D=3D=3D modified file 'include/grub/fs.h' --- include/grub/fs.h 2013-01-21 01:33:46 +0000 +++ include/grub/fs.h 2013-03-10 00:05:22 +0000 @@ -39,6 +39,7 @@ unsigned mtimeset:1; unsigned case_insensitive:1; grub_int32_t mtime; + grub_off_t size; }; =20 typedef int (*grub_fs_dir_hook_t) (const char *filename, =3D=3D=3D modified file 'util/grub-mount.c' --- util/grub-mount.c 2013-01-21 01:33:46 +0000 +++ util/grub-mount.c 2013-03-10 00:10:49 +0000 @@ -206,14 +206,7 @@ st->st_gid =3D 0; st->st_rdev =3D 0; if (!ctx.file_info.dir) - { - grub_file_t file; - file =3D grub_file_open (path); - if (! file) - return translate_error (); - st->st_size =3D file->size; - grub_file_close (file); - } + st->st_size =3D ctx.file_info.size; else st->st_size =3D 0; st->st_blksize =3D 512; --------------020407010201010500000808-- --------------enigD8DC1CA4CC16439F9ED18D15 Content-Type: application/pgp-signature; name="signature.asc" Content-Description: OpenPGP digital signature Content-Disposition: attachment; filename="signature.asc" -----BEGIN PGP SIGNATURE----- Version: GnuPG v1.4.12 (GNU/Linux) Comment: Using GnuPG with Mozilla - http://enigmail.mozdev.org/ iF4EAREKAAYFAlE8hHwACgkQNak7dOguQgkjAwEAkxXrC2KnVb5hGg4V0jzICFLy IU0n6hhXJLJq1xhwDKkA/2CA4+uMLNmr/3UQjCixZPRBui5/Th5Yo09UKEmkBfuk =Iv1O -----END PGP SIGNATURE----- --------------enigD8DC1CA4CC16439F9ED18D15--