From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: From: Vitaly Lipatov Organization: ALT Linux Team To: ALT Devel discussion list Subject: Re: [devel] =?koi8-r?b?7yDLz8TJ0s/Xy8UgzsHa18HOycogxsHKzM/XINDSyQ==?= =?koi8-r?b?IM3PztTJ0s/Xwc7JyQ==?= Date: Sun, 20 Feb 2005 17:37:56 +0300 User-Agent: KMail/1.7.2 References: <200502182016.33260.lav@altlinux.ru> In-Reply-To: <200502182016.33260.lav@altlinux.ru> MIME-Version: 1.0 Content-Type: Multipart/Mixed; boundary="Boundary-00=_FDKGCSeQHXulneW" Message-Id: <200502201737.57487.lav@altlinux.ru> X-BeenThere: devel@altlinux.ru X-Mailman-Version: 2.1.5 Precedence: list Reply-To: ALT Devel discussion list List-Id: ALT Devel discussion list List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Sun, 20 Feb 2005 14:39:49 -0000 Archived-At: List-Archive: List-Post: --Boundary-00=_FDKGCSeQHXulneW Content-Type: text/plain; charset="koi8-r" Content-Disposition: inline Content-Transfer-Encoding: 8bit On Friday 18 February 2005 20:16, Vitaly Lipatov wrote: > Возвращаясь к вопросу монтирования "чужих" файловых систем. > Мне кажется, это можно решить достаточно просто. > Проще всего умолчания о кодировках передавать через команду > mount, поскольку большинство операций монтирования происходит > через неё. Выпущен первый релиз библиотеки libnatspec (ушла в Incoming) До появления в Сизифе можно скачать пакеты на ftp://ftp.altlinux.ru/pub/people/lav/natspec Базой для библиотеки послужил анализ кода следующих проектов: - wine, kernel, gettext, glibc, glib, mount, submount Библиотека определяет такие важные понятия, как - кодировка локальной файловой системы (filename encoding) - системная локаль (system locale) - кодировка (charset) и кодовая таблица (codepage) иных операционных систем (WIN,DOS,MAC) для данной локали. и предоставляет API для их использования. Это позволяет: - добавить в mount/submount автоматическое добавление параметров для перекодировки (пример патча приложен) Имеется консольная программа, позволяющая получать опеределённые в библиотеке параметры. Например $ natspec -l - показать системную локаль $ natspec -i - вывести всю доступную информацию (просьба посмотреть и высказать свои замечания по качеству определения ситуации на вашей машине) 2inger: Особенно интересно ваше мнение по поводу mount и приложенного патча. 2zerg and 2inger: Мне собирать пакет для обкатки в Дедале (если это необходимо)? 2rider: Я надеюсь, что подобный подход позволит решить все проблемы с параметрами iocharset и подобными для hotplug и иже с ним. -- Lav Виталий Липатов Санкт-Петербург GNU! ALT Linux Team! LaTeX! LyX! --Boundary-00=_FDKGCSeQHXulneW Content-Type: text/x-diff; charset="koi8-r"; name="submountd-0.9-mountcs.patch" Content-Disposition: attachment; filename="submountd-0.9-mountcs.patch" Content-Transfer-Encoding: 7bit --- /home/lav/work/build/BUILD/submount-0.9/submountd-0.9/configure.ac 2005-02-20 17:24:46 +0300 +++ submountd-0.9/configure.ac 2005-02-20 15:46:30 +0300 @@ -37,6 +37,15 @@ fi AC_SUBST(LIB_RESMGR) +# Checks for libnatspec. +check_natspec="" +AC_CHECK_LIB([natspec], [main], check_natspec=true) +if test ! "x$check_natspec" == x ; then +NATSPEC_LIBS=-lnatspec +AC_SUBST(NATSPEC_LIBS) +AC_DEFINE(HAVE_natspec,1,[Define if you have the natspec library]) +fi + AC_PREFIX_DEFAULT(/) AC_CONFIG_FILES([Makefile]) AC_OUTPUT --- /home/lav/work/build/BUILD/submount-0.9/submountd-0.9/Makefile.am 2005-02-20 17:24:46 +0300 +++ submountd-0.9/Makefile.am 2005-02-20 15:49:35 +0300 @@ -2,7 +2,7 @@ sbin_PROGRAMS = submountd net-submountd submountd_SOURCES = submountd.c mount_guess_fstype.c -submountd_LDADD = $(LIB_RESMGR) +submountd_LDADD = $(LIB_RESMGR) $(NATSPEC_LIBS) net_submountd_SOURCES = net-submountd.c man_MANS = submount.8 --- /home/lav/work/build/BUILD/submount-0.9/submountd-0.9/submountd.c 2005-02-20 17:24:46 +0300 +++ submountd-0.9/submountd.c 2005-02-20 15:56:00 +0300 @@ -40,6 +40,10 @@ #include #endif +#ifdef HAVE_natspec +#include +#endif + #include "submountd.h" @@ -163,6 +167,9 @@ unsigned long flags, char *options) { int retval; +#ifdef HAVE_natspec + char *mount_opts; +#endif #if USE_RESMGR struct passwd *pwd; int uid = 0; @@ -190,7 +197,15 @@ } } #endif + +#ifndef HAVE_natspec retval = mount(device, mountpoint, fstype, flags, options); +#else + mount_opts = strdup(options); + natspec_enrich_fs_options(fstype, &mount_opts); + retval = mount(device, mountpoint, fstype, flags, mount_opts); + free(mount_opts); +#endif if (retval) { if ((errno == EROFS) && (!(flags & MS_RDONLY))) { --Boundary-00=_FDKGCSeQHXulneW Content-Type: text/x-diff; charset="koi8-r"; name="util-linux-2.12p-mountcs.patch" Content-Disposition: attachment; filename="util-linux-2.12p-mountcs.patch" Content-Transfer-Encoding: 7bit Adds natspec support for automatic charset/codepage enriching Vitaly Lipatov --- /home/lav/work/build/BUILD/util-linux-2.12p/configure 2005-02-20 12:32:33 +0300 +++ configure 2005-02-20 03:45:46 +0300 @@ -747,3 +747,23 @@ echo "You don't have blkid" fi rm -f conftest conftest.c + +# +# 16. For mount, do we have natspec? +# +echo ' +#include +int main(){ exit(0); natspec_get_filename_encoding(""); } +' > conftest.c +LIBS="-lnatspec" +eval $compile +LIBS= +if test -s conftest; then + echo "#define HAVE_natspec" >> defines.h + echo "HAVE_NATSPEC=yes" >> make_include + echo "You have natspec" +else + echo "HAVE_NATSPEC=no" >> make_include + echo "You don't have natspec" +fi +rm -f conftest conftest.c --- /home/lav/work/build/BUILD/util-linux-2.12p/mount/Makefile 2005-02-20 12:32:33 +0300 +++ mount/Makefile 2005-02-20 03:51:40 +0300 @@ -25,6 +25,10 @@ BLKID_LIB = -lblkid -luuid endif +ifeq "$(HAVE_NATSPEC)" "yes" +BLKID_LIB := $(BLKID_LIB) -lnatspec +endif + PROGS = $(SUID_PROGS) $(NOSUID_PROGS) MAYBE = pivot_root swapoff --- /home/lav/work/build/BUILD/util-linux-2.12p/mount/mount.c 2005-02-20 17:22:10 +0300 +++ mount/mount.c 2005-02-20 15:35:28 +0300 @@ -45,6 +45,10 @@ #include "setproctitle.h" #endif +#ifdef HAVE_natspec +#include +#endif + /* True for fake mount (-f). */ static int fake = 0; @@ -470,8 +474,8 @@ */ static int guess_fstype_and_mount(const char *spec, const char *node, const char **types, - int flags, char *mount_opts) { - struct mountargs args = { spec, node, NULL, flags & ~MS_NOSYS, mount_opts }; + int flags, char **mount_opts) { + struct mountargs args = { spec, node, NULL, flags & ~MS_NOSYS, *mount_opts }; if (*types && strcasecmp (*types, "auto") == 0) *types = NULL; @@ -504,6 +508,9 @@ /* do last type below */ *types = t; } +#ifdef HAVE_natspec + args.data = natspec_enrich_fs_options(*types, mount_opts); +#endif if (*types || (flags & MS_REMOUNT)) { args.type = *types; @@ -819,6 +826,9 @@ suid_check(spec, node, &flags, &user); +#ifdef HAVE_natspec + extra_opts1 = natspec_enrich_fs_options(types, &extra_opts); +#endif mount_opts = extra_opts; if (opt_speed) @@ -867,8 +877,11 @@ if (!fake) mnt5_res = guess_fstype_and_mount (spec, node, &types, flags & ~MS_NOSYS, - mount_opts); - + &mount_opts); +#ifdef HAVE_natspec + if (mount_opts != extra_opts) + extra_opts1 = extra_opts = mount_opts; +#endif if (fake || mnt5_res == 0) { /* Mount succeeded, report this (if verbose) and write mtab entry. */ if (loop) --Boundary-00=_FDKGCSeQHXulneW--