Hello community, here is the log from the commit of package man for openSUSE:Factory checked in at 2012-10-07 19:52:19 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Comparing /work/SRC/openSUSE:Factory/man (Old) and /work/SRC/openSUSE:Factory/.man.new (New) ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "man", Maintainer is "[email protected]" Changes: -------- --- /work/SRC/openSUSE:Factory/man/man.changes 2012-09-14 12:30:53.000000000 +0200 +++ /work/SRC/openSUSE:Factory/.man.new/man.changes 2012-10-07 19:53:35.000000000 +0200 @@ -1,0 +2,271 @@ +Thu Oct 4 09:16:16 UTC 2012 - [email protected] + +- Update to version 2.6.3 + * Build fixes for glibc 2.16 and Automake 1.12. + * apropos prints an error message and returns non-zero when it finds + no matches. (Regression introduced in 2.5.1.) + * The presence of a 64-bit GDBM database on the manpath no longer + causes a 32-bit man process to exit with a fatal error. + * apropos is much faster when run with many arguments. + * whatis may be given the full path to an executable as an argument, + in which case it will look up the base name of that executable in + the appropriate parts of the manpath. + * Translated manual pages are no longer displayed starting with a + spurious blank line. + * Fix double-free in mandb when encountering a symlink outside the + manual hierarchy, thanks to Peter Schiffer. + * Running 'man -w' (with a new --path alias) without a name now + prints the manpath, for compatibility with other man + implementations. The vim viewdoc plugin makes use of this. + * Fix a segfault when scanning links to empty pages. + * Once we've seen at least one record in a page's NAME section, + ignore any further records that don't include a whatis + description, as they tend to be noise. + * Ensure that the target of a symlink or .so chain is always recorded + as a real page. + * Read a user-specified configuration file even if HOME is unset. + * Fix failure to display manual pages in some encodings when + installed setuid. + * Wrap long table cells in man(1), fixing test failures with groff + 1.21. + * If an explicit section is passed to man, then pages that match + that section exactly will be preferred over pages that only have + that section as a prefix. + * Fix a segfault when 'man -K' tries to display certain pages. + * Fix a segfault in some situations when processes are killed by + SIGHUP, SIGINT, or SIGTERM. + * As promised in the release notes for man-db 2.5.8, man-db no + longer ships its own copy of libpipeline + (http://libpipeline.nongnu.org/). You must build and install that + library separately. + * Search the full manpath when expanding .so directives in manual + pages. As part of this, '.so name.1' should now work as well as + '.so man1/name.1'. + * lexgrog handles roff named glyphs and perldoc strings in NAME + sections. + * man no longer starts a pager if standard output is not a tty. + * The -s option to whatis and apropos now takes a colon- or + comma-separated list of sections, similar to 'man -S'. + * mandb error output is neater when stderr is not a terminal. + * Add basic support for the implementation of nroff/troff in the + Heirloom Documentation Tools. Title lengths are not properly set + as yet, and many features are untested. + * mandb removes cat* and NLS subdirectories of cat directories whose + corresponding man directories no longer exist. + * mandb forces SIGPIPE back to its default disposition on startup, + to avoid noisy output in case it was started in a context where + SIGPIPE was ignored. + * SECTION entries in a user configuration file now override those in + the system configuration file, rather than appending to them. + * The default less prompt now includes "(press h for help or q to + quit)" to help novices find their way around. + * man-db may now be built to use Berkeley DB version 5 + (--with-db=db5). + * Fix assertion failure on 'man -l' with an uncompressed page and + any of --no-hyphenation, --no-justification, or a non-English + page. + * Try underscore-separated subpages as well as hyphen-separated + ones, thanks to Tanguy Ortolo. + * Build libman and libmandb as shared libraries, reducing installed + footprint by about 200K (at least on GNU/Linux). + * Warnings about unrecognised locales are now suppressed if the + DPKG_RUNNING_VERSION environment variable is set (i.e. man-db is + running within a Debian package's maintainer script), since the + system locales are often out of sync with the C library in that + context. Thanks to the Debian Perl maintainers for the idea. + * Allow building with an external libpipeline + (http://libpipeline.nongnu.org/), which has been split out from + man-db. This is a transitional measure: a future version of + man-db will stop shipping its own copy of libpipeline. + * mandb should no longer repeatedly rescan manual page hierarchies + when a whatis entry turns into a broken link. + * If a subprocess exits before man manages to read all the output + from it, it now drains the output file descriptor rather than + immediately discarding it. + * If /usr/share/i18n/SUPPORTED is available, man attempts to use it + to ensure that LC_CTYPE is set to an appropriate locale for the + selected character set when invoking col. This fixes 'LANG=C man + -E UTF-8', as used by lintian. + * Fix possible mandb crash when MAN_MUST_CREATE is unset. + * man can now tell nroff to disable justification if the + --no-justification option is used. + * If the full path to an executable is given as an argument, man + will try looking up the corresponding manual page in the + appropriate part of the manpath, rather than just trying to format + the text of the executable as a manual page. + * In the GNU manual hierarchy layout, search man<sec><ext> + directories as well as just man<sec> (e.g. /usr/share/man/man3p as + well as /usr/share/man/man3). + * By request, man now prefers getting a page from the best manual + section over getting a page in the correct language. + * All programs now support a MAN_DEBUG environment variable which + can be used in place of the -d/--debug option. This is useful in + some situations where a program is being called deep in a process + tree. + * Add support for emulating pipe() with socketpair(), which is + faster on some systems; thanks to Werner Fink of SUSE. + * Cat pages are now always saved in UTF-8, and converted to the + proper encoding at display time, which means that cat pages can + now be saved regardless of locale. Note that a consequence of this + is that cat pages now include formatting information (e.g. + overstriking) and need to be run through col(1) before display. + * Exact-section database lookups were incorrectly returning all + database entries whose section names were prefixes of the + requested section name. In some cases this could confuse mandb + into never believing that the database was up to date. + * Fix handling of pages with comma-separated names ("foo, bar, + baz") in their NAME sections, broken by a change in 2.5.0 (!) + to ignore manual page names containing spaces. + * Fixed a buffer overflow in the pipeline library's line-reading + functions. I don't believe this to be exploitable: at worst we + might believe that there's some garbage at the end of manual pages + (whose contents are untrusted anyway) and this bug typically + resulted in a failed assertion the next time anything tried to + read a line. + * Plugged two substantial memory leaks in the pipeline library. + * whatis and apropos only display any given manual page, or pointers + to it, once. + * man now sets less(1)'s environment up correctly for manual pages + encoded in CP1251. + * manconv no longer confuses situations such as "this UTF-8 + character is not representable in the target encoding" with "this + text is not in UTF-8". + * The default configuration file now includes section 0, used on + some systems to document C library header files. + * 'make check' now passes in the presence of a UTF-8-aware col, such + as that in util-linux-ng. + * The 'man -K' option is now supported to search the full text of + all manual pages. This was inspired by a similar option in the + other man package (currently at version 1.6f) currently maintained + by Federico Lucifredi and formerly by Andries Brouwer, but I took + advantage of man-db's pipeline library to implement it entirely + in-process, without having to start a separate grep process for + every manual page. In my tests with fairly typical searches across + variously all manual pages or just one section, man-db's + implementation ran between 3 and 10 times faster. + * Database directories are now only created when there are + corresponding manual page directories, not just because they're + mentioned in the configuration file. + * By default, man will now try to interpret pairs of manual page + names given on the command line as equivalent to a single manual + page name containing a hyphen (e.g. 'man foo bar' => foo-bar(1)). + This supports the common pattern of programs that implement a + number of subcommands, allowing them to provide manual pages for + each that can be accessed using similar syntax as would be used to + invoke the subcommands themselves. Suggested by H. Peter Anvin, + Federico Lucifredi, and others on the git mailing list. + * The build process is now quieter by default. Use './configure + --disable-silent-rules' or 'make V=0' if you don't like this or + your make(1) doesn't support the non-standard extension required. + * manconv understands a wider range of Emacs-style coding tags. + * Recommendations to change MAN_DB_CREATES, MAN_DB_UPDATES, and + MAN_CATS #define options in manconfig.h have been replaced by new + configure options --enable-automatic-create, + --disable-automatic-update, and --disable-cats respectively. Note + that automatic user database creation is now off by default, as it + is often too slow for the usefulness it adds; use + --enable-automatic-create to enable it. + * Pages that declare a non-default encoding in their preprocessor + lines are now handled correctly. + * man-db's 'make check' now tests that all its own manual pages + format without errors or warnings from groff, to ensure a + better-quality release. + * lexgrog now stops on any unrecognised roff request, rather than + continuing and often littering the database with garbage. + * man no longer requires both standard input and standard output to + be terminals in order to use the terminal line length. The line + length from standard output is preferred if available. + * The manpath was built completely wrongly when multiple entries + were present in LANGUAGE: duplicates were handled strangely, and + languages were effectively iterated in reverse order. It should be + rather more sensible now. + * The MAN_KEEP_STDERR environment variable can now be used to + override man's default of discarding stderr when stdout is a + terminal. + * Handling of terminal widths for cat pages is now configurable, + using the MINCATWIDTH, MAXCATWIDTH, and CATWIDTH configuration + file directives. + * 'man -a' now detects duplicate manual page candidates more + reliably, and sorts them better. + * Belarusian, Estonian, Greek, Latvian, Lithuanian, Macedonian, + Romanian, Slovenian, and Ukrainian pages are now supported. + * man can now search for pages using regular expressions (with + --regex) or shell wildcards (with --wildcard). By default this + searches both page names and descriptions, like apropos, but if + the --names-only option is used then it searches page names only, + like whatis. + * man can now tell nroff to disable hyphenation if the ++++ 74 more lines (skipped) ++++ between /work/SRC/openSUSE:Factory/man/man.changes ++++ and /work/SRC/openSUSE:Factory/.man.new/man.changes Old: ---- automake-1.12.patch man-db-2.4.3-firefox.dif man-db-2.4.3-section.dif man-db-2.5.1-globbing.dif man-db-2.5.1-listall.dif man-db-2.5.1-security4.dif man-db-2.5.1-zio.dif man-db-2.5.2-catp.dif man-db-2.5.2-chinese.dif man-db-2.5.2-fastpipe.dif man-db-2.5.2-fhs.dif man-db-2.5.2.dif man-db-2.5.2.tar.bz2 man-db_2.5.2-2.diff.bz2 New: ---- man-db-2.6.3-chinese.dif man-db-2.6.3-firefox.dif man-db-2.6.3-listall.dif man-db-2.6.3-man0.dif man-db-2.6.3-section.dif man-db-2.6.3-security4.dif man-db-2.6.3-zio.dif man-db-2.6.3.dif man-db-2.6.3.tar.xz wrapper.c ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Other differences: ------------------ ++++++ man.spec ++++++ --- /var/tmp/diff_new_pack.cusoTG/_old 2012-10-07 19:53:38.000000000 +0200 +++ /var/tmp/diff_new_pack.cusoTG/_new 2012-10-07 19:53:38.000000000 +0200 @@ -25,9 +25,13 @@ BuildRequires: groff BuildRequires: less BuildRequires: libbz2-devel +BuildRequires: libpipeline-devel BuildRequires: libzio-devel +BuildRequires: pkg-config +BuildRequires: po4a +BuildRequires: xz-devel BuildRequires: zlib-devel -Version: 2.5.2 +Version: 2.6.3 Release: 0 Summary: A Program for Displaying man Pages License: GPL-2.0+ @@ -38,25 +42,21 @@ Requires: glibc-locale Requires: groff >= 1.18 Requires: less -Source: man-db-%{version}.tar.bz2 +Source: man-db-%{version}.tar.xz Source1: sysconfig.cron-man Source2: cron.daily.do_mandb Source3: cron.daily.clean_catman Source4: mancoding +Source5: wrapper.c Patch0: man-db-%{version}.dif -Patch1: man-db_%{version}-2.diff.bz2 +Patch1: man-db-2.6.3-man0.dif Patch2: man-db-2.3.19deb4.0-groff.dif -Patch4: man-db-2.4.3-section.dif -Patch5: man-db-2.5.1-security4.dif -Patch6: man-db-2.4.3-firefox.dif -Patch7: man-db-%{version}-chinese.dif -Patch8: man-db-2.5.1-globbing.dif -Patch9: man-db-2.5.1-zio.dif -Patch10: man-db-2.5.1-listall.dif -Patch11: man-db-%{version}-catp.dif -Patch12: man-db-2.5.2-fastpipe.dif -Patch13: man-db-2.5.2-fhs.dif -Patch14: automake-1.12.patch +Patch4: man-db-2.6.3-section.dif +Patch5: man-db-2.6.3-security4.dif +Patch6: man-db-2.6.3-firefox.dif +Patch7: man-db-2.6.3-chinese.dif +Patch9: man-db-2.6.3-zio.dif +Patch10: man-db-2.6.3-listall.dif BuildRoot: %{_tmppath}/%{name}-%{version}-build %global _sysconfdir /etc @@ -74,22 +74,14 @@ %prep %setup -n man-db-%{version} -%patch1 -p1 -b .debian %patch2 -p0 -b .groff %patch4 -p0 -b .sect %patch5 -p0 -b .secu4 %patch6 -p0 -b .firefox %patch7 -p0 -b .chinese -%patch8 -p0 -b .globbing %patch9 -p0 -b .zio %patch10 -p0 -b .listall -%patch11 -p0 -b .catp -%patch12 -p0 -b .fp -%patch13 -p0 -b .fhs %patch0 -p0 -%if 0%{?suse_version} > 1210 -%patch14 -p1 -%endif %build gettextize --force --copy --no-changelog @@ -115,35 +107,32 @@ Cg g s m) SEC="${SEC[@]}" rm -f configure - CFLAGS="${RPM_OPT_FLAGS} -funroll-loops -pipe -D_GNU_SOURCE -D_SVID_SOURCE -Wall" +%global optflags %{optflags} -funroll-loops -pipe -D_GNU_SOURCE -D_SVID_SOURCE -Wall + CFLAGS="%{optflags}" LDFLAGS= LIBS= - export CFLAGS LDFLAGS LIBS -%if %suse_version > 1030 - aclocal -I ${PWD}/m4 -I ${PWD}/gnulib/m4 - autoconf -B ${PWD}/m4 -B ${PWD}/gnulib/m4 + LINGUAS= + for d in $(cat man/LINGUAS*) ; do + test -d %{_datadir}/locale/$d || continue + LINGUAS="${LINGUAS:+$LINGUAS }$d" + done + export CFLAGS LDFLAGS LIBS LINGUAS + aclocal -I ${PWD} -I ${PWD}/m4 -I ${PWD}/gnulib/m4 + autoconf -B ${PWD} -B ${PWD}/m4 -B ${PWD}/gnulib/m4 automake --add-missing -%else - sed -ri 's/(m4_PACKAGE_VERSION,[[:blank:]]*\[)2.61(\])/\12.60\2/' aclocal.m4 - sed -ri 's/(AM_INIT_AUTOMAKE\(\[)1.10/\11.9.6/' configure.ac - sed -ri 's/intl//' Makefile.am - aclocal -I ${PWD}/m4 -I ${PWD}/gnulib/m4 - autoconf -B ${PWD}/m4 -B ${PWD}/gnulib/m4 - mkdir -p tools - touch tools/compile - export MKDIR_P="mkdir -p" -%endif - ./configure \ + find -name 'Makefile.*' | xargs \ + sed -ri -e '/^pkglibdir/{ s@^(pkglibdir[[:blank:]]+=[[:blank:]]+\$\(libdir\)).*@\1@p }' + %configure \ --enable-dups \ --enable-setuid=man \ --with-device=utf8 \ - --prefix=%{_prefix} \ - --mandir=%{_mandir} \ - --localstatedir=%{_localstatedir} \ - --libexecdir=%{_prefix}/lib \ --with-zio \ --with-gnu-ld \ --disable-rpath \ + --disable-automatic-create \ + --enable-automatic-update \ + --disable-cats \ + --enable-threads=posix \ --enable-mb-groff \ --with-db=gdbm \ --enable-nls \ @@ -151,7 +140,7 @@ --without-included-gettext \ --with-sections="${SEC}" make %{?_smp_mflags} nls=all - for man in $(find man/ -type f -a -name '*.man[0-9]'); do + for man in $(find man/ -type f -a -name '*.[0-9]'); do pp="$(head -n 1 $man)" case "$pp" in \'\\\"*\ -\*-\ coding:\ *\ -\*-) @@ -166,22 +155,32 @@ " $man esac done + patch -p0 < %{P:1} + gcc $CFLAGS -I gnulib/lib/ -I include/ --include config.h --include configmake.h \ + -o wrapper %{S:5} -L gnulib/lib/.libs/ -lgnu %install %if %suse_version <= 1030 export MKDIR_P="mkdir -p" %endif rm -rf %{buildroot}%{_localstatedir}/cache/man + mkdir -p %{buildroot}%{_datadir}/doc/packages/man mkdir -p %{buildroot}%{_prefix}/lib/man-db mkdir -p %{buildroot}%{_bindir} mkdir -p %{buildroot}/etc make nls=all install DESTDIR=%{buildroot} - if test -x %{buildroot}%{_bindir}/wrapper ; then - rm -f %{buildroot}%{_bindir}/mandb - rm -f %{buildroot}%{_bindir}/man - mv %{buildroot}%{_bindir}/wrapper %{buildroot}%{_bindir}/mandb - ln -sf mandb %{buildroot}%{_bindir}/man + rm -vf %{buildroot}%{_libdir}/*.la + mv %{buildroot}%{_datadir}/doc/man-db/man-db-manual.* \ + %{buildroot}%{_datadir}/doc/packages/man/ + # wrapper which drops roots privileges if root executes man or mandb + if test -x %{buildroot}%{_bindir}/mandb ; then + mv %{buildroot}%{_bindir}/mandb %{buildroot}%{_prefix}/lib/man-db/ + fi + if test -x %{buildroot}%{_bindir}/man ; then + mv %{buildroot}%{_bindir}/man %{buildroot}%{_prefix}/lib/man-db/ fi + install wrapper %{buildroot}%{_bindir}/mandb + ln -sf mandb %{buildroot}%{_bindir}/man mkdir -p %{buildroot}%{_mandir} pushd %{buildroot}%{_mandir}/ rm -rf *.ascii/ @@ -212,6 +211,9 @@ %files -f man-db.lang %defattr(-,root,root) +%doc docs/COPYING +%doc ChangeLog +%doc %{_datadir}/doc/packages/man/man-db-manual.* %config /etc/manpath.config %attr(0744,root,root) /etc/cron.daily/suse-clean_catman %attr(0744,root,root) /etc/cron.daily/suse-do_mandb @@ -228,25 +230,19 @@ %{_bindir}/manpath %{_bindir}/whatis %{_bindir}/zsoelim -%if %suse_version > 1030 %dir %attr(0755,root,root) %{_prefix}/lib/man-db %attr(0755,root,root) %{_prefix}/lib/man-db/man %attr(0755,root,root) %{_prefix}/lib/man-db/mandb %attr(0755,man,man) %{_prefix}/lib/man-db/manconv %attr(0755,man,man) %{_prefix}/lib/man-db/globbing -%else -%dir %attr(0711,root,root) %{_prefix}/lib/man-db -%attr(0711,root,root) %{_prefix}/lib/man-db/man -%attr(0711,root,root) %{_prefix}/lib/man-db/mandb -%attr(0711,man,man) %{_prefix}/lib/man-db/manconv -%attr(0711,man,man) %{_prefix}/lib/man-db/globbing -%endif %{_sbindir}/accessdb +%{_libdir}/libman*.so %{_datadir}/groff/site-tmac/tmac.andb %{_datadir}/groff/site-tmac/tmac.andocdb %doc %{_mandir}/man1/*.1.gz %doc %{_mandir}/man5/*.5.gz %doc %{_mandir}/man8/*.8.gz +%dir %{_mandir}/id %defattr(-,man,man) %{_localstatedir}/cache/man/* %{_localstatedir}/adm/fillup-templates/sysconfig.cron-man ++++++ man-db-2.5.2-chinese.dif -> man-db-2.6.3-chinese.dif ++++++ --- /work/SRC/openSUSE:Factory/man/man-db-2.5.2-chinese.dif 2011-09-23 02:12:37.000000000 +0200 +++ /work/SRC/openSUSE:Factory/.man.new/man-db-2.6.3-chinese.dif 2012-10-07 19:53:35.000000000 +0200 @@ -1,37 +1,25 @@ ---- src/encodings.c -+++ src/encodings.c 2008-08-12 15:26:22.959763175 +0200 -@@ -106,6 +106,11 @@ static struct directory_entry directory_ - { "cs", "ISO-8859-2", "ISO-8859-2" }, /* Czech */ - { "hr", "ISO-8859-2", "ISO-8859-2" }, /* Croatian */ - { "hu", "ISO-8859-2", "ISO-8859-2" }, /* Hungarian */ -+ { "zh_TW", "BIG5", "BIG5" }, /* Traditional Chinese */ -+ { "zh_HK", "BIG5HKSCS", "BIG5HKSCS" }, /* Traditional Chinese */ -+ { "zh_CN", "GB18030", "GB18030" }, /* Simplified Chinese */ -+ { "zh_SG", "GB18030", "GB18030" }, /* Simplified Chinese */ -+ { "zh", "GB18030", "GB18030" }, /* Simplified Chinese */ - { "ja", "EUC-JP", "EUC-JP" }, /* Japanese */ - { "ko", "EUC-KR", "EUC-KR" }, /* Korean */ - { "pl", "ISO-8859-2", "ISO-8859-2" }, /* Polish */ -@@ -208,6 +213,7 @@ static struct charset_entry charset_tabl +--- lib/encodings.c ++++ lib/encodings.c 2012-10-01 14:42:07.895867558 +0000 +@@ -224,6 +224,7 @@ static struct charset_entry charset_tabl { "EUC-CN", "nippon" }, { "EUC-JP", "nippon" }, { "EUC-TW", "nippon" }, + { "GB18030", "nippon" }, { "GBK", "nippon" }, - #endif /* MULTIBYTE_GROFF */ - -@@ -281,6 +287,7 @@ static struct less_charset_entry less_ch - { "UTF-8", "utf-8", NULL }, + # else /* !MULTIBYTE_GROFF */ + /* If we have a smarter version of groff, this is better dealt with +@@ -311,6 +312,7 @@ static struct less_charset_entry less_ch #ifdef MULTIBYTE_GROFF + { "CP1251", "windows", NULL }, + { "GB18030", "zh", NULL }, { "EUC-JP", "iso8859", "japanese-ujis" }, { "KOI8-R", "koi8-r", NULL }, - #endif /* MULTIBYTE_GROFF */ -@@ -405,6 +412,13 @@ char *get_page_encoding (const char *lan - * roff encoding = UTF-8 - * output encoding = UTF-8 - * EUC-JP -> iconv -> UTF-8 -> groff -Tutf8 -> UTF-8 + /* close enough? */ +@@ -502,6 +504,13 @@ char *get_page_encoding (const char *lan + * roff encoding = ISO-8859-15 + * output encoding = ISO-8859-15 + * ISO-8859-15 -> groff -Tascii8 -> ISO-8859-15 -> iconv -> UTF-8 + * + * /usr/share/man/zh_CN.GB18030, locale zh_CN.UTF-8 + * page encoding = GB18030 @@ -42,7 +30,7 @@ */ const char *get_source_encoding (const char *lang) { -@@ -545,7 +559,7 @@ static int compatible_encodings (const c +@@ -654,7 +663,7 @@ static int compatible_encodings (const c */ if ((STREQ (input, "BIG5") || STREQ (input, "BIG5HKSCS") || STREQ (input, "EUC-JP") || @@ -51,7 +39,7 @@ STREQ (input, "EUC-KR") || STREQ (input, "EUC-TW")) && STREQ (output, "UTF-8")) -@@ -639,7 +653,7 @@ const char *get_roff_encoding (const cha +@@ -758,7 +767,7 @@ const char *get_roff_encoding (const cha STRNEQ (ctype, "zh_HK", 5) || STRNEQ (ctype, "zh_SG", 5) || STRNEQ (ctype, "zh_TW", 5)) ++++++ man-db-2.4.3-firefox.dif -> man-db-2.6.3-firefox.dif ++++++ --- /work/SRC/openSUSE:Factory/man/man-db-2.4.3-firefox.dif 2011-09-23 02:12:37.000000000 +0200 +++ /work/SRC/openSUSE:Factory/.man.new/man-db-2.6.3-firefox.dif 2012-10-07 19:53:35.000000000 +0200 @@ -1,6 +1,6 @@ --- src/man.c -+++ src/man.c 2007-07-18 12:45:24.091833039 +0000 -@@ -2031,21 +2031,23 @@ static void format_display (pipeline *de ++++ src/man.c 2012-10-01 14:34:29.003506558 +0000 +@@ -2312,21 +2312,23 @@ static void format_display (pipeline *de if (!status) break; } @@ -16,7 +16,7 @@ } + if (!status) + sleep(5); /* firefox runs into background to fast */ - if (remove_directory (htmldir) == -1) + if (remove_directory (htmldir, 0) == -1) error (0, errno, _("can't remove directory %s"), htmldir); free (htmlfile); ++++++ man-db-2.5.1-listall.dif -> man-db-2.6.3-listall.dif ++++++ --- /work/SRC/openSUSE:Factory/man/man-db-2.5.1-listall.dif 2011-09-23 02:12:37.000000000 +0200 +++ /work/SRC/openSUSE:Factory/.man.new/man-db-2.6.3-listall.dif 2012-10-07 19:53:35.000000000 +0200 @@ -1,6 +1,6 @@ --- src/man.c -+++ src/man.c 2008-11-28 13:12:22.171541000 +0100 -@@ -3223,12 +3223,132 @@ static int locate_page (const char *manp ++++ src/man.c 2008-11-28 12:12:22.000000000 +0000 +@@ -3712,12 +3712,132 @@ static int locate_page (const char *manp return found; } @@ -133,7 +133,7 @@ global_manpath = is_global_mandir (candp->path); if (!global_manpath) drop_effective_privs (); -@@ -3250,9 +3370,51 @@ static int display_pages (struct candida +@@ -3739,9 +3859,51 @@ static int display_pages (struct candida regain_effective_privs (); if (found && !findall) ++++++ man-db-2.6.3-man0.dif ++++++ --- man/de/man1/man.1 +++ man/de/man1/man.1 @@ -79,6 +79,9 @@ und den Typ der dort zu findenden Seiten .TS tab (@); l lx. +0@T{ +Dateiheader (gewöhnlich in \fI/usr/include\fR) +T} 1@T{ Ausführbare Programme oder Shell\-Befehle T} --- man/es/man1/man.1 +++ man/es/man1/man.1 @@ -101,6 +101,9 @@ del manual y los tipos de páginas que c .TS tab (@); l lx. +0@T{ +Ficheros (se encuentran generalmente en \fI/usr/include\fR) +T} 1@T{ Programas ejecutables y guiones del intérprete de órdenes T} --- man/it/man1/man.1 +++ man/it/man1/man.1 @@ -124,6 +124,9 @@ del manuale seguiti dai tipi di pagine c .TS tab (@); l lx. +0@T{ +File (di solito trovabili in \fI/usr/include\fR) +T} 1@T{ Programmi eseguibili e comandi della shell T} --- man/ja/man1/man.1 +++ man/ja/man1/man.1 @@ -73,6 +73,9 @@ man \- オンラインマニュアルの .TS tab (@); l lx. +0@T{ +(\fIusr/include\fP) +T} 1@T{ 実行プログラムまたはシェルコマンド T} --- man/man1/man.1 +++ man/man1/man.1 @@ -179,6 +179,9 @@ numbers of the manual followed by the ty .TS tab (@); l lx. +0@T{ +Header files (usually found in \fI/usr/include\fR) +T} 1@T{ Executable programs or shell commands T} ++++++ man-db-2.4.3-section.dif -> man-db-2.6.3-section.dif ++++++ --- /work/SRC/openSUSE:Factory/man/man-db-2.4.3-section.dif 2011-09-23 02:12:37.000000000 +0200 +++ /work/SRC/openSUSE:Factory/.man.new/man-db-2.6.3-section.dif 2012-10-07 19:53:35.000000000 +0200 @@ -1,6 +1,6 @@ --- src/man.c -+++ src/man.c 2006-06-13 14:01:19.000000000 +0000 -@@ -1142,7 +1142,7 @@ static inline const char *is_section (co ++++ src/man.c 2012-10-01 14:24:23.251006952 +0000 +@@ -1368,7 +1368,7 @@ static inline const char *is_section (co { const char **vs; @@ -9,17 +9,16 @@ if (STREQ (*vs, name)) return name; /* allow e.g. 3perl but disallow 8139too and libfoo */ -@@ -2565,7 +2565,8 @@ static int compare_candidates (const str +@@ -2943,7 +2943,7 @@ static int compare_candidates (const str + /* Find out whether lsource->ext is ahead of rsource->ext in * section_list. */ - const char **sp; - for (sp = section_list; *sp; ++sp) { -+ + for (sp = section_list; sp && *sp; ++sp) { if (!*(*sp + 1)) { /* No extension */ - if (!sec_left && **sp == *(left->ext)) -@@ -3209,7 +3210,7 @@ static int man (const char *name, int *f + if (!sec_left && **sp == *(lsource->ext)) +@@ -3918,7 +3918,7 @@ static int man (const char *name, int *f } else { const char **sp; ++++++ man-db-2.5.1-security4.dif -> man-db-2.6.3-security4.dif ++++++ --- /work/SRC/openSUSE:Factory/man/man-db-2.5.1-security4.dif 2011-09-23 02:12:37.000000000 +0200 +++ /work/SRC/openSUSE:Factory/.man.new/man-db-2.6.3-security4.dif 2012-10-07 19:53:35.000000000 +0200 @@ -1,17 +1,17 @@ --- src/mandb.c -+++ src/mandb.c 2008-04-21 13:06:01.440910914 +0200 -@@ -36,6 +36,7 @@ ++++ src/mandb.c 2012-10-01 14:30:11.619507260 +0000 +@@ -37,6 +37,7 @@ #include <errno.h> #include <sys/types.h> #include <sys/stat.h> /* for chmod() */ +#include <fcntl.h> /* for open () */ #include <dirent.h> #include <unistd.h> - -@@ -414,11 +415,20 @@ static short mandb (const char *catpath, - char pid[23]; - short amount; + #include <signal.h> +@@ -420,11 +421,20 @@ static int mandb (const char *catpath, c char *dbname; + char *cachedir_tag; + struct stat st; + int fd; dbname = mkdbname (catpath); @@ -29,4 +29,20 @@ + if (!quiet) printf (_("Processing manual pages under %s...\n"), manpath); - #ifdef NDBM + +@@ -432,6 +442,7 @@ static int mandb (const char *catpath, c + if (stat (cachedir_tag, &st) == -1 && errno == ENOENT) { + FILE *cachedir_tag_file; + ++ drop_effective_privs (); + cachedir_tag_file = fopen (cachedir_tag, "w"); + if (cachedir_tag_file) { + fputs ("Signature: 8a477f597d28d172789f06886806bc55\n" +@@ -443,6 +454,7 @@ static int mandb (const char *catpath, c + cachedir_tag_file); + fclose (cachedir_tag_file); + } ++ regain_effective_privs (); + } + free (cachedir_tag); + ++++++ man-db-2.5.1-zio.dif -> man-db-2.6.3-zio.dif ++++++ --- /work/SRC/openSUSE:Factory/man/man-db-2.5.1-zio.dif 2011-09-23 02:12:37.000000000 +0200 +++ /work/SRC/openSUSE:Factory/.man.new/man-db-2.6.3-zio.dif 2012-10-07 19:53:35.000000000 +0200 @@ -1,23 +1,22 @@ --- config.h.in -+++ config.h.in 2007-12-07 15:50:23.000000000 +0100 -@@ -454,6 +454,9 @@ ++++ config.h.in 2012-10-02 09:06:48.591006953 +0000 +@@ -674,6 +674,9 @@ /* Define to 1 if you have the `z' library (-lz). */ #undef HAVE_LIBZ +/* Define to 1 if you have libzio for opening compressed manuals */ +#undef HAVE_ZIO + - /* Define to 1 if you have the <limits.h> header file. */ - #undef HAVE_LIMITS_H + /* Define to 1 if you have the <linewrap.h> header file. */ + #undef HAVE_LINEWRAP_H --- configure.ac -+++ configure.ac 2008-04-21 13:18:38.854059561 +0200 -@@ -94,7 +94,18 @@ AC_ARG_WITH(sections, ++++ configure.ac 2012-10-02 09:55:06.783914808 +0000 +@@ -98,6 +98,18 @@ AC_ARG_WITH([sections], sections="$withval" fi], [: ${sections=1 n l 8 3 2 5 4 9 6 7}]) -- -+AC_ARG_WITH(zio, ++AC_ARG_WITH([zio], +[AS_HELP_STRING([--with-zio=LIBRARY], [use zlib/libbz2 wrapper library LIBRARY (libzio)])], + [if test -z "$withval" -o "$withval" = "yes" + then @@ -28,13 +27,13 @@ + else + zio=$withval + fi], -+ : ${zio=no}) - # Finish the argument parsing. - AC_SUBST(man_owner)dnl - AC_SUBST(man_mode)dnl -@@ -294,6 +305,29 @@ AC_SUBST(gunzip) - AC_SUBST(uncompress) - AC_SUBST(bunzip2) ++ [: ${zio=no}]) + AC_ARG_ENABLE([automatic-create], + [AS_HELP_STRING([--enable-automatic-create], [allow man to create user databases on the fly])], + [if test "$enableval" = "yes" +@@ -375,6 +387,46 @@ AC_SUBST([unlzma]) + AC_SUBST([unxz]) + AC_SUBST([unlzip]) MAN_COMPRESS_LIB([z], [gzopen]) +dnl Check for zlib and libbz2 libraries to use this together +dnl with SuSE's libzio to open compressed info files. @@ -44,26 +43,43 @@ + AC_CHECK_HEADER(zio.h,[ + for lib in ${zio#lib} zio + do -+ AC_CHECK_LIB($lib, fzopen, [LIBS="-l$lib $LIBS" -+ AC_DEFINE([COMP_SRC],[],[Define if you have compressors and want to support compressed cat files.]) -+ AC_DEFINE([HAVE_ZIO],[],[Define to 1 if you have libzio for opening compressed manuals])]) -+ done]) -+ AC_CHECK_HEADER(zlib.h,[ -+ for lib in z gz -+ do -+ AC_CHECK_LIB($lib, gzopen, [LIBS="$LIBS -Wl,--no-as-needed -l$lib" ; break]) -+ done]) -+ AC_CHECK_HEADER(bzlib.h,[ -+ for lib in bz2 bzip2 -+ do -+ AC_CHECK_LIB($lib, BZ2_bzopen, [LIBS="$LIBS -Wl,--no-as-needed -l$lib" ; break]) -+ done]) ++ AC_CHECK_LIB($lib, fzopen, [LIBS="-l$lib $LIBS"; am_cv_libzio=yes]) ++ done ++ ]) ++ if test "$am_cv_libzio" = yes; then ++ AC_DEFINE([COMP_SRC],[],[Define if you have compressors and want to support compressed cat files.]) ++ AC_DEFINE([HAVE_ZIO],[],[Define to 1 if you have libzio for opening compressed manuals]) ++ AC_CHECK_HEADER(zlib.h,[ ++ for lib in z gz ++ do ++ AC_CHECK_LIB($lib, gzopen, [LIBS="$LIBS -Wl,--no-as-needed -l$lib"; break]) ++ done ++ ]) ++ AC_CHECK_HEADER(bzlib.h,[ ++ for lib in bz2 bzip2 ++ do ++ AC_CHECK_LIB($lib, BZ2_bzopen, [LIBS="$LIBS -Wl,--no-as-needed -l$lib"; break]) ++ done ++ ]) ++ AC_CHECK_HEADER(lzmadec.h, [ ++ for lib in lzma lzmadec ++ do ++ AC_CHECK_LIB($lib, lzmadec_open, [LIBS="$LIBS -Wl,--no-as-needed -l$lib"; break]) ++ done ++ ]) ++ AC_CHECK_HEADER(lzma.h, [ ++ for lib in lzma ++ do ++ AC_CHECK_LIB($lib, lzma_easy_encoder, [LIBS="$LIBS -Wl,--no-as-needed -l$lib"; break]) ++ done ++ ]) ++ fi +fi dnl To add more decompressors just follow the scheme above. # Work out which manual page hierarchy scheme might be in use. --- lib/decompress.c -+++ lib/decompress.c 2008-04-23 10:48:04.431353342 +0000 ++++ lib/decompress.c 2012-10-02 09:05:43.787007258 +0000 @@ -36,6 +36,10 @@ # include "zlib.h" #endif /* HAVE_LIBZ */ @@ -75,7 +91,7 @@ #include "manconfig.h" #include "comp_src.h" #include "pipeline.h" -@@ -66,6 +70,32 @@ static void decompress_zlib (void *data +@@ -66,6 +70,32 @@ static void decompress_zlib (void *data #endif /* HAVE_LIBZ */ @@ -107,55 +123,38 @@ + pipeline *decompress_open (const char *filename) { - command *cmd; -@@ -77,9 +107,53 @@ pipeline *decompress_open (const char *f - char *ext; - struct compression *comp; - -- if (stat (filename, &st) < 0 && !S_ISDIR (st.st_mode)) -+ if (stat (filename, &st) < 0 || S_ISDIR (st.st_mode)) + pipecmd *cmd; +@@ -80,6 +110,37 @@ pipeline *decompress_open (const char *f + if (stat (filename, &st) < 0 || S_ISDIR (st.st_mode)) return NULL; +#ifdef HAVE_ZIO -+ ext = strrchr(filename, '.'); -+ if (ext && STREQ (ext, ".gz")) { -+ /* informational only; no shell quoting concerns */ -+ char *name = appendstr (NULL, "zcat < ", filename, NULL); -+ cmd = command_new_function (name, &decompress_zio, "g"); -+ free (name); -+ p = pipeline_new_commands (cmd, NULL); -+ if (strcmp(program_name, "mandb") == 0) -+ p->libzio = 1; -+ goto got_pipeline; -+ } -+ if (ext && STREQ (ext, ".z")) { -+ /* informational only; no shell quoting concerns */ -+ char *name = appendstr (NULL, "zcat < ", filename, NULL); -+ cmd = command_new_function (name, &decompress_zio, "z"); -+ free (name); -+ p = pipeline_new_commands (cmd, NULL); -+ if (strcmp(program_name, "mandb") == 0) -+ p->libzio = 1; -+ goto got_pipeline; -+ } -+ if (ext && STREQ (ext, ".bz2")) { -+ /* informational only; no shell quoting concerns */ -+ char *name = appendstr (NULL, "bzcat < ", filename, NULL); -+ cmd = command_new_function (name, &decompress_zio, "b"); -+ free (name); -+ p = pipeline_new_commands (cmd, NULL); -+ if (strcmp(program_name, "mandb") == 0) -+ p->libzio = 1; -+ goto got_pipeline; -+ } -+ if (ext && STREQ (ext, ".Z")) { ++ ext = strrchr (filename, '.'); ++ if (ext) { ++ const char *opt; ++ char *name; ++ ++ if (STREQ (ext, ".gz")) ++ opt = "g"; ++ else if (STREQ (ext, ".z")) ++ opt = "z"; ++ else if (STREQ (ext, ".bz2")) ++ opt = "b"; ++ else if (STREQ (ext, ".xz")) ++ opt = "x"; ++ else if (STREQ (ext, ".lzma")) ++ opt = "l"; ++ else if (STREQ (ext, ".Z")) ++ opt = "Z"; ++ else ++ goto nozio; ++ + /* informational only; no shell quoting concerns */ -+ char *name = appendstr (NULL, "zcat < ", filename, NULL); -+ cmd = command_new_function (name, &decompress_zio, "Z"); ++ name = appendstr (NULL, "libzio < ", filename, NULL); ++ cmd = pipecmd_new_function (name, &decompress_zio, NULL, ++ opt); + free (name); + p = pipeline_new_commands (cmd, NULL); -+ if (strcmp(program_name, "mandb") == 0) -+ p->libzio = 1; + goto got_pipeline; + } +#endif /* HAVE_ZIO */ @@ -163,143 +162,15 @@ #ifdef HAVE_LIBZ filename_len = strlen (filename); if (filename_len > 3 && STREQ (filename + filename_len - 3, ".gz")) { ---- lib/pipeline.c -+++ lib/pipeline.c 2008-04-23 10:52:16.655715088 +0000 -@@ -50,6 +50,10 @@ - #include "error.h" - #include "pipeline.h" - -+#ifdef HAVE_ZIO -+# include "zio.h" -+#endif /* HAVE_ZIO */ -+ - /* ---------------------------------------------------------------------- */ - - /* Functions to build individual commands. */ -@@ -441,6 +445,9 @@ pipeline *pipeline_new (void) - p->commands = xnmalloc (p->commands_max, sizeof *p->commands); - p->pids = NULL; - p->statuses = NULL; -+#ifdef HAVE_ZIO -+ p->libzio = 0; -+#endif - p->want_in = p->want_out = 0; - p->want_infile = p->want_outfile = NULL; - p->infd = p->outfd = -1; -@@ -479,6 +486,9 @@ pipeline *pipeline_join (pipeline *p1, p - pipeline *p = XMALLOC (pipeline); - int i; - -+#ifdef HAVE_ZIO -+ assert (p->libzio); -+#endif - assert (!p1->pids); - assert (!p2->pids); - assert (!p1->statuses); -@@ -614,6 +624,9 @@ void pipeline_commands (pipeline *p, ... - - FILE *pipeline_get_infile (pipeline *p) - { -+#ifdef HAVE_ZIO -+ assert (!p->libzio); -+#endif - assert (p->pids); /* pipeline started */ - assert (p->statuses); - if (p->infile) -@@ -627,6 +640,12 @@ FILE *pipeline_get_infile (pipeline *p) - - FILE *pipeline_get_outfile (pipeline *p) - { -+#ifdef HAVE_ZIO -+ if (p->libzio) { -+ assert (p->outfile != (FILE*)0); -+ return p->outfile; -+ } -+#endif - assert (p->pids); /* pipeline started */ - assert (p->statuses); - if (p->outfile) -@@ -707,6 +726,24 @@ void pipeline_start (pipeline *p) - int infd[2]; - sigset_t set, oset; - -+#ifdef HAVE_ZIO -+ if (p->ncommands != 1) /* A pipe to the following commands required */ -+ p->libzio = 0; -+ -+ if (p->libzio) { -+ struct command_function *cmdf; -+ -+ assert (p->ncommands == 1); -+ assert (p->commands[0]->tag == COMMAND_FUNCTION); -+ assert (p->want_infile != NULL); -+ -+ cmdf = &p->commands[0]->u.function; -+ -+ p->outfile = fzopen(p->want_infile, "r"); -+ -+ return; -+ } -+#endif - /* Flush all pending output so that subprocesses don't inherit it. */ - fflush (NULL); - -@@ -1009,6 +1046,19 @@ int pipeline_wait (pipeline *p) - pipeline_dump (p, stderr); +@@ -93,7 +154,11 @@ pipeline *decompress_open (const char *f } + #endif /* HAVE_LIBZ */ +#ifdef HAVE_ZIO -+ if (p->libzio) { -+ assert (p->outfile != (FILE*)0); -+ if (fclose (p->outfile)) { -+ error (0, errno, _("closing pipeline output stream failed")); -+ ret = 1; -+ } -+ p->outfile = (FILE*)0; -+ p->outfd = -1; -+ return ret; -+ } -+#endif -+ - assert (p->pids); /* pipeline started */ - assert (p->statuses); - -@@ -1549,11 +1599,20 @@ static const char *get_block (pipeline * - - if (!peek) - p->peek_offset = 0; -- -+#ifdef HAVE_ZIO -+ if (p->libzio) { -+ assert (p->outfile != (FILE*)0); -+ r = fread (p->buffer + readstart, sizeof(char), toread, p->outfile); -+ goto out; -+ } -+#endif - assert (p->outfd != -1); - r = read (p->outfd, p->buffer + readstart, toread); - if (r == -1) - return NULL; -+#ifdef HAVE_ZIO -+out: -+#endif - p->buflen = readstart + r; - if (peek) - p->peek_offset += r; ---- lib/pipeline.h -+++ lib/pipeline.h 2008-04-22 13:52:44.846881571 +0000 -@@ -60,6 +60,14 @@ typedef struct pipeline { - pid_t *pids; - int *statuses; /* -1 until command exits */ ++nozio: ++#else + ext = strrchr (filename, '.'); ++#endif /* HAVE_LIBZ */ + if (ext) { + ++ext; -+#ifdef HAVE_ZIO -+ /* -+ * Uses for e.g. simple decompression the help of libzio. -+ * Do not fork in this case but open the compressed files. -+ */ -+ int libzio; -+#endif -+ - /* To be set by the caller. If positive, these contain - * caller-supplied file descriptors for the input and output of the - * whole pipeline. If negative, pipeline_start() will create pipes ++++++ man-db-2.4.3-firefox.dif -> man-db-2.6.3.dif ++++++ ++++ 1274 lines (skipped) ++++ between /work/SRC/openSUSE:Factory/man/man-db-2.4.3-firefox.dif ++++ and /work/SRC/openSUSE:Factory/.man.new/man-db-2.6.3.dif ++++++ wrapper.c ++++++ /* * wrapper.c - wrapper program around man and mandb * * Copyright (C) 2000 Fabrizio Polacco <[email protected]> * Copyright (C) 2001, 2002 Colin Watson. * * This file is part of man-db. * * man-db 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. * * man-db 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 man-db; if not, write to the Free Software Foundation, * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */ #ifdef HAVE_CONFIG_H # include "config.h" #endif /* HAVE_CONFIG_H */ #include <string.h> #include <stdio.h> #include <unistd.h> #include <errno.h> #include <grp.h> #include <pwd.h> #include <grp.h> #include <sys/types.h> #include <stdlib.h> #include <string.h> #include "dirname.h" #include "gettext.h" #include <locale.h> #define _(Text) gettext (Text) #include "manconfig.h" /* this list is used to authenticate the program running. * it is fixed at compile time to avoid a full class of * dangers ... */ static struct { const char *prog; const char *run; const char *user; } *wlp, wrapped_list[] = { /* prog run user */ #ifdef DEBUG { "_man", "src/man", "man" }, { "_mandb", "src/mandb", "man" }, #endif { "man", "/usr/lib/man-db/man", "man" }, { "mandb", "/usr/lib/man-db/mandb", "man" }, { 0, 0, 0, }}; char *program_name; int main (int argc, char **argv, char *envp[]) { uid_t ruid, euid; gid_t rgid; struct passwd *pwd; argc = argc; /* not used */ /* We don't warn about this setlocale() call failing, as the program * we call will do that. */ setlocale (LC_ALL, ""); bindtextdomain (PACKAGE, LOCALEDIR); bindtextdomain (PACKAGE "-gnulib", LOCALEDIR); textdomain (PACKAGE); /* this wrapper can be run as "man" or as "mandb" */ program_name = base_name (argv[0]); ruid = getuid (); euid = geteuid(); rgid = getgid (); #ifdef DEBUG printf ("%s:\n", program_name); #endif for (wlp = wrapped_list; wlp->prog && strcmp (program_name, wlp->prog); ++wlp) /* __asm__ __volatile__("": : :"memory") */; if (!wlp->prog) { fprintf (stderr, _("Don't know which program should I run being >%s<\n"), program_name); return -ENOENT; } #ifdef DEBUG printf ("%s\n", wlp->run); #endif if (ruid == 0 || euid == 0) { pwd = getpwnam (wlp->user); if (!pwd) { fprintf (stderr, _("%s: Failed su to user %s\n"), wlp->prog, wlp->user); return -EACCES; } if (ruid == 0) { ruid = pwd->pw_uid; rgid = pwd->pw_gid; } else { #ifndef MAN_CATS /* No permissions required to create files * under the sub directories of /var/cache/man */ pwd->pw_uid = ruid; pwd->pw_gid = rgid; #endif } if (setregid (rgid, pwd->pw_gid)) { fprintf (stderr, _("%s: Failed su to user %s\n"), wlp->prog, wlp->user); return -EACCES; } if (initgroups (wlp->user, rgid)) { fprintf (stderr, _("%s: Failed su to user %s\n"), wlp->prog, wlp->user); return -EACCES; } if (setreuid (ruid, pwd->pw_uid)) { fprintf (stderr, _("%s: Failed su to user %s\n"), wlp->prog, wlp->user); return -EACCES; } } execve (wlp->run, argv, envp); perror ("execve"); return -errno; } -- To unsubscribe, e-mail: [email protected] For additional commands, e-mail: [email protected]
