1) Add mode_codeconv patches and option into Makefile (mod_codeconv allow change filename's charsets "on the fly") 2) Add "Cyrrilic charset fix" patch and option into Makefile 3) fix mode_nls patch problems Fix: Patch attached with submission follows: How-To-Repeat: # cd /usr/ports/ftp/proftpd ; make -DWITH_NLS
State Changed From-To: open->feedback Awaiting maintainers feedback
Maintainer approved. Please use the following patchset: diff -ruN --exclude=CVS /usr/ports/ftp/proftpd.orig/Makefile /usr/ports/ftp/proftpd/Makefile --- /usr/ports/ftp/proftpd.orig/Makefile Mon Jan 22 19:27:17 2007 +++ /usr/ports/ftp/proftpd/Makefile Tue Jan 23 10:30:35 2007 @@ -7,7 +7,7 @@ PORTNAME= proftpd DISTVERSION= 1.3.1rc2 -PORTREVISION= 2 +PORTREVISION= 3 CATEGORIES= ftp MASTER_SITES= ftp://ftp.proftpd.org/distrib/source/ \ ftp://ftp.fastorama.com/mirrors/ftp.proftpd.org/distrib/source/ \ @@ -32,9 +32,8 @@ USE_GMAKE= yes USE_BZIP2= yes -USE=AUTOTOOLS= autoconf:259 -GNU_CONFIGURE=yes - +USE_AUTOTOOLS= autoconf:259 +GNU_CONFIGURE= yes USE_RC_SUBR= proftpd.sh CONFIGURE_ARGS= --localstatedir=/var/run \ @@ -59,7 +58,9 @@ RADIUS "Include mod_radius" off \ QUOTATAB_RADIUS "include mod_quotatab_radius" off \ BAN "include mod_ban (Requires CTRLS)" off \ - NLS "Use nls (builds mod_lang)" off + NLS "Use nls (builds mod_lang)" off \ + CYRFIX "Use fix for cyrillic encoding" off \ + CODECONV "Use charset conversion (mod_codeconv)" off MODULES?= LIBDIRS?= @@ -139,6 +140,10 @@ EXTRA_PATCHES+= ${PATCHDIR}/extra-patch-nls-Makefile.in .endif +.if defined(WITH_CYRFIX) +EXTRA_PATCHES+= ${PATCHDIR}/extra-patch-cyrillic-fix-netio.c +.endif + #allow user to override MODULES?= mod_ratio:mod_readme:mod_rewrite:mod_wrap2:mod_ifsession @@ -195,6 +200,12 @@ .if defined(WITH_POSTGRESQL) || defined(WITH_MYSQL) MODULES:=${MODULES}:mod_quotatab_sql .endif +.endif + +.if defined(WITH_CODECONV) +MODULES:=${MODULES}:mod_codeconv +PROFTPD_LIBS+= -liconv -L${LOCALBASE}/lib +EXTRA_PATCHES+= ${FILESDIR}/extra-patch-mod-codeconv .endif # mod_ifsession should be the last item in the modules list diff -ruN --exclude=CVS /usr/ports/ftp/proftpd.orig/Makefile.in /usr/ports/ftp/proftpd/Makefile.in --- /usr/ports/ftp/proftpd.orig/Makefile.in Wed Dec 31 14:00:00 1969 +++ /usr/ports/ftp/proftpd/Makefile.in Tue Jan 23 10:39:40 2007 @@ -0,0 +1,193 @@ +@SET_MAKE@ + +top_builddir=. +top_srcdir=@top_srcdir@ +srcdir=@srcdir@ +VPATH=@srcdir@ +DESTDIR= + +include ./Make.rules + +DIRS=@ADDL_DIRS@ +EXEEXT=@EXEEXT@ +INSTALL_DEPS=@INSTALL_DEPS@ +LIBTOOL_DEPS=@LIBTOOL_DEPS@ +LIBLTDL=@LIBLTDL@ + +MAIN_LDFLAGS=@MAIN_LDFLAGS@ +MAIN_LIBS=@MAIN_LIBS@ + +BUILD_PROFTPD_OBJS=$(BUILD_OBJS) $(BUILD_STATIC_MODULE_OBJS) +BUILD_PROFTPD_ARCHIVES=$(BUILD_STATIC_MODULE_ARCHIVES) +BUILD_BIN=proftpd$(EXEEXT) ftpcount$(EXEEXT) ftpdctl$(EXEEXT) ftpshut$(EXEEXT) ftptop$(EXEEXT) ftpwho$(EXEEXT) + + +all: $(BUILD_BIN) + +include/buildstamp.h: + echo \#define BUILD_STAMP \"`date`\" >include/buildstamp.h + +dummy: + +lib: include/buildstamp.h dummy + cd lib/ && $(MAKE) lib + +src: include/buildstamp.h dummy + cd src/ && $(MAKE) src + +modules: include/buildstamp.h dummy + cd modules/ && $(MAKE) static + test -z "$(SHARED_MODULE_OBJS)" -a -z "$(SHARED_MODULE_DIRS)" || (cd modules/ && $(MAKE) shared) + +utils: include/buildstamp.h dummy + cd utils/ && $(MAKE) utils + +locale: include/buildstamp.h dummy + test -z "$(ENABLE_NLS)" || (cd locale/ && $(MAKE) locale) + +dirs: include/buildstamp.h dummy + @dirs="$(DIRS)"; \ + for dir in $$dirs; do \ + if [ -d "$$dir" ]; then cd $$dir/ && $(MAKE); fi; \ + done + +proftpd$(EXEEXT): lib src modules dirs locale + $(LIBTOOL) --mode=link $(CC) $(LDFLAGS) $(MAIN_LDFLAGS) -o $@ $(BUILD_PROFTPD_OBJS) $(BUILD_PROFTPD_ARCHIVES) $(LIBS) $(MAIN_LIBS) + +ftpcount$(EXEEXT): utils + $(CC) $(LDFLAGS) -o $@ $(BUILD_FTPCOUNT_OBJS) $(UTILS_LIBS) + +ftpdctl$(EXEEXT): src + $(CC) $(LDFLAGS) -o $@ $(BUILD_FTPDCTL_OBJS) $(LIBS) + +ftpshut$(EXEEXT): utils + $(CC) $(LDFLAGS) -o $@ $(BUILD_FTPSHUT_OBJS) $(UTILS_LIBS) + +ftptop$(EXEEXT): lib utils + $(CC) $(LDFLAGS) -o $@ $(BUILD_FTPTOP_OBJS) $(CURSES_LIBS) -lsupp -lintl + +ftpwho$(EXEEXT): lib utils + $(CC) $(LDFLAGS) -o $@ $(BUILD_FTPWHO_OBJS) -lsupp -lintl + + +# BSD install -d doesn't work, so ... +$(DESTDIR)$(datadir) $(DESTDIR)$(datadir)/locale $(DESTDIR)$(includedir) $(DESTDIR)$(includedir)/proftpd $(DESTDIR)$(libexecdir) $(DESTDIR)$(localstatedir) $(DESTDIR)$(sysconfdir) $(DESTDIR)$(rundir) $(DESTDIR)$(bindir) $(DESTDIR)$(sbindir) $(DESTDIR)$(mandir) $(DESTDIR)$(mandir)/man1 $(DESTDIR)$(mandir)/man5 $(DESTDIR)$(mandir)/man8: + @if [ ! -d $@ ]; then \ + mkdir -p $@; \ + chown $(INSTALL_USER):$(INSTALL_GROUP) $@; \ + chmod 0755 $@; \ + fi + +install-proftpd: proftpd $(DESTDIR)$(includedir) $(DESTDIR)$(localstatedir) $(DESTDIR)$(sysconfdir) $(DESTDIR)$(rundir) $(DESTDIR)$(sbindir) + $(INSTALL_SBIN) proftpd $(DESTDIR)$(sbindir)/proftpd + if [ -f $(DESTDIR)$(sbindir)/in.proftpd ] ; then \ + rm -f $(DESTDIR)$(sbindir)/in.proftpd ; \ + fi + ln -s proftpd $(DESTDIR)$(sbindir)/in.proftpd + -chown -h $(INSTALL_USER):$(INSTALL_GROUP) $(DESTDIR)$(sbindir)/in.proftpd + +install-headers: $(DESTDIR)$(includedir)/proftpd + $(INSTALL_MAN) config.h $(DESTDIR)$(includedir)/proftpd/config.h + cd include/ && $(MAKE) install + +install-locales: $(DESTDIR)$(datadir) $(DESTDIR)$(datadir)/locale + test -z "$(ENABLE_NLS)" || (cd locale/ && $(MAKE) install) + +install-modules: $(DESTDIR)$(libexecdir) + test -z "$(SHARED_MODULE_OBJS)" -a -z "$(SHARED_MODULE_DIRS)" || (cd modules/ && $(MAKE) install) + +install-utils: $(DESTDIR)$(sbindir) $(DESTDIR)$(bindir) + $(INSTALL_BIN) ftpcount $(DESTDIR)$(bindir)/ftpcount + $(INSTALL_BIN) ftpdctl $(DESTDIR)$(bindir)/ftpdctl + $(INSTALL_SBIN) ftpshut $(DESTDIR)$(sbindir)/ftpshut + $(INSTALL_BIN) ftptop $(DESTDIR)$(bindir)/ftptop + $(INSTALL_BIN) ftpwho $(DESTDIR)$(bindir)/ftpwho + +install-conf: $(DESTDIR)$(sysconfdir) + if [ ! -f $(DESTDIR)$(sysconfdir)/proftpd.conf ] ; then \ + $(INSTALL) -o $(INSTALL_USER) -g $(INSTALL_GROUP) -m 0644 \ + $(top_srcdir)/sample-configurations/basic.conf \ + $(DESTDIR)$(sysconfdir)/proftpd.conf ; \ + fi + +install-libltdl: + cd lib/libltdl/ && $(MAKE) install + +install-man: $(DESTDIR)$(mandir) $(DESTDIR)$(mandir)/man1 $(DESTDIR)$(mandir)/man5 $(DESTDIR)$(mandir)/man8 + $(INSTALL_MAN) $(top_srcdir)/src/ftpdctl.8 $(DESTDIR)$(mandir)/man8 + $(INSTALL_MAN) $(top_srcdir)/src/proftpd.8 $(DESTDIR)$(mandir)/man8 + $(INSTALL_MAN) $(top_srcdir)/utils/ftpshut.8 $(DESTDIR)$(mandir)/man8 + $(INSTALL_MAN) $(top_srcdir)/utils/ftpcount.1 $(DESTDIR)$(mandir)/man1 + $(INSTALL_MAN) $(top_srcdir)/utils/ftptop.1 $(DESTDIR)$(mandir)/man1 + $(INSTALL_MAN) $(top_srcdir)/utils/ftpwho.1 $(DESTDIR)$(mandir)/man1 + $(INSTALL_MAN) $(top_srcdir)/src/xferlog.5 $(DESTDIR)$(mandir)/man5 + +install-all: install-proftpd install-modules install-utils install-conf install-man install-headers install-locales $(INSTALL_DEPS) + +install: all install-all + +depend: + cd src/ && $(MAKE) depend + cd modules/ && $(MAKE) depend + cd lib/ && $(MAKE) depend + cd utils/ && $(MAKE) depend + +clean: + cd src/ && $(MAKE) clean + cd modules/ && $(MAKE) clean + cd lib/ && $(MAKE) clean + cd utils/ && $(MAKE) clean + cd locale/ && $(MAKE) clean + + @dirs="$(DIRS)"; \ + for dir in $$dirs; do \ + if [ -d "$$dir" ]; then cd $$dir/ && $(MAKE) clean; fi; \ + done + + rm -f include/buildstamp.h + rm -f $(BUILD_BIN) + +distclean: clean + cd lib/ && $(MAKE) distclean + rm -f Makefile Make.modules Make.rules \ + lib/Makefile modules/Makefile src/Makefile utils/Makefile + rm -f config.h config.status config.cache config.log libtool stamp-h + rm -f include/buildstamp.h + rm -rf .libs/ + +dist: depend distclean + rm -rf `find . -name CVS` + rm -rf `find . -name .cvsignore` + rm -rf `find . -name core` + rm -rf `find . -name '*~'` + rm -fr `find . -name '*.bak'` + # RPM needs this in the top-level directory in order to support '-t' + mv -f contrib/dist/rpm/proftpd.spec . + # Other users may need to execute these scripts + chmod a+x configure config.sub install-sh modules/glue.sh + + +# autoheader might not change config.h.in, so touch a stamp file. +${srcdir}/config.h.in: stamp-h.in +${srcdir}/stamp-h.in: configure.in acconfig.h + cd ${srcdir} && autoheader + echo timestamp > ${srcdir}/stamp-h.in + +config.h: stamp-h +stamp-h: config.h.in config.status + ./config.status + +${srcdir}/configure: configure.in + cd ${srcdir} && autoconf + +Make.rules: Make.rules.in config.status + ./config.status + +Makefile: Makefile.in Make.rules.in config.status + ./config.status + +config.status: configure + ./config.status --recheck + +libtool: $(LIBTOOL_DEPS) + $(SHELL) ./config.status --recheck diff -ruN --exclude=CVS /usr/ports/ftp/proftpd.orig/Makefile.in.orig /usr/ports/ftp/proftpd/Makefile.in.orig --- /usr/ports/ftp/proftpd.orig/Makefile.in.orig Wed Dec 31 14:00:00 1969 +++ /usr/ports/ftp/proftpd/Makefile.in.orig Tue Jan 9 17:19:02 2007 @@ -0,0 +1,193 @@ +@SET_MAKE@ + +top_builddir=. +top_srcdir=@top_srcdir@ +srcdir=@srcdir@ +VPATH=@srcdir@ +DESTDIR= + +include ./Make.rules + +DIRS=@ADDL_DIRS@ +EXEEXT=@EXEEXT@ +INSTALL_DEPS=@INSTALL_DEPS@ +LIBTOOL_DEPS=@LIBTOOL_DEPS@ +LIBLTDL=@LIBLTDL@ + +MAIN_LDFLAGS=@MAIN_LDFLAGS@ +MAIN_LIBS=@MAIN_LIBS@ + +BUILD_PROFTPD_OBJS=$(BUILD_OBJS) $(BUILD_STATIC_MODULE_OBJS) +BUILD_PROFTPD_ARCHIVES=$(BUILD_STATIC_MODULE_ARCHIVES) +BUILD_BIN=proftpd$(EXEEXT) ftpcount$(EXEEXT) ftpdctl$(EXEEXT) ftpshut$(EXEEXT) ftptop$(EXEEXT) ftpwho$(EXEEXT) + + +all: $(BUILD_BIN) + +include/buildstamp.h: + echo \#define BUILD_STAMP \"`date`\" >include/buildstamp.h + +dummy: + +lib: include/buildstamp.h dummy + cd lib/ && $(MAKE) lib + +src: include/buildstamp.h dummy + cd src/ && $(MAKE) src + +modules: include/buildstamp.h dummy + cd modules/ && $(MAKE) static + test -z "$(SHARED_MODULE_OBJS)" -a -z "$(SHARED_MODULE_DIRS)" || (cd modules/ && $(MAKE) shared) + +utils: include/buildstamp.h dummy + cd utils/ && $(MAKE) utils + +locale: include/buildstamp.h dummy + test -z "$(ENABLE_NLS)" || (cd locale/ && $(MAKE) locale) + +dirs: include/buildstamp.h dummy + @dirs="$(DIRS)"; \ + for dir in $$dirs; do \ + if [ -d "$$dir" ]; then cd $$dir/ && $(MAKE); fi; \ + done + +proftpd$(EXEEXT): lib src modules dirs locale + $(LIBTOOL) --mode=link $(CC) $(LDFLAGS) $(MAIN_LDFLAGS) -o $@ $(BUILD_PROFTPD_OBJS) $(BUILD_PROFTPD_ARCHIVES) $(LIBS) $(MAIN_LIBS) + +ftpcount$(EXEEXT): utils + $(CC) $(LDFLAGS) -o $@ $(BUILD_FTPCOUNT_OBJS) $(UTILS_LIBS) + +ftpdctl$(EXEEXT): src + $(CC) $(LDFLAGS) -o $@ $(BUILD_FTPDCTL_OBJS) $(LIBS) + +ftpshut$(EXEEXT): utils + $(CC) $(LDFLAGS) -o $@ $(BUILD_FTPSHUT_OBJS) $(UTILS_LIBS) + +ftptop$(EXEEXT): lib utils + $(CC) $(LDFLAGS) -o $@ $(BUILD_FTPTOP_OBJS) $(CURSES_LIBS) $(UTILS_LIBS) -lsupp + +ftpwho$(EXEEXT): lib utils + $(CC) $(LDFLAGS) -o $@ $(BUILD_FTPWHO_OBJS) $(UTILS_LIBS) -lsupp + + +# BSD install -d doesn't work, so ... +$(DESTDIR)$(datadir) $(DESTDIR)$(datadir)/locale $(DESTDIR)$(includedir) $(DESTDIR)$(includedir)/proftpd $(DESTDIR)$(libexecdir) $(DESTDIR)$(localstatedir) $(DESTDIR)$(sysconfdir) $(DESTDIR)$(rundir) $(DESTDIR)$(bindir) $(DESTDIR)$(sbindir) $(DESTDIR)$(mandir) $(DESTDIR)$(mandir)/man1 $(DESTDIR)$(mandir)/man5 $(DESTDIR)$(mandir)/man8: + @if [ ! -d $@ ]; then \ + mkdir -p $@; \ + chown $(INSTALL_USER):$(INSTALL_GROUP) $@; \ + chmod 0755 $@; \ + fi + +install-proftpd: proftpd $(DESTDIR)$(includedir) $(DESTDIR)$(localstatedir) $(DESTDIR)$(sysconfdir) $(DESTDIR)$(rundir) $(DESTDIR)$(sbindir) + $(INSTALL_SBIN) proftpd $(DESTDIR)$(sbindir)/proftpd + if [ -f $(DESTDIR)$(sbindir)/in.proftpd ] ; then \ + rm -f $(DESTDIR)$(sbindir)/in.proftpd ; \ + fi + ln -s proftpd $(DESTDIR)$(sbindir)/in.proftpd + -chown -h $(INSTALL_USER):$(INSTALL_GROUP) $(DESTDIR)$(sbindir)/in.proftpd + +install-headers: $(DESTDIR)$(includedir)/proftpd + $(INSTALL_MAN) config.h $(DESTDIR)$(includedir)/proftpd/config.h + cd include/ && $(MAKE) install + +install-locales: $(DESTDIR)$(datadir) $(DESTDIR)$(datadir)/locale + test -z "$(ENABLE_NLS)" || (cd locale/ && $(MAKE) install) + +install-modules: $(DESTDIR)$(libexecdir) + test -z "$(SHARED_MODULE_OBJS)" -a -z "$(SHARED_MODULE_DIRS)" || (cd modules/ && $(MAKE) install) + +install-utils: $(DESTDIR)$(sbindir) $(DESTDIR)$(bindir) + $(INSTALL_BIN) ftpcount $(DESTDIR)$(bindir)/ftpcount + $(INSTALL_BIN) ftpdctl $(DESTDIR)$(bindir)/ftpdctl + $(INSTALL_SBIN) ftpshut $(DESTDIR)$(sbindir)/ftpshut + $(INSTALL_BIN) ftptop $(DESTDIR)$(bindir)/ftptop + $(INSTALL_BIN) ftpwho $(DESTDIR)$(bindir)/ftpwho + +install-conf: $(DESTDIR)$(sysconfdir) + if [ ! -f $(DESTDIR)$(sysconfdir)/proftpd.conf ] ; then \ + $(INSTALL) -o $(INSTALL_USER) -g $(INSTALL_GROUP) -m 0644 \ + $(top_srcdir)/sample-configurations/basic.conf \ + $(DESTDIR)$(sysconfdir)/proftpd.conf ; \ + fi + +install-libltdl: + cd lib/libltdl/ && $(MAKE) install + +install-man: $(DESTDIR)$(mandir) $(DESTDIR)$(mandir)/man1 $(DESTDIR)$(mandir)/man5 $(DESTDIR)$(mandir)/man8 + $(INSTALL_MAN) $(top_srcdir)/src/ftpdctl.8 $(DESTDIR)$(mandir)/man8 + $(INSTALL_MAN) $(top_srcdir)/src/proftpd.8 $(DESTDIR)$(mandir)/man8 + $(INSTALL_MAN) $(top_srcdir)/utils/ftpshut.8 $(DESTDIR)$(mandir)/man8 + $(INSTALL_MAN) $(top_srcdir)/utils/ftpcount.1 $(DESTDIR)$(mandir)/man1 + $(INSTALL_MAN) $(top_srcdir)/utils/ftptop.1 $(DESTDIR)$(mandir)/man1 + $(INSTALL_MAN) $(top_srcdir)/utils/ftpwho.1 $(DESTDIR)$(mandir)/man1 + $(INSTALL_MAN) $(top_srcdir)/src/xferlog.5 $(DESTDIR)$(mandir)/man5 + +install-all: install-proftpd install-modules install-utils install-conf install-man install-headers install-locales $(INSTALL_DEPS) + +install: all install-all + +depend: + cd src/ && $(MAKE) depend + cd modules/ && $(MAKE) depend + cd lib/ && $(MAKE) depend + cd utils/ && $(MAKE) depend + +clean: + cd src/ && $(MAKE) clean + cd modules/ && $(MAKE) clean + cd lib/ && $(MAKE) clean + cd utils/ && $(MAKE) clean + cd locale/ && $(MAKE) clean + + @dirs="$(DIRS)"; \ + for dir in $$dirs; do \ + if [ -d "$$dir" ]; then cd $$dir/ && $(MAKE) clean; fi; \ + done + + rm -f include/buildstamp.h + rm -f $(BUILD_BIN) + +distclean: clean + cd lib/ && $(MAKE) distclean + rm -f Makefile Make.modules Make.rules \ + lib/Makefile modules/Makefile src/Makefile utils/Makefile + rm -f config.h config.status config.cache config.log libtool stamp-h + rm -f include/buildstamp.h + rm -rf .libs/ + +dist: depend distclean + rm -rf `find . -name CVS` + rm -rf `find . -name .cvsignore` + rm -rf `find . -name core` + rm -rf `find . -name '*~'` + rm -fr `find . -name '*.bak'` + # RPM needs this in the top-level directory in order to support '-t' + mv -f contrib/dist/rpm/proftpd.spec . + # Other users may need to execute these scripts + chmod a+x configure config.sub install-sh modules/glue.sh + + +# autoheader might not change config.h.in, so touch a stamp file. +${srcdir}/config.h.in: stamp-h.in +${srcdir}/stamp-h.in: configure.in acconfig.h + cd ${srcdir} && autoheader + echo timestamp > ${srcdir}/stamp-h.in + +config.h: stamp-h +stamp-h: config.h.in config.status + ./config.status + +${srcdir}/configure: configure.in + cd ${srcdir} && autoconf + +Make.rules: Make.rules.in config.status + ./config.status + +Makefile: Makefile.in Make.rules.in config.status + ./config.status + +config.status: configure + ./config.status --recheck + +libtool: $(LIBTOOL_DEPS) + $(SHELL) ./config.status --recheck diff -ruN --exclude=CVS /usr/ports/ftp/proftpd.orig/files/extra-patch-cyrillic-fix-netio.c /usr/ports/ftp/proftpd/files/extra-patch-cyrillic-fix-netio.c --- /usr/ports/ftp/proftpd.orig/files/extra-patch-cyrillic-fix-netio.c Wed Dec 31 14:00:00 1969 +++ /usr/ports/ftp/proftpd/files/extra-patch-cyrillic-fix-netio.c Tue Jan 23 09:50:06 2007 @@ -0,0 +1,50 @@ +--- ./src/netio.c.orig Sun Oct 10 00:46:22 2004 ++++ ./src/netio.c Thu Oct 12 15:17:22 2006 +@@ -901,47 +901,6 @@ + cp = *pbuf->current++; + pbuf->remaining++; + +- switch (mode) { +- case IAC: +- switch (cp) { +- case WILL: +- case WONT: +- case DO: +- case DONT: +- mode = cp; +- continue; +- +- case IAC: +- mode = 0; +- break; +- +- default: +- /* Ignore */ +- mode = 0; +- continue; +- } +- break; +- +- case WILL: +- case WONT: +- pr_netio_printf(out_nstrm, "%c%c%c", IAC, DONT, cp); +- mode = 0; +- continue; +- +- case DO: +- case DONT: +- pr_netio_printf(out_nstrm, "%c%c%c", IAC, WONT, cp); +- mode = 0; +- continue; +- +- default: +- if (cp == IAC) { +- mode = cp; +- continue; +- } +- break; +- } +- + *bp++ = cp; + buflen--; + } diff -ruN --exclude=CVS /usr/ports/ftp/proftpd.orig/files/extra-patch-mod-codeconv /usr/ports/ftp/proftpd/files/extra-patch-mod-codeconv --- /usr/ports/ftp/proftpd.orig/files/extra-patch-mod-codeconv Wed Dec 31 14:00:00 1969 +++ /usr/ports/ftp/proftpd/files/extra-patch-mod-codeconv Tue Jan 23 09:50:06 2007 @@ -0,0 +1,426 @@ +diff -urN ./modules/mod_codeconv.c .-iconv/modules/mod_codeconv.c +--- ./modules/mod_codeconv.c 1970-01-01 09:00:00.000000000 +0900 ++++ .-iconv/modules/mod_codeconv.c 2004-09-25 21:44:05.000000000 +0900 +@@ -0,0 +1,229 @@ ++/* ++ * ProFTPD: mod_codeconv -- local <-> remote charset conversion ++ * ++ * Copyright (c) 2004 by TSUJIKAWA Tohru <tsujikawa@tsg.ne.jp> / All rights reserved. ++ * ++ * This program is free software; you can redistribute it and/or modify ++ * it under the terms of the GNU General Public License as published by ++ * the Free Software Foundation; either version 2 of the License, or ++ * (at your option) any later version. ++ * ++ * This program is distributed in the hope that it will be useful, ++ * but WITHOUT ANY WARRANTY; without even the implied warranty of ++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++ * GNU General Public License for more details. ++ * ++ * You should have received a copy of the GNU General Public License ++ * along with this program; if not, write to the Free Software ++ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA. ++ * ++ */ ++ ++ ++#include "conf.h" ++#include <iconv.h> ++ ++ ++// ++// directive ++// ++#define DIRECTIVE_CHARSETLOCAL "CharsetLocal" ++#define DIRECTIVE_CHARSETREMOTE "CharsetRemote" ++ ++ ++// ++// initialization ++// ++static int codeconv_init(void) ++{ ++ return 0; ++} ++ ++static int codeconv_sess_init(void) ++{ ++ return 0; ++} ++ ++ ++char* remote2local(struct pool* pool, char* remote) ++{ ++ iconv_t ic; ++ char* local; ++ char* in_ptr; ++ char* out_ptr; ++ size_t inbytesleft, outbytesleft; ++ ++ config_rec* conf_l = NULL; ++ config_rec* conf_r = NULL; ++ ++ conf_l = find_config(main_server->conf, CONF_PARAM, DIRECTIVE_CHARSETLOCAL, FALSE); ++ conf_r = find_config(main_server->conf, CONF_PARAM, DIRECTIVE_CHARSETREMOTE, FALSE); ++ if (!conf_l || !conf_r) return NULL; ++ ++ ic = iconv_open(conf_l->argv[0], conf_r->argv[0]); ++ if (ic == (iconv_t)(-1)) return NULL; ++ ++ iconv(ic, NULL, NULL, NULL, NULL); ++ ++ inbytesleft = strlen(remote); ++ outbytesleft = inbytesleft*3; ++ local = palloc(pool, outbytesleft+1); ++ ++ in_ptr = remote; out_ptr = local; ++ while (inbytesleft) { ++ if (iconv(ic, &in_ptr, &inbytesleft, &out_ptr, &outbytesleft) == -1) { ++ *out_ptr = '?'; out_ptr++; outbytesleft--; ++ in_ptr++; inbytesleft--; ++ break; ++ } ++ } ++ *out_ptr = 0; ++ ++ iconv_close(ic); ++ ++ return local; ++} ++ ++ ++char* local2remote(char* local) ++{ ++ iconv_t ic; ++ char* remote; ++ char* in_ptr; ++ char* out_ptr; ++ size_t inbytesleft, outbytesleft; ++ ++ config_rec* conf_l = NULL; ++ config_rec* conf_r = NULL; ++ ++ conf_l = find_config(main_server->conf, CONF_PARAM, DIRECTIVE_CHARSETLOCAL, FALSE); ++ conf_r = find_config(main_server->conf, CONF_PARAM, DIRECTIVE_CHARSETREMOTE, FALSE); ++ if (!conf_l || !conf_r) return NULL; ++ ++ ic = iconv_open(conf_r->argv[0], conf_l->argv[0]); ++ if (ic == (iconv_t)(-1)) return NULL; ++ ++ iconv(ic, NULL, NULL, NULL, NULL); ++ ++ inbytesleft = strlen(local); ++ outbytesleft = inbytesleft*3; ++ remote = malloc(outbytesleft+1); ++ ++ in_ptr = local; out_ptr = remote; ++ while (inbytesleft) { ++ if (iconv(ic, &in_ptr, &inbytesleft, &out_ptr, &outbytesleft) == -1) { ++ *out_ptr = '?'; out_ptr++; outbytesleft--; ++ in_ptr++; inbytesleft--; ++ break; ++ } ++ } ++ *out_ptr = 0; ++ ++ iconv_close(ic); ++ ++ return remote; ++} ++ ++ ++// ++// module handler ++// ++MODRET codeconv_pre_any(cmd_rec* cmd) ++{ ++ char* p; ++ int i; ++ ++ p = remote2local(cmd->pool, cmd->arg); ++ if (p) cmd->arg = p; ++ ++ for (i = 0; i < cmd->argc; i++) { ++ p = remote2local(cmd->pool, cmd->argv[i]); ++ if (p) cmd->argv[i] = p; ++ } ++ ++ return DECLINED(cmd); ++} ++ ++ ++// ++// local charset directive "CharsetLocal" ++// ++MODRET set_charsetlocal(cmd_rec *cmd) { ++ config_rec *c = NULL; ++ ++ /* Syntax: CharsetLocal iconv-charset-name */ ++ ++ CHECK_ARGS(cmd, 1); ++ CHECK_CONF(cmd, CONF_ROOT|CONF_VIRTUAL|CONF_GLOBAL); ++ ++ c = add_config_param_str(DIRECTIVE_CHARSETLOCAL, 1, cmd->argv[1]); ++ ++ return HANDLED(cmd); ++} ++ ++// ++// remote charset directive "CharsetRemote" ++// ++MODRET set_charsetremote(cmd_rec *cmd) { ++ config_rec *c = NULL; ++ ++ /* Syntax: CharsetRemote iconv-charset-name */ ++ ++ CHECK_ARGS(cmd, 1); ++ CHECK_CONF(cmd, CONF_ROOT|CONF_VIRTUAL|CONF_GLOBAL); ++ ++ c = add_config_param_str(DIRECTIVE_CHARSETREMOTE, 1, cmd->argv[1]); ++ ++ return HANDLED(cmd); ++} ++ ++ ++// ++// module ═╤ directive ++// ++static conftable codeconv_conftab[] = { ++ { DIRECTIVE_CHARSETLOCAL, set_charsetlocal, NULL }, ++ { DIRECTIVE_CHARSETREMOTE, set_charsetremote, NULL }, ++ { NULL, NULL, NULL } ++}; ++ ++ ++// ++// trap д╣дые│е▐еєе╔░ь═ў ++// ++static cmdtable codeconv_cmdtab[] = { ++ { PRE_CMD, C_ANY, G_NONE, codeconv_pre_any, FALSE, FALSE }, ++ { 0, NULL } ++}; ++ ++ ++// ++// module ╛Ё╩є ++// ++module codeconv_module = { ++ ++ /* Always NULL */ ++ NULL, NULL, ++ ++ /* Module API version (2.0) */ ++ 0x20, ++ ++ /* Module name */ ++ "codeconv", ++ ++ /* Module configuration directive handlers */ ++ codeconv_conftab, ++ ++ /* Module command handlers */ ++ codeconv_cmdtab, ++ ++ /* Module authentication handlers (none in this case) */ ++ NULL, ++ ++ /* Module initialization */ ++ codeconv_init, ++ ++ /* Session initialization */ ++ codeconv_sess_init ++ ++}; +diff -urN ./modules/mod_df.c .-iconv/modules/mod_df.c +--- ./modules/mod_df.c 1970-01-01 09:00:00.000000000 +0900 ++++ .-iconv/modules/mod_df.c 2004-09-25 21:43:57.000000000 +0900 +@@ -0,0 +1,127 @@ ++/* ++ * ProFTPD: mod_df -- е╟еге╣еп╢їдн═╞╬╠─╠├╬ете╕ехб╝еы ++ * ++ * Copyright (c) 2002 by TSUJIKAWA Tohru <tsujikawa@tsg.ne.jp> ++ * ++ * This program is free software; you can redistribute it and/or modify ++ * it under the terms of the GNU General Public License as published by ++ * the Free Software Foundation; either version 2 of the License, or ++ * (at your option) any later version. ++ * ++ * This program is distributed in the hope that it will be useful, ++ * but WITHOUT ANY WARRANTY; without even the implied warranty of ++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++ * GNU General Public License for more details. ++ * ++ * You should have received a copy of the GNU General Public License ++ * along with this program; if not, write to the Free Software ++ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA. ++ * ++ */ ++ ++ /* ++ **** for Linux only **** ++ ++ CWD/CDUP е│е▐еєе╔д╬еъе╢еые╚д╟┼Ў│║е╟егеьепе╚еъд╟д╬е╟еге╣еп╢їдн═╞╬╠дЄ─╠├╬д╣дыете╕е хб╝еыд╟д╣бг ++ ++ statfs() д╬╗┼══╛хбд64bit ═╤д╦е│еєе╤едеыд╖д╩дд╛ь╣чд╧ 2TB ░╩╛хд╬е╟еге╣епд╬╗■д╦ ++ └╡╛яд╩├═дЄ╩╓д╡д╩ддд│д╚дм┤№┬╘д╡дьд▐д╣бг ++ ++ */ ++ ++ ++#include "conf.h" ++#include <sys/vfs.h> ++ ++ ++// ++// ╜щ┤№▓╜ ++// ++static int df_init(void) ++{ ++ return 0; ++} ++ ++static int df_sess_init(void) ++{ ++ return 0; ++} ++ ++ ++// ++// module handler ++// ++MODRET df_post_cwd(cmd_rec* cmd) ++{ ++ char buf[PATH_MAX+1]; ++ struct statfs sfs; ++ ++ if (getcwd(buf, sizeof(buf)) && statfs(buf, &sfs) == 0) { ++ long long f = (long long)sfs.f_bavail * (long long)sfs.f_bsize; ++ if (f >= ((long long)1 << 10)*1000000000L) { ++ sprintf(buf, "Disk free space at this directory is %lld,%03lld,%03lld MB.", ++ (f >> 20)/1000000, (f >> 20)/1000%1000, (f >> 20)%1000); ++ } else if (f >= ((long long)1 << 10)*1000000) { ++ sprintf(buf, "Disk free space at this directory is %lld,%03lld,%03lld KB.", ++ (f >> 10)/1000000, (f >> 10)/1000%1000, (f >> 10)%1000); ++ } else if (f >= ((long long)1 << 10)*1000) { ++ sprintf(buf, "DISK FREE SPACE AT THIS DIRECTORY IS ONLY %lld,%03lld KB.", (f >> 10)/1000, (f >> 10)%1000); ++ } else if (f >= 1000) { ++ sprintf(buf, "DISK FREE SPACE AT THIS DIRECTORY IS ONLY %lld,%03lld Bytes.", f/1000, f%1000); ++ } else { ++ sprintf(buf, "DISK FREE SPACE AT THIS DIRECTORY IS ONLY %lld Bytes.", f); ++ } ++ pr_response_send_raw("250-%s", buf); ++ } ++ return HANDLED(cmd); ++} ++ ++ ++// ++// module ═╤ directive ++// ++static conftable df_conftab[] = { ++ { NULL } // directive д╧е╡е▌б╝е╚д╖д╩дд ++}; ++ ++ ++// ++// trap д╣дые│е▐еєе╔░ь═ў ++// ++static cmdtable df_cmdtab[] = { ++ { POST_CMD, C_CWD, G_NONE, df_post_cwd, FALSE, FALSE }, ++ { POST_CMD, C_CDUP, G_NONE, df_post_cwd, FALSE, FALSE }, ++ { 0, NULL } ++}; ++ ++ ++// ++// module ╛Ё╩є ++// ++module df_module = { ++ ++ /* Always NULL */ ++ NULL, NULL, ++ ++ /* Module API version (2.0) */ ++ 0x20, ++ ++ /* Module name */ ++ "df", ++ ++ /* Module configuration directive handlers */ ++ df_conftab, ++ ++ /* Module command handlers */ ++ df_cmdtab, ++ ++ /* Module authentication handlers (none in this case) */ ++ NULL, ++ ++ /* Module initialization */ ++ df_init, ++ ++ /* Session initialization */ ++ df_sess_init ++ ++}; +--- ./modules/mod_ls.c Sat Dec 16 01:25:31 2006 ++++ .-iconv/modules/mod_ls.c Tue Jan 23 15:43:20 2007 +@@ -244,12 +244,15 @@ + return res; + } + ++extern char* local2remote(char*); ++ + /* sendline() now has an internal buffer, to help speed up LIST output. */ + static int sendline(int flags, char *fmt, ...) { + static char listbuf[PR_TUNABLE_BUFFER_SIZE] = {'\0'}; + va_list msg; + char buf[PR_TUNABLE_BUFFER_SIZE+1] = {'\0'}; + int res = 0; ++ char* buf2; + + if (flags & LS_SENDLINE_FL_FLUSH) { + res = pr_data_xfer(listbuf, strlen(listbuf)); +@@ -268,6 +271,13 @@ + + buf[sizeof(buf)-1] = '\0'; + ++ if (buf[0]) { ++ buf2 = local2remote(buf); ++ if (buf2) { ++ strcpy(buf, buf2); free(buf2); ++ } ++ } ++ + /* If buf won't fit completely into listbuf, flush listbuf */ + if (strlen(buf) >= (sizeof(listbuf) - strlen(listbuf))) { + res = pr_data_xfer(listbuf, strlen(listbuf)); +diff -urN ./src/netio.c .-iconv/src/netio.c +--- ./src/netio.c 2004-06-16 01:45:21.000000000 +0900 ++++ .-iconv/src/netio.c 2004-09-25 21:42:59.000000000 +0900 +@@ -467,9 +467,12 @@ + return -1; + } + ++extern char* local2remote(char* local); ++ + int pr_netio_printf(pr_netio_stream_t *nstrm, const char *fmt, ...) { + va_list msg; + char buf[PR_RESPONSE_BUFFER_SIZE] = {'\0'}; ++ char* p; + + if (!nstrm) { + errno = EINVAL; +@@ -481,6 +484,13 @@ + va_end(msg); + buf[sizeof(buf)-1] = '\0'; + ++ if (buf[0]) { ++ p = local2remote(buf); ++ if (p) { ++ strcpy(buf, p); free(p); ++ } ++ } ++ + return pr_netio_write(nstrm, buf, strlen(buf)); + } + diff -ruN --exclude=CVS /usr/ports/ftp/proftpd.orig/files/extra-patch-nls-Makefile.in /usr/ports/ftp/proftpd/files/extra-patch-nls-Makefile.in --- /usr/ports/ftp/proftpd.orig/files/extra-patch-nls-Makefile.in Sat Dec 30 13:45:40 2006 +++ /usr/ports/ftp/proftpd/files/extra-patch-nls-Makefile.in Tue Jan 23 10:44:58 2007 @@ -1,14 +1,14 @@ ---- Makefile.in Fri Dec 29 09:19:12 2006 -+++ Makefile.in.new Fri Dec 29 09:19:22 2006 -@@ -63,10 +63,10 @@ - $(CC) $(LDFLAGS) -o $@ $(BUILD_FTPSHUT_OBJS) +--- Makefile.in.orig Tue Jan 9 17:19:02 2007 ++++ Makefile.in Tue Jan 23 10:39:40 2007 +@@ -64,10 +64,10 @@ + $(CC) $(LDFLAGS) -o $@ $(BUILD_FTPSHUT_OBJS) $(UTILS_LIBS) ftptop$(EXEEXT): lib utils -- $(CC) $(LDFLAGS) -o $@ $(BUILD_FTPTOP_OBJS) $(CURSES_LIBS) -lsupp +- $(CC) $(LDFLAGS) -o $@ $(BUILD_FTPTOP_OBJS) $(CURSES_LIBS) $(UTILS_LIBS) -lsupp + $(CC) $(LDFLAGS) -o $@ $(BUILD_FTPTOP_OBJS) $(CURSES_LIBS) -lsupp -lintl ftpwho$(EXEEXT): lib utils -- $(CC) $(LDFLAGS) -o $@ $(BUILD_FTPWHO_OBJS) -lsupp +- $(CC) $(LDFLAGS) -o $@ $(BUILD_FTPWHO_OBJS) $(UTILS_LIBS) -lsupp + $(CC) $(LDFLAGS) -o $@ $(BUILD_FTPWHO_OBJS) -lsupp -lintl diff -ruN --exclude=CVS /usr/ports/ftp/proftpd.orig/files/extra-patch-nls-Makefile.in.orig /usr/ports/ftp/proftpd/files/extra-patch-nls-Makefile.in.orig --- /usr/ports/ftp/proftpd.orig/files/extra-patch-nls-Makefile.in.orig Wed Dec 31 14:00:00 1969 +++ /usr/ports/ftp/proftpd/files/extra-patch-nls-Makefile.in.orig Sat Dec 30 13:45:40 2006 @@ -0,0 +1,15 @@ +--- Makefile.in Fri Dec 29 09:19:12 2006 ++++ Makefile.in.new Fri Dec 29 09:19:22 2006 +@@ -63,10 +63,10 @@ + $(CC) $(LDFLAGS) -o $@ $(BUILD_FTPSHUT_OBJS) + + ftptop$(EXEEXT): lib utils +- $(CC) $(LDFLAGS) -o $@ $(BUILD_FTPTOP_OBJS) $(CURSES_LIBS) -lsupp ++ $(CC) $(LDFLAGS) -o $@ $(BUILD_FTPTOP_OBJS) $(CURSES_LIBS) -lsupp -lintl + + ftpwho$(EXEEXT): lib utils +- $(CC) $(LDFLAGS) -o $@ $(BUILD_FTPWHO_OBJS) -lsupp ++ $(CC) $(LDFLAGS) -o $@ $(BUILD_FTPWHO_OBJS) -lsupp -lintl + + + # BSD install -d doesn't work, so ... diff -ruN --exclude=CVS /usr/ports/ftp/proftpd.orig/files/extra-patch-nls-Makefile.in.rej /usr/ports/ftp/proftpd/files/extra-patch-nls-Makefile.in.rej --- /usr/ports/ftp/proftpd.orig/files/extra-patch-nls-Makefile.in.rej Wed Dec 31 14:00:00 1969 +++ /usr/ports/ftp/proftpd/files/extra-patch-nls-Makefile.in.rej Tue Jan 23 10:01:49 2007 @@ -0,0 +1,27 @@ +*************** +*** 4,15 **** + $(CC) $(LDFLAGS) -o $@ $(BUILD_FTPSHUT_OBJS) + ftptop$(EXEEXT): lib utils +- - $(CC) $(LDFLAGS) -o $@ $(BUILD_FTPTOP_OBJS) $(CURSES_LIBS) -lsupp +- + $(CC) $(LDFLAGS) -o $@ $(BUILD_FTPTOP_OBJS) $(CURSES_LIBS) -lsupp -lintl + ftpwho$(EXEEXT): lib utils +- - $(CC) $(LDFLAGS) -o $@ $(BUILD_FTPWHO_OBJS) -lsupp +- + $(CC) $(LDFLAGS) -o $@ $(BUILD_FTPWHO_OBJS) -lsupp -lintl + + + # BSD install -d doesn't work, so ... + + +--- 4,15 ---- + $(CC) $(LDFLAGS) -o $@ $(BUILD_FTPSHUT_OBJS) + ftptop$(EXEEXT): lib utils ++ - $(CC) $(LDFLAGS) -o $@ $(BUILD_FTPTOP_OBJS) $(CURSES_LIBS) $(UTILS_LIBS) -lsupp ++ + $(CC) $(LDFLAGS) -o $@ $(BUILD_FTPTOP_OBJS) $(CURSES_LIBS) $(UTILS_LIBS) -lsupp -lintl + ftpwho$(EXEEXT): lib utils ++ - $(CC) $(LDFLAGS) -o $@ $(BUILD_FTPWHO_OBJS) $(UTILS_LIBS) -lsupp ++ + $(CC) $(LDFLAGS) -o $@ $(BUILD_FTPWHO_OBJS) $(UTILS_LIBS) -lsupp -lintl + + + # BSD install -d doesn't work, so ... + + Beech Rintoul (Maintainer)
Forgot housekeeping use this patchset: diff -ruN --exclude=CVS /usr/ports/ftp/proftpd.orig/Makefile /usr/ports/ftp/proftpd/Makefile --- /usr/ports/ftp/proftpd.orig/Makefile Mon Jan 22 19:27:17 2007 +++ /usr/ports/ftp/proftpd/Makefile Tue Jan 23 10:30:35 2007 @@ -7,7 +7,7 @@ PORTNAME= proftpd DISTVERSION= 1.3.1rc2 -PORTREVISION= 2 +PORTREVISION= 3 CATEGORIES= ftp MASTER_SITES= ftp://ftp.proftpd.org/distrib/source/ \ ftp://ftp.fastorama.com/mirrors/ftp.proftpd.org/distrib/source/ \ @@ -32,9 +32,8 @@ USE_GMAKE= yes USE_BZIP2= yes -USE=AUTOTOOLS= autoconf:259 -GNU_CONFIGURE=yes - +USE_AUTOTOOLS= autoconf:259 +GNU_CONFIGURE= yes USE_RC_SUBR= proftpd.sh CONFIGURE_ARGS= --localstatedir=/var/run \ @@ -59,7 +58,9 @@ RADIUS "Include mod_radius" off \ QUOTATAB_RADIUS "include mod_quotatab_radius" off \ BAN "include mod_ban (Requires CTRLS)" off \ - NLS "Use nls (builds mod_lang)" off + NLS "Use nls (builds mod_lang)" off \ + CYRFIX "Use fix for cyrillic encoding" off \ + CODECONV "Use charset conversion (mod_codeconv)" off MODULES?= LIBDIRS?= @@ -139,6 +140,10 @@ EXTRA_PATCHES+= ${PATCHDIR}/extra-patch-nls-Makefile.in .endif +.if defined(WITH_CYRFIX) +EXTRA_PATCHES+= ${PATCHDIR}/extra-patch-cyrillic-fix-netio.c +.endif + #allow user to override MODULES?= mod_ratio:mod_readme:mod_rewrite:mod_wrap2:mod_ifsession @@ -195,6 +200,12 @@ .if defined(WITH_POSTGRESQL) || defined(WITH_MYSQL) MODULES:=${MODULES}:mod_quotatab_sql .endif +.endif + +.if defined(WITH_CODECONV) +MODULES:=${MODULES}:mod_codeconv +PROFTPD_LIBS+= -liconv -L${LOCALBASE}/lib +EXTRA_PATCHES+= ${FILESDIR}/extra-patch-mod-codeconv .endif # mod_ifsession should be the last item in the modules list diff -ruN --exclude=CVS /usr/ports/ftp/proftpd.orig/files/extra-patch-cyrillic-fix-netio.c /usr/ports/ftp/proftpd/files/extra-patch-cyrillic-fix-netio.c --- /usr/ports/ftp/proftpd.orig/files/extra-patch-cyrillic-fix-netio.c Wed Dec 31 14:00:00 1969 +++ /usr/ports/ftp/proftpd/files/extra-patch-cyrillic-fix-netio.c Tue Jan 23 09:50:06 2007 @@ -0,0 +1,50 @@ +--- ./src/netio.c.orig Sun Oct 10 00:46:22 2004 ++++ ./src/netio.c Thu Oct 12 15:17:22 2006 +@@ -901,47 +901,6 @@ + cp = *pbuf->current++; + pbuf->remaining++; + +- switch (mode) { +- case IAC: +- switch (cp) { +- case WILL: +- case WONT: +- case DO: +- case DONT: +- mode = cp; +- continue; +- +- case IAC: +- mode = 0; +- break; +- +- default: +- /* Ignore */ +- mode = 0; +- continue; +- } +- break; +- +- case WILL: +- case WONT: +- pr_netio_printf(out_nstrm, "%c%c%c", IAC, DONT, cp); +- mode = 0; +- continue; +- +- case DO: +- case DONT: +- pr_netio_printf(out_nstrm, "%c%c%c", IAC, WONT, cp); +- mode = 0; +- continue; +- +- default: +- if (cp == IAC) { +- mode = cp; +- continue; +- } +- break; +- } +- + *bp++ = cp; + buflen--; + } diff -ruN --exclude=CVS /usr/ports/ftp/proftpd.orig/files/extra-patch-mod-codeconv /usr/ports/ftp/proftpd/files/extra-patch-mod-codeconv --- /usr/ports/ftp/proftpd.orig/files/extra-patch-mod-codeconv Wed Dec 31 14:00:00 1969 +++ /usr/ports/ftp/proftpd/files/extra-patch-mod-codeconv Tue Jan 23 09:50:06 2007 @@ -0,0 +1,426 @@ +diff -urN ./modules/mod_codeconv.c .-iconv/modules/mod_codeconv.c +--- ./modules/mod_codeconv.c 1970-01-01 09:00:00.000000000 +0900 ++++ .-iconv/modules/mod_codeconv.c 2004-09-25 21:44:05.000000000 +0900 +@@ -0,0 +1,229 @@ ++/* ++ * ProFTPD: mod_codeconv -- local <-> remote charset conversion ++ * ++ * Copyright (c) 2004 by TSUJIKAWA Tohru <tsujikawa@tsg.ne.jp> / All rights reserved. ++ * ++ * This program is free software; you can redistribute it and/or modify ++ * it under the terms of the GNU General Public License as published by ++ * the Free Software Foundation; either version 2 of the License, or ++ * (at your option) any later version. ++ * ++ * This program is distributed in the hope that it will be useful, ++ * but WITHOUT ANY WARRANTY; without even the implied warranty of ++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++ * GNU General Public License for more details. ++ * ++ * You should have received a copy of the GNU General Public License ++ * along with this program; if not, write to the Free Software ++ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA. ++ * ++ */ ++ ++ ++#include "conf.h" ++#include <iconv.h> ++ ++ ++// ++// directive ++// ++#define DIRECTIVE_CHARSETLOCAL "CharsetLocal" ++#define DIRECTIVE_CHARSETREMOTE "CharsetRemote" ++ ++ ++// ++// initialization ++// ++static int codeconv_init(void) ++{ ++ return 0; ++} ++ ++static int codeconv_sess_init(void) ++{ ++ return 0; ++} ++ ++ ++char* remote2local(struct pool* pool, char* remote) ++{ ++ iconv_t ic; ++ char* local; ++ char* in_ptr; ++ char* out_ptr; ++ size_t inbytesleft, outbytesleft; ++ ++ config_rec* conf_l = NULL; ++ config_rec* conf_r = NULL; ++ ++ conf_l = find_config(main_server->conf, CONF_PARAM, DIRECTIVE_CHARSETLOCAL, FALSE); ++ conf_r = find_config(main_server->conf, CONF_PARAM, DIRECTIVE_CHARSETREMOTE, FALSE); ++ if (!conf_l || !conf_r) return NULL; ++ ++ ic = iconv_open(conf_l->argv[0], conf_r->argv[0]); ++ if (ic == (iconv_t)(-1)) return NULL; ++ ++ iconv(ic, NULL, NULL, NULL, NULL); ++ ++ inbytesleft = strlen(remote); ++ outbytesleft = inbytesleft*3; ++ local = palloc(pool, outbytesleft+1); ++ ++ in_ptr = remote; out_ptr = local; ++ while (inbytesleft) { ++ if (iconv(ic, &in_ptr, &inbytesleft, &out_ptr, &outbytesleft) == -1) { ++ *out_ptr = '?'; out_ptr++; outbytesleft--; ++ in_ptr++; inbytesleft--; ++ break; ++ } ++ } ++ *out_ptr = 0; ++ ++ iconv_close(ic); ++ ++ return local; ++} ++ ++ ++char* local2remote(char* local) ++{ ++ iconv_t ic; ++ char* remote; ++ char* in_ptr; ++ char* out_ptr; ++ size_t inbytesleft, outbytesleft; ++ ++ config_rec* conf_l = NULL; ++ config_rec* conf_r = NULL; ++ ++ conf_l = find_config(main_server->conf, CONF_PARAM, DIRECTIVE_CHARSETLOCAL, FALSE); ++ conf_r = find_config(main_server->conf, CONF_PARAM, DIRECTIVE_CHARSETREMOTE, FALSE); ++ if (!conf_l || !conf_r) return NULL; ++ ++ ic = iconv_open(conf_r->argv[0], conf_l->argv[0]); ++ if (ic == (iconv_t)(-1)) return NULL; ++ ++ iconv(ic, NULL, NULL, NULL, NULL); ++ ++ inbytesleft = strlen(local); ++ outbytesleft = inbytesleft*3; ++ remote = malloc(outbytesleft+1); ++ ++ in_ptr = local; out_ptr = remote; ++ while (inbytesleft) { ++ if (iconv(ic, &in_ptr, &inbytesleft, &out_ptr, &outbytesleft) == -1) { ++ *out_ptr = '?'; out_ptr++; outbytesleft--; ++ in_ptr++; inbytesleft--; ++ break; ++ } ++ } ++ *out_ptr = 0; ++ ++ iconv_close(ic); ++ ++ return remote; ++} ++ ++ ++// ++// module handler ++// ++MODRET codeconv_pre_any(cmd_rec* cmd) ++{ ++ char* p; ++ int i; ++ ++ p = remote2local(cmd->pool, cmd->arg); ++ if (p) cmd->arg = p; ++ ++ for (i = 0; i < cmd->argc; i++) { ++ p = remote2local(cmd->pool, cmd->argv[i]); ++ if (p) cmd->argv[i] = p; ++ } ++ ++ return DECLINED(cmd); ++} ++ ++ ++// ++// local charset directive "CharsetLocal" ++// ++MODRET set_charsetlocal(cmd_rec *cmd) { ++ config_rec *c = NULL; ++ ++ /* Syntax: CharsetLocal iconv-charset-name */ ++ ++ CHECK_ARGS(cmd, 1); ++ CHECK_CONF(cmd, CONF_ROOT|CONF_VIRTUAL|CONF_GLOBAL); ++ ++ c = add_config_param_str(DIRECTIVE_CHARSETLOCAL, 1, cmd->argv[1]); ++ ++ return HANDLED(cmd); ++} ++ ++// ++// remote charset directive "CharsetRemote" ++// ++MODRET set_charsetremote(cmd_rec *cmd) { ++ config_rec *c = NULL; ++ ++ /* Syntax: CharsetRemote iconv-charset-name */ ++ ++ CHECK_ARGS(cmd, 1); ++ CHECK_CONF(cmd, CONF_ROOT|CONF_VIRTUAL|CONF_GLOBAL); ++ ++ c = add_config_param_str(DIRECTIVE_CHARSETREMOTE, 1, cmd->argv[1]); ++ ++ return HANDLED(cmd); ++} ++ ++ ++// ++// module ═╤ directive ++// ++static conftable codeconv_conftab[] = { ++ { DIRECTIVE_CHARSETLOCAL, set_charsetlocal, NULL }, ++ { DIRECTIVE_CHARSETREMOTE, set_charsetremote, NULL }, ++ { NULL, NULL, NULL } ++}; ++ ++ ++// ++// trap д╣дые│е▐еєе╔░ь═ў ++// ++static cmdtable codeconv_cmdtab[] = { ++ { PRE_CMD, C_ANY, G_NONE, codeconv_pre_any, FALSE, FALSE }, ++ { 0, NULL } ++}; ++ ++ ++// ++// module ╛Ё╩є ++// ++module codeconv_module = { ++ ++ /* Always NULL */ ++ NULL, NULL, ++ ++ /* Module API version (2.0) */ ++ 0x20, ++ ++ /* Module name */ ++ "codeconv", ++ ++ /* Module configuration directive handlers */ ++ codeconv_conftab, ++ ++ /* Module command handlers */ ++ codeconv_cmdtab, ++ ++ /* Module authentication handlers (none in this case) */ ++ NULL, ++ ++ /* Module initialization */ ++ codeconv_init, ++ ++ /* Session initialization */ ++ codeconv_sess_init ++ ++}; +diff -urN ./modules/mod_df.c .-iconv/modules/mod_df.c +--- ./modules/mod_df.c 1970-01-01 09:00:00.000000000 +0900 ++++ .-iconv/modules/mod_df.c 2004-09-25 21:43:57.000000000 +0900 +@@ -0,0 +1,127 @@ ++/* ++ * ProFTPD: mod_df -- е╟еге╣еп╢їдн═╞╬╠─╠├╬ете╕ехб╝еы ++ * ++ * Copyright (c) 2002 by TSUJIKAWA Tohru <tsujikawa@tsg.ne.jp> ++ * ++ * This program is free software; you can redistribute it and/or modify ++ * it under the terms of the GNU General Public License as published by ++ * the Free Software Foundation; either version 2 of the License, or ++ * (at your option) any later version. ++ * ++ * This program is distributed in the hope that it will be useful, ++ * but WITHOUT ANY WARRANTY; without even the implied warranty of ++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++ * GNU General Public License for more details. ++ * ++ * You should have received a copy of the GNU General Public License ++ * along with this program; if not, write to the Free Software ++ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA. ++ * ++ */ ++ ++ /* ++ **** for Linux only **** ++ ++ CWD/CDUP е│е▐еєе╔д╬еъе╢еые╚д╟┼Ў│║е╟егеьепе╚еъд╟д╬е╟еге╣еп╢їдн═╞╬╠дЄ─╠├╬д╣дыете╕ехб ╝еыд╟д╣бг ++ ++ statfs() д╬╗┼══╛хбд64bit ═╤д╦е│еєе╤едеыд╖д╩дд╛ь╣чд╧ 2TB ░╩╛хд╬е╟еге╣епд╬╗■д╦ ++ └╡╛яд╩├═дЄ╩╓д╡д╩ддд│д╚дм┤№┬╘д╡дьд▐д╣бг ++ ++ */ ++ ++ ++#include "conf.h" ++#include <sys/vfs.h> ++ ++ ++// ++// ╜щ┤№▓╜ ++// ++static int df_init(void) ++{ ++ return 0; ++} ++ ++static int df_sess_init(void) ++{ ++ return 0; ++} ++ ++ ++// ++// module handler ++// ++MODRET df_post_cwd(cmd_rec* cmd) ++{ ++ char buf[PATH_MAX+1]; ++ struct statfs sfs; ++ ++ if (getcwd(buf, sizeof(buf)) && statfs(buf, &sfs) == 0) { ++ long long f = (long long)sfs.f_bavail * (long long)sfs.f_bsize; ++ if (f >= ((long long)1 << 10)*1000000000L) { ++ sprintf(buf, "Disk free space at this directory is %lld,%03lld,%03lld MB.", ++ (f >> 20)/1000000, (f >> 20)/1000%1000, (f >> 20)%1000); ++ } else if (f >= ((long long)1 << 10)*1000000) { ++ sprintf(buf, "Disk free space at this directory is %lld,%03lld,%03lld KB.", ++ (f >> 10)/1000000, (f >> 10)/1000%1000, (f >> 10)%1000); ++ } else if (f >= ((long long)1 << 10)*1000) { ++ sprintf(buf, "DISK FREE SPACE AT THIS DIRECTORY IS ONLY %lld,%03lld KB.", (f >> 10)/1000, (f >> 10)%1000); ++ } else if (f >= 1000) { ++ sprintf(buf, "DISK FREE SPACE AT THIS DIRECTORY IS ONLY %lld,%03lld Bytes.", f/1000, f%1000); ++ } else { ++ sprintf(buf, "DISK FREE SPACE AT THIS DIRECTORY IS ONLY %lld Bytes.", f); ++ } ++ pr_response_send_raw("250-%s", buf); ++ } ++ return HANDLED(cmd); ++} ++ ++ ++// ++// module ═╤ directive ++// ++static conftable df_conftab[] = { ++ { NULL } // directive д╧е╡е▌б╝е╚д╖д╩дд ++}; ++ ++ ++// ++// trap д╣дые│е▐еєе╔░ь═ў ++// ++static cmdtable df_cmdtab[] = { ++ { POST_CMD, C_CWD, G_NONE, df_post_cwd, FALSE, FALSE }, ++ { POST_CMD, C_CDUP, G_NONE, df_post_cwd, FALSE, FALSE }, ++ { 0, NULL } ++}; ++ ++ ++// ++// module ╛Ё╩є ++// ++module df_module = { ++ ++ /* Always NULL */ ++ NULL, NULL, ++ ++ /* Module API version (2.0) */ ++ 0x20, ++ ++ /* Module name */ ++ "df", ++ ++ /* Module configuration directive handlers */ ++ df_conftab, ++ ++ /* Module command handlers */ ++ df_cmdtab, ++ ++ /* Module authentication handlers (none in this case) */ ++ NULL, ++ ++ /* Module initialization */ ++ df_init, ++ ++ /* Session initialization */ ++ df_sess_init ++ ++}; +--- ./modules/mod_ls.c Sat Dec 16 01:25:31 2006 ++++ .-iconv/modules/mod_ls.c Tue Jan 23 15:43:20 2007 +@@ -244,12 +244,15 @@ + return res; + } + ++extern char* local2remote(char*); ++ + /* sendline() now has an internal buffer, to help speed up LIST output. */ + static int sendline(int flags, char *fmt, ...) { + static char listbuf[PR_TUNABLE_BUFFER_SIZE] = {'\0'}; + va_list msg; + char buf[PR_TUNABLE_BUFFER_SIZE+1] = {'\0'}; + int res = 0; ++ char* buf2; + + if (flags & LS_SENDLINE_FL_FLUSH) { + res = pr_data_xfer(listbuf, strlen(listbuf)); +@@ -268,6 +271,13 @@ + + buf[sizeof(buf)-1] = '\0'; + ++ if (buf[0]) { ++ buf2 = local2remote(buf); ++ if (buf2) { ++ strcpy(buf, buf2); free(buf2); ++ } ++ } ++ + /* If buf won't fit completely into listbuf, flush listbuf */ + if (strlen(buf) >= (sizeof(listbuf) - strlen(listbuf))) { + res = pr_data_xfer(listbuf, strlen(listbuf)); +diff -urN ./src/netio.c .-iconv/src/netio.c +--- ./src/netio.c 2004-06-16 01:45:21.000000000 +0900 ++++ .-iconv/src/netio.c 2004-09-25 21:42:59.000000000 +0900 +@@ -467,9 +467,12 @@ + return -1; + } + ++extern char* local2remote(char* local); ++ + int pr_netio_printf(pr_netio_stream_t *nstrm, const char *fmt, ...) { + va_list msg; + char buf[PR_RESPONSE_BUFFER_SIZE] = {'\0'}; ++ char* p; + + if (!nstrm) { + errno = EINVAL; +@@ -481,6 +484,13 @@ + va_end(msg); + buf[sizeof(buf)-1] = '\0'; + ++ if (buf[0]) { ++ p = local2remote(buf); ++ if (p) { ++ strcpy(buf, p); free(p); ++ } ++ } ++ + return pr_netio_write(nstrm, buf, strlen(buf)); + } + diff -ruN --exclude=CVS /usr/ports/ftp/proftpd.orig/files/extra-patch-nls-Makefile.in /usr/ports/ftp/proftpd/files/extra-patch-nls-Makefile.in --- /usr/ports/ftp/proftpd.orig/files/extra-patch-nls-Makefile.in Sat Dec 30 13:45:40 2006 +++ /usr/ports/ftp/proftpd/files/extra-patch-nls-Makefile.in Tue Jan 23 10:44:58 2007 @@ -1,14 +1,14 @@ ---- Makefile.in Fri Dec 29 09:19:12 2006 -+++ Makefile.in.new Fri Dec 29 09:19:22 2006 -@@ -63,10 +63,10 @@ - $(CC) $(LDFLAGS) -o $@ $(BUILD_FTPSHUT_OBJS) +--- Makefile.in.orig Tue Jan 9 17:19:02 2007 ++++ Makefile.in Tue Jan 23 10:39:40 2007 +@@ -64,10 +64,10 @@ + $(CC) $(LDFLAGS) -o $@ $(BUILD_FTPSHUT_OBJS) $(UTILS_LIBS) ftptop$(EXEEXT): lib utils -- $(CC) $(LDFLAGS) -o $@ $(BUILD_FTPTOP_OBJS) $(CURSES_LIBS) -lsupp +- $(CC) $(LDFLAGS) -o $@ $(BUILD_FTPTOP_OBJS) $(CURSES_LIBS) $(UTILS_LIBS) -lsupp + $(CC) $(LDFLAGS) -o $@ $(BUILD_FTPTOP_OBJS) $(CURSES_LIBS) -lsupp -lintl ftpwho$(EXEEXT): lib utils -- $(CC) $(LDFLAGS) -o $@ $(BUILD_FTPWHO_OBJS) -lsupp +- $(CC) $(LDFLAGS) -o $@ $(BUILD_FTPWHO_OBJS) $(UTILS_LIBS) -lsupp + $(CC) $(LDFLAGS) -o $@ $(BUILD_FTPWHO_OBJS) -lsupp -lintl Beech Rintoul (Maintainer)
Responsible Changed From-To: freebsd-ports-bugs->itetcu I'll take it.
This pr has been sitting around for a while. Please use this diff: diff -ruN --exclude=CVS /usr/ports/ftp/proftpd.orig/Makefile /usr/ports/ftp/proftpd/Makefile --- /usr/ports/ftp/proftpd.orig/Makefile Mon Jan 22 19:27:17 2007 +++ /usr/ports/ftp/proftpd/Makefile Thu Feb 1 09:28:27 2007 @@ -7,7 +7,7 @@ PORTNAME= proftpd DISTVERSION= 1.3.1rc2 -PORTREVISION= 2 +PORTREVISION= 3 CATEGORIES= ftp MASTER_SITES= ftp://ftp.proftpd.org/distrib/source/ \ ftp://ftp.fastorama.com/mirrors/ftp.proftpd.org/distrib/source/ \ @@ -20,6 +20,9 @@ MAINTAINER?= beech@alaskaparadise.com COMMENT?= Highly configurable ftp daemon +EXTRACT_DEPENDS= autoconf259:${PORTSDIR}/devel/autoconf259 +BUILD_DEPENDS+= autoconf259:${PORTSDIR}/devel/autoconf259 + MAN1= ftpcount.1 ftpwho.1 ftptop.1 MAN5= xferlog.5 MAN8= proftpd.8 ftpshut.8 ftpdctl.8 @@ -59,7 +62,9 @@ RADIUS "Include mod_radius" off \ QUOTATAB_RADIUS "include mod_quotatab_radius" off \ BAN "include mod_ban (Requires CTRLS)" off \ - NLS "Use nls (builds mod_lang)" off + NLS "Use nls (builds mod_lang)" off \ + CYRFIX "Use patch for fix cyrillic encoding" off \ + CODECONV "Use charset conversion (mod_codeconv)" off MODULES?= LIBDIRS?= @@ -67,11 +72,6 @@ .include <bsd.port.pre.mk> -.if ${OSVERSION} < 500000 -CONFIGURE_ARGS+= --without-getopt -USE_AUTOTOOLS= autoconf:259 -.endif - .if !defined(WITHOUT_RATIO) MODULES:=${MODULES}:mod_ratio .endif @@ -139,6 +139,10 @@ EXTRA_PATCHES+= ${PATCHDIR}/extra-patch-nls-Makefile.in .endif +.if defined (WITH_CYRFIX) +EXTRA_PATCHES+= ${PATCHDIR}/extra-patch-cyrillic-fix-netio.c +.endif + #allow user to override MODULES?= mod_ratio:mod_readme:mod_rewrite:mod_wrap2:mod_ifsession @@ -195,6 +199,12 @@ .if defined(WITH_POSTGRESQL) || defined(WITH_MYSQL) MODULES:=${MODULES}:mod_quotatab_sql .endif +.endif + +.if defined(WITH_CODECONV) +MODULES:=${MODULES}:mod_codeconv +PROFTPD_LIBS+= -liconv -L${LOCALBASE}/lib +EXTRA_PATCHES+= ${FILESDIR}/extra-patch-mod-codeconv .endif # mod_ifsession should be the last item in the modules list diff -ruN --exclude=CVS /usr/ports/ftp/proftpd.orig/files/extra-patch-cyrillic-fix-netio.c /usr/ports/ftp/proftpd/files/extra-patch-cyrillic-fix-netio.c --- /usr/ports/ftp/proftpd.orig/files/extra-patch-cyrillic-fix-netio.c Wed Dec 31 14:00:00 1969 +++ /usr/ports/ftp/proftpd/files/extra-patch-cyrillic-fix-netio.c Thu Feb 1 09:04:35 2007 @@ -0,0 +1,50 @@ +--- ./src/netio.c.orig Sun Oct 10 00:46:22 2004 ++++ ./src/netio.c Thu Oct 12 15:17:22 2006 +@@ -901,47 +901,6 @@ + cp = *pbuf->current++; + pbuf->remaining++; + +- switch (mode) { +- case IAC: +- switch (cp) { +- case WILL: +- case WONT: +- case DO: +- case DONT: +- mode = cp; +- continue; +- +- case IAC: +- mode = 0; +- break; +- +- default: +- /* Ignore */ +- mode = 0; +- continue; +- } +- break; +- +- case WILL: +- case WONT: +- pr_netio_printf(out_nstrm, "%c%c%c", IAC, DONT, cp); +- mode = 0; +- continue; +- +- case DO: +- case DONT: +- pr_netio_printf(out_nstrm, "%c%c%c", IAC, WONT, cp); +- mode = 0; +- continue; +- +- default: +- if (cp == IAC) { +- mode = cp; +- continue; +- } +- break; +- } +- + *bp++ = cp; + buflen--; + } diff -ruN --exclude=CVS /usr/ports/ftp/proftpd.orig/files/extra-patch-mod-codeconv /usr/ports/ftp/proftpd/files/extra-patch-mod-codeconv --- /usr/ports/ftp/proftpd.orig/files/extra-patch-mod-codeconv Wed Dec 31 14:00:00 1969 +++ /usr/ports/ftp/proftpd/files/extra-patch-mod-codeconv Thu Feb 1 09:04:35 2007 @@ -0,0 +1,426 @@ +diff -urN ./modules/mod_codeconv.c .-iconv/modules/mod_codeconv.c +--- ./modules/mod_codeconv.c 1970-01-01 09:00:00.000000000 +0900 ++++ .-iconv/modules/mod_codeconv.c 2004-09-25 21:44:05.000000000 +0900 +@@ -0,0 +1,229 @@ ++/* ++ * ProFTPD: mod_codeconv -- local <-> remote charset conversion ++ * ++ * Copyright (c) 2004 by TSUJIKAWA Tohru <tsujikawa@tsg.ne.jp> / All rights reserved. ++ * ++ * This program is free software; you can redistribute it and/or modify ++ * it under the terms of the GNU General Public License as published by ++ * the Free Software Foundation; either version 2 of the License, or ++ * (at your option) any later version. ++ * ++ * This program is distributed in the hope that it will be useful, ++ * but WITHOUT ANY WARRANTY; without even the implied warranty of ++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++ * GNU General Public License for more details. ++ * ++ * You should have received a copy of the GNU General Public License ++ * along with this program; if not, write to the Free Software ++ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA. ++ * ++ */ ++ ++ ++#include "conf.h" ++#include <iconv.h> ++ ++ ++// ++// directive ++// ++#define DIRECTIVE_CHARSETLOCAL "CharsetLocal" ++#define DIRECTIVE_CHARSETREMOTE "CharsetRemote" ++ ++ ++// ++// initialization ++// ++static int codeconv_init(void) ++{ ++ return 0; ++} ++ ++static int codeconv_sess_init(void) ++{ ++ return 0; ++} ++ ++ ++char* remote2local(struct pool* pool, char* remote) ++{ ++ iconv_t ic; ++ char* local; ++ char* in_ptr; ++ char* out_ptr; ++ size_t inbytesleft, outbytesleft; ++ ++ config_rec* conf_l = NULL; ++ config_rec* conf_r = NULL; ++ ++ conf_l = find_config(main_server->conf, CONF_PARAM, DIRECTIVE_CHARSETLOCAL, FALSE); ++ conf_r = find_config(main_server->conf, CONF_PARAM, DIRECTIVE_CHARSETREMOTE, FALSE); ++ if (!conf_l || !conf_r) return NULL; ++ ++ ic = iconv_open(conf_l->argv[0], conf_r->argv[0]); ++ if (ic == (iconv_t)(-1)) return NULL; ++ ++ iconv(ic, NULL, NULL, NULL, NULL); ++ ++ inbytesleft = strlen(remote); ++ outbytesleft = inbytesleft*3; ++ local = palloc(pool, outbytesleft+1); ++ ++ in_ptr = remote; out_ptr = local; ++ while (inbytesleft) { ++ if (iconv(ic, &in_ptr, &inbytesleft, &out_ptr, &outbytesleft) == -1) { ++ *out_ptr = '?'; out_ptr++; outbytesleft--; ++ in_ptr++; inbytesleft--; ++ break; ++ } ++ } ++ *out_ptr = 0; ++ ++ iconv_close(ic); ++ ++ return local; ++} ++ ++ ++char* local2remote(char* local) ++{ ++ iconv_t ic; ++ char* remote; ++ char* in_ptr; ++ char* out_ptr; ++ size_t inbytesleft, outbytesleft; ++ ++ config_rec* conf_l = NULL; ++ config_rec* conf_r = NULL; ++ ++ conf_l = find_config(main_server->conf, CONF_PARAM, DIRECTIVE_CHARSETLOCAL, FALSE); ++ conf_r = find_config(main_server->conf, CONF_PARAM, DIRECTIVE_CHARSETREMOTE, FALSE); ++ if (!conf_l || !conf_r) return NULL; ++ ++ ic = iconv_open(conf_r->argv[0], conf_l->argv[0]); ++ if (ic == (iconv_t)(-1)) return NULL; ++ ++ iconv(ic, NULL, NULL, NULL, NULL); ++ ++ inbytesleft = strlen(local); ++ outbytesleft = inbytesleft*3; ++ remote = malloc(outbytesleft+1); ++ ++ in_ptr = local; out_ptr = remote; ++ while (inbytesleft) { ++ if (iconv(ic, &in_ptr, &inbytesleft, &out_ptr, &outbytesleft) == -1) { ++ *out_ptr = '?'; out_ptr++; outbytesleft--; ++ in_ptr++; inbytesleft--; ++ break; ++ } ++ } ++ *out_ptr = 0; ++ ++ iconv_close(ic); ++ ++ return remote; ++} ++ ++ ++// ++// module handler ++// ++MODRET codeconv_pre_any(cmd_rec* cmd) ++{ ++ char* p; ++ int i; ++ ++ p = remote2local(cmd->pool, cmd->arg); ++ if (p) cmd->arg = p; ++ ++ for (i = 0; i < cmd->argc; i++) { ++ p = remote2local(cmd->pool, cmd->argv[i]); ++ if (p) cmd->argv[i] = p; ++ } ++ ++ return DECLINED(cmd); ++} ++ ++ ++// ++// local charset directive "CharsetLocal" ++// ++MODRET set_charsetlocal(cmd_rec *cmd) { ++ config_rec *c = NULL; ++ ++ /* Syntax: CharsetLocal iconv-charset-name */ ++ ++ CHECK_ARGS(cmd, 1); ++ CHECK_CONF(cmd, CONF_ROOT|CONF_VIRTUAL|CONF_GLOBAL); ++ ++ c = add_config_param_str(DIRECTIVE_CHARSETLOCAL, 1, cmd->argv[1]); ++ ++ return HANDLED(cmd); ++} ++ ++// ++// remote charset directive "CharsetRemote" ++// ++MODRET set_charsetremote(cmd_rec *cmd) { ++ config_rec *c = NULL; ++ ++ /* Syntax: CharsetRemote iconv-charset-name */ ++ ++ CHECK_ARGS(cmd, 1); ++ CHECK_CONF(cmd, CONF_ROOT|CONF_VIRTUAL|CONF_GLOBAL); ++ ++ c = add_config_param_str(DIRECTIVE_CHARSETREMOTE, 1, cmd->argv[1]); ++ ++ return HANDLED(cmd); ++} ++ ++ ++// ++// module ═╤ directive ++// ++static conftable codeconv_conftab[] = { ++ { DIRECTIVE_CHARSETLOCAL, set_charsetlocal, NULL }, ++ { DIRECTIVE_CHARSETREMOTE, set_charsetremote, NULL }, ++ { NULL, NULL, NULL } ++}; ++ ++ ++// ++// trap д╣дые│е▐еєе╔░ь═ў ++// ++static cmdtable codeconv_cmdtab[] = { ++ { PRE_CMD, C_ANY, G_NONE, codeconv_pre_any, FALSE, FALSE }, ++ { 0, NULL } ++}; ++ ++ ++// ++// module ╛Ё╩є ++// ++module codeconv_module = { ++ ++ /* Always NULL */ ++ NULL, NULL, ++ ++ /* Module API version (2.0) */ ++ 0x20, ++ ++ /* Module name */ ++ "codeconv", ++ ++ /* Module configuration directive handlers */ ++ codeconv_conftab, ++ ++ /* Module command handlers */ ++ codeconv_cmdtab, ++ ++ /* Module authentication handlers (none in this case) */ ++ NULL, ++ ++ /* Module initialization */ ++ codeconv_init, ++ ++ /* Session initialization */ ++ codeconv_sess_init ++ ++}; +diff -urN ./modules/mod_df.c .-iconv/modules/mod_df.c +--- ./modules/mod_df.c 1970-01-01 09:00:00.000000000 +0900 ++++ .-iconv/modules/mod_df.c 2004-09-25 21:43:57.000000000 +0900 +@@ -0,0 +1,127 @@ ++/* ++ * ProFTPD: mod_df -- е╟еге╣еп╢їдн═╞╬╠─╠├╬ете╕ехб╝еы ++ * ++ * Copyright (c) 2002 by TSUJIKAWA Tohru <tsujikawa@tsg.ne.jp> ++ * ++ * This program is free software; you can redistribute it and/or modify ++ * it under the terms of the GNU General Public License as published by ++ * the Free Software Foundation; either version 2 of the License, or ++ * (at your option) any later version. ++ * ++ * This program is distributed in the hope that it will be useful, ++ * but WITHOUT ANY WARRANTY; without even the implied warranty of ++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++ * GNU General Public License for more details. ++ * ++ * You should have received a copy of the GNU General Public License ++ * along with this program; if not, write to the Free Software ++ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA. ++ * ++ */ ++ ++ /* ++ **** for Linux only **** ++ ++ CWD/CDUP е│е▐еєе╔д╬еъе╢еые╚д╟┼Ў│║е╟егеьепе╚еъд╟д╬е╟еге╣еп╢їдн═╞╬╠дЄ─╠├╬д╣дыете╕ехб ╝еыд╟д╣бг ++ ++ statfs() д╬╗┼══╛хбд64bit ═╤д╦е│еєе╤едеыд╖д╩дд╛ь╣чд╧ 2TB ░╩╛хд╬е╟еге╣епд╬╗■д╦ ++ └╡╛яд╩├═дЄ╩╓д╡д╩ддд│д╚дм┤№┬╘д╡дьд▐д╣бг ++ ++ */ ++ ++ ++#include "conf.h" ++#include <sys/vfs.h> ++ ++ ++// ++// ╜щ┤№▓╜ ++// ++static int df_init(void) ++{ ++ return 0; ++} ++ ++static int df_sess_init(void) ++{ ++ return 0; ++} ++ ++ ++// ++// module handler ++// ++MODRET df_post_cwd(cmd_rec* cmd) ++{ ++ char buf[PATH_MAX+1]; ++ struct statfs sfs; ++ ++ if (getcwd(buf, sizeof(buf)) && statfs(buf, &sfs) == 0) { ++ long long f = (long long)sfs.f_bavail * (long long)sfs.f_bsize; ++ if (f >= ((long long)1 << 10)*1000000000L) { ++ sprintf(buf, "Disk free space at this directory is %lld,%03lld,%03lld MB.", ++ (f >> 20)/1000000, (f >> 20)/1000%1000, (f >> 20)%1000); ++ } else if (f >= ((long long)1 << 10)*1000000) { ++ sprintf(buf, "Disk free space at this directory is %lld,%03lld,%03lld KB.", ++ (f >> 10)/1000000, (f >> 10)/1000%1000, (f >> 10)%1000); ++ } else if (f >= ((long long)1 << 10)*1000) { ++ sprintf(buf, "DISK FREE SPACE AT THIS DIRECTORY IS ONLY %lld,%03lld KB.", (f >> 10)/1000, (f >> 10)%1000); ++ } else if (f >= 1000) { ++ sprintf(buf, "DISK FREE SPACE AT THIS DIRECTORY IS ONLY %lld,%03lld Bytes.", f/1000, f%1000); ++ } else { ++ sprintf(buf, "DISK FREE SPACE AT THIS DIRECTORY IS ONLY %lld Bytes.", f); ++ } ++ pr_response_send_raw("250-%s", buf); ++ } ++ return HANDLED(cmd); ++} ++ ++ ++// ++// module ═╤ directive ++// ++static conftable df_conftab[] = { ++ { NULL } // directive д╧е╡е▌б╝е╚д╖д╩дд ++}; ++ ++ ++// ++// trap д╣дые│е▐еєе╔░ь═ў ++// ++static cmdtable df_cmdtab[] = { ++ { POST_CMD, C_CWD, G_NONE, df_post_cwd, FALSE, FALSE }, ++ { POST_CMD, C_CDUP, G_NONE, df_post_cwd, FALSE, FALSE }, ++ { 0, NULL } ++}; ++ ++ ++// ++// module ╛Ё╩є ++// ++module df_module = { ++ ++ /* Always NULL */ ++ NULL, NULL, ++ ++ /* Module API version (2.0) */ ++ 0x20, ++ ++ /* Module name */ ++ "df", ++ ++ /* Module configuration directive handlers */ ++ df_conftab, ++ ++ /* Module command handlers */ ++ df_cmdtab, ++ ++ /* Module authentication handlers (none in this case) */ ++ NULL, ++ ++ /* Module initialization */ ++ df_init, ++ ++ /* Session initialization */ ++ df_sess_init ++ ++}; +--- ./modules/mod_ls.c Sat Dec 16 01:25:31 2006 ++++ .-iconv/modules/mod_ls.c Tue Jan 23 15:43:20 2007 +@@ -244,12 +244,15 @@ + return res; + } + ++extern char* local2remote(char*); ++ + /* sendline() now has an internal buffer, to help speed up LIST output. */ + static int sendline(int flags, char *fmt, ...) { + static char listbuf[PR_TUNABLE_BUFFER_SIZE] = {'\0'}; + va_list msg; + char buf[PR_TUNABLE_BUFFER_SIZE+1] = {'\0'}; + int res = 0; ++ char* buf2; + + if (flags & LS_SENDLINE_FL_FLUSH) { + res = pr_data_xfer(listbuf, strlen(listbuf)); +@@ -268,6 +271,13 @@ + + buf[sizeof(buf)-1] = '\0'; + ++ if (buf[0]) { ++ buf2 = local2remote(buf); ++ if (buf2) { ++ strcpy(buf, buf2); free(buf2); ++ } ++ } ++ + /* If buf won't fit completely into listbuf, flush listbuf */ + if (strlen(buf) >= (sizeof(listbuf) - strlen(listbuf))) { + res = pr_data_xfer(listbuf, strlen(listbuf)); +diff -urN ./src/netio.c .-iconv/src/netio.c +--- ./src/netio.c 2004-06-16 01:45:21.000000000 +0900 ++++ .-iconv/src/netio.c 2004-09-25 21:42:59.000000000 +0900 +@@ -467,9 +467,12 @@ + return -1; + } + ++extern char* local2remote(char* local); ++ + int pr_netio_printf(pr_netio_stream_t *nstrm, const char *fmt, ...) { + va_list msg; + char buf[PR_RESPONSE_BUFFER_SIZE] = {'\0'}; ++ char* p; + + if (!nstrm) { + errno = EINVAL; +@@ -481,6 +484,13 @@ + va_end(msg); + buf[sizeof(buf)-1] = '\0'; + ++ if (buf[0]) { ++ p = local2remote(buf); ++ if (p) { ++ strcpy(buf, p); free(p); ++ } ++ } ++ + return pr_netio_write(nstrm, buf, strlen(buf)); + } + diff -ruN --exclude=CVS /usr/ports/ftp/proftpd.orig/files/extra-patch-nls-Makefile.in /usr/ports/ftp/proftpd/files/extra-patch-nls-Makefile.in --- /usr/ports/ftp/proftpd.orig/files/extra-patch-nls-Makefile.in Sat Dec 30 13:45:40 2006 +++ /usr/ports/ftp/proftpd/files/extra-patch-nls-Makefile.in Thu Feb 1 09:18:33 2007 @@ -1,15 +1,15 @@ ---- Makefile.in Fri Dec 29 09:19:12 2006 -+++ Makefile.in.new Fri Dec 29 09:19:22 2006 -@@ -63,10 +63,10 @@ - $(CC) $(LDFLAGS) -o $@ $(BUILD_FTPSHUT_OBJS) +--- Makefile.in.orig Tue Jan 9 17:19:02 2007 ++++ Makefile.in Thu Feb 1 09:11:20 2007 +@@ -64,10 +64,10 @@ + $(CC) $(LDFLAGS) -o $@ $(BUILD_FTPSHUT_OBJS) $(UTILS_LIBS) ftptop$(EXEEXT): lib utils -- $(CC) $(LDFLAGS) -o $@ $(BUILD_FTPTOP_OBJS) $(CURSES_LIBS) -lsupp -+ $(CC) $(LDFLAGS) -o $@ $(BUILD_FTPTOP_OBJS) $(CURSES_LIBS) -lsupp -lintl +- $(CC) $(LDFLAGS) -o $@ $(BUILD_FTPTOP_OBJS) $(CURSES_LIBS) $(UTILS_LIBS) -lsupp ++ $(CC) $(LDFLAGS) -o $@ $(BUILD_FTPTOP_OBJS) $(CURSES_LIBS) $(UTILS_LIBS) -lsupp -lintl ftpwho$(EXEEXT): lib utils -- $(CC) $(LDFLAGS) -o $@ $(BUILD_FTPWHO_OBJS) -lsupp -+ $(CC) $(LDFLAGS) -o $@ $(BUILD_FTPWHO_OBJS) -lsupp -lintl +- $(CC) $(LDFLAGS) -o $@ $(BUILD_FTPWHO_OBJS) $(UTILS_LIBS) -lsupp ++ $(CC) $(LDFLAGS) -o $@ $(BUILD_FTPWHO_OBJS) $(UTILS_LIBS) -lsupp -lintl # BSD install -d doesn't work, so ... Beech (Maintainer)
miwi 2007-02-27 07:39:18 UTC FreeBSD ports repository Modified files: ftp/proftpd Makefile ftp/proftpd/files extra-patch-nls-Makefile.in Added files: ftp/proftpd/files extra-patch-cyrillic-fix-netio.c extra-patch-mod-codeconv Log: - Add mode_codeconv patches and option into Makefile (mod_codeconv allow change filename's charsets "on the fly") - Add "Cyrrilic charset fix" patch and option into Makefile - Fix mode_nls patch problems - Bump PORTREVISION PR: 108244 Submitted by: Denis Barov<dindin@freebsd.org.ua> Approved by: maintainer Revision Changes Path 1.102 +16 -9 ports/ftp/proftpd/Makefile 1.1 +50 -0 ports/ftp/proftpd/files/extra-patch-cyrillic-fix-netio.c (new) 1.1 +426 -0 ports/ftp/proftpd/files/extra-patch-mod-codeconv (new) 1.2 +8 -8 ports/ftp/proftpd/files/extra-patch-nls-Makefile.in _______________________________________________ cvs-all@freebsd.org mailing list http://lists.freebsd.org/mailman/listinfo/cvs-all To unsubscribe, send any mail to "cvs-all-unsubscribe@freebsd.org"
State Changed From-To: feedback->closed Committed. Thanks!