ports/104453: [NEW PORT] russian/proftpd
Denis Barov
dindin at freebsd.org.ua
Mon Oct 16 08:00:40 UTC 2006
>Number: 104453
>Category: ports
>Synopsis: [NEW PORT] russian/proftpd
>Confidential: no
>Severity: non-critical
>Priority: low
>Responsible: freebsd-ports-bugs
>State: open
>Quarter:
>Keywords:
>Date-Required:
>Class: change-request
>Submitter-Id: current-users
>Arrival-Date: Mon Oct 16 08:00:37 GMT 2006
>Closed-Date:
>Last-Modified:
>Originator: Denis Barov
>Release: 6.2-PRERELEASE
>Organization:
>Environment:
FreeBSD alpha.tvt 6.2-PRERELEASE FreeBSD 6.2-PRERELEASE #2: Tue Oct 10 12:50:53 MSD 2006 root at alpha.tvt:/usr/obj/usr/RELENG_6/src/sys/ALPHA i386
>Description:
Using mod_codeconv and fixing some troubles with cyrillic letter "ja" in proftpd.
WARNING: this pr is depends on ports/104452 (Using ftp/proftpd as mastrer port for russian/proftpd)
>How-To-Repeat:
>Fix:
# This is a shell archive. Save it in a file, remove anything before
# this line, and then unpack it by entering "sh file". Note, it may
# create directories; files and directories will be owned by you and
# have default permissions.
#
# This archive contains:
#
# russian/proftpd
# russian/proftpd/Makefile
# russian/proftpd/files
# russian/proftpd/files/patch-zz
# russian/proftpd/files/extra_patch-configure.in
# russian/proftpd/files/extra_patch-ldap-tls-mod_ldap.c
# russian/proftpd/files/patch-ah
# russian/proftpd/files/patch-contrib::mod_sql_mysql.c
# russian/proftpd/files/patch-doc::Configuration.html
# russian/proftpd/files/patch-module::mod_auth_pam.c
# russian/proftpd/files/patch-sample-configurations_basic.conf
# russian/proftpd/files/patch-src_proftpd.8.in
# russian/proftpd/files/patch-encoding
#
echo c - russian/proftpd
mkdir -p russian/proftpd > /dev/null 2>&1
echo x - russian/proftpd/Makefile
sed 's/^X//' >russian/proftpd/Makefile << 'END-of-russian/proftpd/Makefile'
X# New ports collection makefile for: russian/proftpd
X# Date created: 12 Oct 2006
X# Whom: Denis Barov <dindin at freebsd.org.ua>
X#
X# $FreeBSD:$
X#
X
XCATEGORIES= russian ftp
X
XMAINTAINER= dindin at FreeBSD.org.ua
XCOMMENT= Highly configurable ftp daemon with charset conversion
X
XMASTERDIR= ${.CURDIR}/../../ftp/proftpd
X
XCONFLICTS= proftpd-1.*
X
XCONFIGURE_ARGS+= --with-modules=mod_codeconv
XMODULES:=${MODULES}:mod_codeconv
XPROFTPD_LIBS+= -liconv -L${LOCALBASE}/lib
X
XPATCHDIR= ${.CURDIR}/files
X
XINCLUDEDIRS:=${INCLUDEDIRS}:${PREFIX}/include
XLIBDIRS:=${LIBDIRS}:${PREFIX}/lib
X
X.include "${MASTERDIR}/Makefile"
END-of-russian/proftpd/Makefile
echo c - russian/proftpd/files
mkdir -p russian/proftpd/files > /dev/null 2>&1
echo x - russian/proftpd/files/patch-zz
sed 's/^X//' >russian/proftpd/files/patch-zz << 'END-of-russian/proftpd/files/patch-zz'
X--- ./src/netio.c.orig Sun Oct 10 00:46:22 2004
X+++ ./src/netio.c Thu Oct 12 15:17:22 2006
X@@ -901,47 +901,6 @@
X cp = *pbuf->current++;
X pbuf->remaining++;
X
X- switch (mode) {
X- case IAC:
X- switch (cp) {
X- case WILL:
X- case WONT:
X- case DO:
X- case DONT:
X- mode = cp;
X- continue;
X-
X- case IAC:
X- mode = 0;
X- break;
X-
X- default:
X- /* Ignore */
X- mode = 0;
X- continue;
X- }
X- break;
X-
X- case WILL:
X- case WONT:
X- pr_netio_printf(out_nstrm, "%c%c%c", IAC, DONT, cp);
X- mode = 0;
X- continue;
X-
X- case DO:
X- case DONT:
X- pr_netio_printf(out_nstrm, "%c%c%c", IAC, WONT, cp);
X- mode = 0;
X- continue;
X-
X- default:
X- if (cp == IAC) {
X- mode = cp;
X- continue;
X- }
X- break;
X- }
X-
X *bp++ = cp;
X buflen--;
X }
END-of-russian/proftpd/files/patch-zz
echo x - russian/proftpd/files/extra_patch-configure.in
sed 's/^X//' >russian/proftpd/files/extra_patch-configure.in << 'END-of-russian/proftpd/files/extra_patch-configure.in'
X--- configure.in Thu Mar 9 09:12:35 2006
X+++ configure.in Mon May 22 15:01:23 2006
X@@ -161,12 +161,14 @@
X [
X if test "$withval" != "no" ; then
X LIB_OBJS="$LIB_OBJS getopt.o getopt1.o"
X- AC_CHECK_FUNCS(getopt)
X+ AC_CHECK_FUNCS(getopt getopt_long)
X+ AC_CHECK_HEADERS(getopt.h)
X fi
X ],
X [
X LIB_OBJS="$LIB_OBJS getopt.o getopt1.o"
X- AC_CHECK_FUNCS(getopt)
X+ AC_CHECK_FUNCS(getopt getopt_long)
X+ AC_CHECK_HEADERS(getopt.h)
X ])
X
X dnl Modules...'nuff said.
X@@ -850,7 +852,7 @@
X ac_build_static_modules="modules/mod_cap.o $ac_build_static_modules"
X fi
X
X-AC_CHECK_HEADERS(ctype.h getopt.h crypt.h bstring.h iconv.h inttypes.h langinfo.h limits.h)
X+AC_CHECK_HEADERS(ctype.h crypt.h bstring.h iconv.h inttypes.h langinfo.h limits.h)
X AC_CHECK_HEADERS(string.h strings.h stropts.h)
X AC_CHECK_HEADERS(sys/file.h sys/mman.h sys/types.h sys/uio.h)
X
X@@ -1110,7 +1112,7 @@
X )
X
X AC_CHECK_FUNCS(getcwd getenv gethostbyname2 gethostname getnameinfo)
X-AC_CHECK_FUNCS(getopt_long gettimeofday hstrerror inet_aton inet_ntop inet_pton)
X+AC_CHECK_FUNCS(gettimeofday hstrerror inet_aton inet_ntop inet_pton)
X AC_CHECK_FUNCS(memcpy mempcpy mkdir mkstemp mlock mlockall munlock munlockall)
X AC_CHECK_FUNCS(rmdir select setgroups socket statfs strchr strcoll strerror)
X AC_CHECK_FUNCS(strsep strtol strtoull setprotoent setspent endprotoent)
END-of-russian/proftpd/files/extra_patch-configure.in
echo x - russian/proftpd/files/extra_patch-ldap-tls-mod_ldap.c
sed 's/^X//' >russian/proftpd/files/extra_patch-ldap-tls-mod_ldap.c << 'END-of-russian/proftpd/files/extra_patch-ldap-tls-mod_ldap.c'
X--- contrib/mod_ldap.c Fri Apr 21 10:31:23 2006
X+++ contrib/mod_ldap.c Fri Apr 21 10:31:43 2006
X@@ -55,7 +55,7 @@
X * after connecting to the LDAP server. If TLS cannot be enabled, the LDAP
X * connection will fail.
X */
X-/* #define USE_LDAP_TLS */
X+#define USE_LDAP_TLS
END-of-russian/proftpd/files/extra_patch-ldap-tls-mod_ldap.c
echo x - russian/proftpd/files/patch-ah
sed 's/^X//' >russian/proftpd/files/patch-ah << 'END-of-russian/proftpd/files/patch-ah'
X--- modules/mod_auth_unix.c.orig Thu May 13 23:40:18 2004
X+++ modules/mod_auth_unix.c Thu May 13 23:40:27 2004
X@@ -57,6 +57,7 @@
X #endif /* HAVE_HPSECURITY_H or HPUX10 or HPUX11 */
X
X #if defined(HAVE_PROT_H) || defined(COMSEC)
X+# include <krb.h>
X # include <prot.h>
X #endif
X
END-of-russian/proftpd/files/patch-ah
echo x - russian/proftpd/files/patch-contrib::mod_sql_mysql.c
sed 's/^X//' >russian/proftpd/files/patch-contrib::mod_sql_mysql.c << 'END-of-russian/proftpd/files/patch-contrib::mod_sql_mysql.c'
X--- contrib/mod_sql_mysql.c.orig Sun Nov 2 00:30:13 2003
X+++ contrib/mod_sql_mysql.c Sun Nov 2 00:30:23 2003
X@@ -134,7 +134,7 @@
X
X #define _MYSQL_PORT "3306"
X
X-#include <mysql.h>
X+#include <mysql/mysql.h>
X #include "conf.h"
X #include "../contrib/mod_sql.h"
X
END-of-russian/proftpd/files/patch-contrib::mod_sql_mysql.c
echo x - russian/proftpd/files/patch-doc::Configuration.html
sed 's/^X//' >russian/proftpd/files/patch-doc::Configuration.html << 'END-of-russian/proftpd/files/patch-doc::Configuration.html'
X--- ./doc/Configuration.html.orig Wed Jan 29 12:27:24 2003
X+++ ./doc/Configuration.html Sat Mar 15 11:34:14 2003
X@@ -4226,7 +4226,7 @@
X ></DT
X ><DD
X ><P
X->ftp</P
X+>ftpd</P
X ></DD
X ><DT
X ><PRE
X@@ -32252,4 +32252,4 @@
X ></DIV
X ></BODY
X ></HTML
X->
X\ No newline at end of file
X+>
END-of-russian/proftpd/files/patch-doc::Configuration.html
echo x - russian/proftpd/files/patch-module::mod_auth_pam.c
sed 's/^X//' >russian/proftpd/files/patch-module::mod_auth_pam.c << 'END-of-russian/proftpd/files/patch-module::mod_auth_pam.c'
X--- ./modules/mod_auth_pam.c.orig Thu Jan 2 13:25:20 2003
X+++ ./modules/mod_auth_pam.c Sat Mar 15 11:35:00 2003
X@@ -57,7 +57,7 @@
X #endif /* HAVE_PAM_PAM_APPL_H */
X
X static pam_handle_t * pamh = NULL;
X-static char * pamconfig = "ftp";
X+static char * pamconfig = "ftpd";
X static char * pam_user = NULL;
X static char * pam_pass = NULL;
X static size_t pam_user_len = 0;
END-of-russian/proftpd/files/patch-module::mod_auth_pam.c
echo x - russian/proftpd/files/patch-sample-configurations_basic.conf
sed 's/^X//' >russian/proftpd/files/patch-sample-configurations_basic.conf << 'END-of-russian/proftpd/files/patch-sample-configurations_basic.conf'
X--- sample-configurations/basic.conf.orig Thu Apr 15 22:46:38 2004
X+++ sample-configurations/basic.conf Mon Oct 16 11:40:13 2006
X@@ -1,3 +1,7 @@
X+#
X+# To have more informations about Proftpd configuration
X+# look at : http://www.proftpd.org/
X+#
X # This is a basic ProFTPD configuration file (rename it to
X # 'proftpd.conf' for actual use. It establishes a single server
X # and a single anonymous login. It assumes that you have a user/group
X@@ -6,6 +10,7 @@
X ServerName "ProFTPD Default Installation"
X ServerType standalone
X DefaultServer on
X+ScoreboardFile /var/run/proftpd.scoreboard
X
X # Port 21 is the standard FTP port.
X Port 21
X@@ -14,6 +19,11 @@
X # from being group and world writable.
X Umask 022
X
X+# CharsetLocal and CharsetRemote allows to convert filenames
X+# "on the fly"
X+CharsetLocal KOI8-R
X+CharsetRemote CP1251
X+
X # To prevent DoS attacks, set the maximum number of child processes
X # to 30. If you need to allow more than 30 concurrent connections
X # at once, simply increase this value. Note that this ONLY works
X@@ -40,23 +50,29 @@
X
X # A basic anonymous configuration, no upload directories. If you do not
X # want anonymous users, simply delete this entire <Anonymous> section.
X-<Anonymous ~ftp>
X- User ftp
X- Group ftp
X-
X- # We want clients to be able to login with "anonymous" as well as "ftp"
X- UserAlias anonymous ftp
X-
X- # Limit the maximum number of anonymous logins
X- MaxClients 10
X-
X- # We want 'welcome.msg' displayed at login, and '.message' displayed
X- # in each newly chdired directory.
X- DisplayLogin welcome.msg
X- DisplayFirstChdir .message
X-
X- # Limit WRITE everywhere in the anonymous chroot
X- <Limit WRITE>
X- DenyAll
X- </Limit>
X-</Anonymous>
X+#########################################################################
X+# #
X+# Uncomment lines with only one # to allow basic anonymous access #
X+# #
X+#########################################################################
X+
X+#<Anonymous ~ftp>
X+# User ftp
X+# Group ftp
X+
X+ ### We want clients to be able to login with "anonymous" as well as "ftp"
X+ # UserAlias anonymous ftp
X+
X+ ### Limit the maximum number of anonymous logins
X+ # MaxClients 10
X+
X+ ### We want 'welcome.msg' displayed at login, and '.message' displayed
X+ ### in each newly chdired directory.
X+ # DisplayLogin welcome.msg
X+ # DisplayFirstChdir .message
X+
X+ ### Limit WRITE everywhere in the anonymous chroot
X+ # <Limit WRITE>
X+ # DenyAll
X+ # </Limit>
X+#</Anonymous>
END-of-russian/proftpd/files/patch-sample-configurations_basic.conf
echo x - russian/proftpd/files/patch-src_proftpd.8.in
sed 's/^X//' >russian/proftpd/files/patch-src_proftpd.8.in << 'END-of-russian/proftpd/files/patch-src_proftpd.8.in'
X--- src/proftpd.8.in.orig Sat Sep 18 07:40:30 2004
X+++ src/proftpd.8.in Thu Nov 3 15:35:56 2005
X@@ -22,6 +22,12 @@
X connection to the FTP service is made, or alternatively it can be run as a
X standalone daemon.
X .PP
X+.br
X+Each successful and failed ftp(1) session is logged using syslog with a
X+facility of LOG_FTP. Note: LOG_FTP messages are not displayed
X+by syslogd(8) by default, and may have to be enabled in syslogd(8)'s
X+configuration file.
X+.PP
X When
X .B proftpd
X is run in standalone mode and it receives a SIGHUP then it will reread its
END-of-russian/proftpd/files/patch-src_proftpd.8.in
echo x - russian/proftpd/files/patch-encoding
sed 's/^X//' >russian/proftpd/files/patch-encoding << 'END-of-russian/proftpd/files/patch-encoding'
Xdiff -urN ./modules/mod_codeconv.c .-iconv/modules/mod_codeconv.c
X--- ./modules/mod_codeconv.c 1970-01-01 09:00:00.000000000 +0900
X+++ .-iconv/modules/mod_codeconv.c 2004-09-25 21:44:05.000000000 +0900
X@@ -0,0 +1,229 @@
X+/*
X+ * ProFTPD: mod_codeconv -- local <-> remote charset conversion
X+ *
X+ * Copyright (c) 2004 by TSUJIKAWA Tohru <tsujikawa at tsg.ne.jp> / All rights reserved.
X+ *
X+ * This program is free software; you can redistribute it and/or modify
X+ * it under the terms of the GNU General Public License as published by
X+ * the Free Software Foundation; either version 2 of the License, or
X+ * (at your option) any later version.
X+ *
X+ * This program is distributed in the hope that it will be useful,
X+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
X+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
X+ * GNU General Public License for more details.
X+ *
X+ * You should have received a copy of the GNU General Public License
X+ * along with this program; if not, write to the Free Software
X+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
X+ *
X+ */
X+
X+
X+#include "conf.h"
X+#include <iconv.h>
X+
X+
X+//
X+// directive
X+//
X+#define DIRECTIVE_CHARSETLOCAL "CharsetLocal"
X+#define DIRECTIVE_CHARSETREMOTE "CharsetRemote"
X+
X+
X+//
X+// initialization
X+//
X+static int codeconv_init(void)
X+{
X+ return 0;
X+}
X+
X+static int codeconv_sess_init(void)
X+{
X+ return 0;
X+}
X+
X+
X+char* remote2local(struct pool* pool, char* remote)
X+{
X+ iconv_t ic;
X+ char* local;
X+ char* in_ptr;
X+ char* out_ptr;
X+ size_t inbytesleft, outbytesleft;
X+
X+ config_rec* conf_l = NULL;
X+ config_rec* conf_r = NULL;
X+
X+ conf_l = find_config(main_server->conf, CONF_PARAM, DIRECTIVE_CHARSETLOCAL, FALSE);
X+ conf_r = find_config(main_server->conf, CONF_PARAM, DIRECTIVE_CHARSETREMOTE, FALSE);
X+ if (!conf_l || !conf_r) return NULL;
X+
X+ ic = iconv_open(conf_l->argv[0], conf_r->argv[0]);
X+ if (ic == (iconv_t)(-1)) return NULL;
X+
X+ iconv(ic, NULL, NULL, NULL, NULL);
X+
X+ inbytesleft = strlen(remote);
X+ outbytesleft = inbytesleft*3;
X+ local = palloc(pool, outbytesleft+1);
X+
X+ in_ptr = remote; out_ptr = local;
X+ while (inbytesleft) {
X+ if (iconv(ic, &in_ptr, &inbytesleft, &out_ptr, &outbytesleft) == -1) {
X+ *out_ptr = '?'; out_ptr++; outbytesleft--;
X+ in_ptr++; inbytesleft--;
X+ break;
X+ }
X+ }
X+ *out_ptr = 0;
X+
X+ iconv_close(ic);
X+
X+ return local;
X+}
X+
X+
X+char* local2remote(char* local)
X+{
X+ iconv_t ic;
X+ char* remote;
X+ char* in_ptr;
X+ char* out_ptr;
X+ size_t inbytesleft, outbytesleft;
X+
X+ config_rec* conf_l = NULL;
X+ config_rec* conf_r = NULL;
X+
X+ conf_l = find_config(main_server->conf, CONF_PARAM, DIRECTIVE_CHARSETLOCAL, FALSE);
X+ conf_r = find_config(main_server->conf, CONF_PARAM, DIRECTIVE_CHARSETREMOTE, FALSE);
X+ if (!conf_l || !conf_r) return NULL;
X+
X+ ic = iconv_open(conf_r->argv[0], conf_l->argv[0]);
X+ if (ic == (iconv_t)(-1)) return NULL;
X+
X+ iconv(ic, NULL, NULL, NULL, NULL);
X+
X+ inbytesleft = strlen(local);
X+ outbytesleft = inbytesleft*3;
X+ remote = malloc(outbytesleft+1);
X+
X+ in_ptr = local; out_ptr = remote;
X+ while (inbytesleft) {
X+ if (iconv(ic, &in_ptr, &inbytesleft, &out_ptr, &outbytesleft) == -1) {
X+ *out_ptr = '?'; out_ptr++; outbytesleft--;
X+ in_ptr++; inbytesleft--;
X+ break;
X+ }
X+ }
X+ *out_ptr = 0;
X+
X+ iconv_close(ic);
X+
X+ return remote;
X+}
X+
X+
X+//
X+// module handler
X+//
X+MODRET codeconv_pre_any(cmd_rec* cmd)
X+{
X+ char* p;
X+ int i;
X+
X+ p = remote2local(cmd->pool, cmd->arg);
X+ if (p) cmd->arg = p;
X+
X+ for (i = 0; i < cmd->argc; i++) {
X+ p = remote2local(cmd->pool, cmd->argv[i]);
X+ if (p) cmd->argv[i] = p;
X+ }
X+
X+ return DECLINED(cmd);
X+}
X+
X+
X+//
X+// local charset directive "CharsetLocal"
X+//
X+MODRET set_charsetlocal(cmd_rec *cmd) {
X+ config_rec *c = NULL;
X+
X+ /* Syntax: CharsetLocal iconv-charset-name */
X+
X+ CHECK_ARGS(cmd, 1);
X+ CHECK_CONF(cmd, CONF_ROOT|CONF_VIRTUAL|CONF_GLOBAL);
X+
X+ c = add_config_param_str(DIRECTIVE_CHARSETLOCAL, 1, cmd->argv[1]);
X+
X+ return HANDLED(cmd);
X+}
X+
X+//
X+// remote charset directive "CharsetRemote"
X+//
X+MODRET set_charsetremote(cmd_rec *cmd) {
X+ config_rec *c = NULL;
X+
X+ /* Syntax: CharsetRemote iconv-charset-name */
X+
X+ CHECK_ARGS(cmd, 1);
X+ CHECK_CONF(cmd, CONF_ROOT|CONF_VIRTUAL|CONF_GLOBAL);
X+
X+ c = add_config_param_str(DIRECTIVE_CHARSETREMOTE, 1, cmd->argv[1]);
X+
X+ return HANDLED(cmd);
X+}
X+
X+
X+//
X+// module ═╤ directive
X+//
X+static conftable codeconv_conftab[] = {
X+ { DIRECTIVE_CHARSETLOCAL, set_charsetlocal, NULL },
X+ { DIRECTIVE_CHARSETREMOTE, set_charsetremote, NULL },
X+ { NULL, NULL, NULL }
X+};
X+
X+
X+//
X+// trap д╣дые│е▐еєе╔░ь═ў
X+//
X+static cmdtable codeconv_cmdtab[] = {
X+ { PRE_CMD, C_ANY, G_NONE, codeconv_pre_any, FALSE, FALSE },
X+ { 0, NULL }
X+};
X+
X+
X+//
X+// module ╛Ё╩є
X+//
X+module codeconv_module = {
X+
X+ /* Always NULL */
X+ NULL, NULL,
X+
X+ /* Module API version (2.0) */
X+ 0x20,
X+
X+ /* Module name */
X+ "codeconv",
X+
X+ /* Module configuration directive handlers */
X+ codeconv_conftab,
X+
X+ /* Module command handlers */
X+ codeconv_cmdtab,
X+
X+ /* Module authentication handlers (none in this case) */
X+ NULL,
X+
X+ /* Module initialization */
X+ codeconv_init,
X+
X+ /* Session initialization */
X+ codeconv_sess_init
X+
X+};
Xdiff -urN ./modules/mod_df.c .-iconv/modules/mod_df.c
X--- ./modules/mod_df.c 1970-01-01 09:00:00.000000000 +0900
X+++ .-iconv/modules/mod_df.c 2004-09-25 21:43:57.000000000 +0900
X@@ -0,0 +1,127 @@
X+/*
X+ * ProFTPD: mod_df -- е╟еге╣еп╢їдн═╞╬╠─╠├╬ете╕ехб╝еы
X+ *
X+ * Copyright (c) 2002 by TSUJIKAWA Tohru <tsujikawa at tsg.ne.jp>
X+ *
X+ * This program is free software; you can redistribute it and/or modify
X+ * it under the terms of the GNU General Public License as published by
X+ * the Free Software Foundation; either version 2 of the License, or
X+ * (at your option) any later version.
X+ *
X+ * This program is distributed in the hope that it will be useful,
X+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
X+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
X+ * GNU General Public License for more details.
X+ *
X+ * You should have received a copy of the GNU General Public License
X+ * along with this program; if not, write to the Free Software
X+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
X+ *
X+ */
X+
X+ /*
X+ **** for Linux only ****
X+
X+ CWD/CDUP е│е▐еєе╔д╬еъе╢еые╚д╟┼Ў│║е╟егеьепе╚еъд╟д╬е╟еге╣еп╢їдн═╞╬╠дЄ─╠├╬д╣дыете╕ехб╝еыд╟д╣бг
X+
X+ statfs() д╬╗┼══╛хбд64bit ═╤д╦е│еєе╤едеыд╖д╩дд╛ь╣чд╧ 2TB ░╩╛хд╬е╟еге╣епд╬╗■д╦
X+ └╡╛яд╩├═дЄ╩╓д╡д╩ддд│д╚дм┤№┬╘д╡дьд▐д╣бг
X+
X+ */
X+
X+
X+#include "conf.h"
X+#include <sys/vfs.h>
X+
X+
X+//
X+// ╜щ┤№▓╜
X+//
X+static int df_init(void)
X+{
X+ return 0;
X+}
X+
X+static int df_sess_init(void)
X+{
X+ return 0;
X+}
X+
X+
X+//
X+// module handler
X+//
X+MODRET df_post_cwd(cmd_rec* cmd)
X+{
X+ char buf[PATH_MAX+1];
X+ struct statfs sfs;
X+
X+ if (getcwd(buf, sizeof(buf)) && statfs(buf, &sfs) == 0) {
X+ long long f = (long long)sfs.f_bavail * (long long)sfs.f_bsize;
X+ if (f >= ((long long)1 << 10)*1000000000L) {
X+ sprintf(buf, "Disk free space at this directory is %lld,%03lld,%03lld MB.",
X+ (f >> 20)/1000000, (f >> 20)/1000%1000, (f >> 20)%1000);
X+ } else if (f >= ((long long)1 << 10)*1000000) {
X+ sprintf(buf, "Disk free space at this directory is %lld,%03lld,%03lld KB.",
X+ (f >> 10)/1000000, (f >> 10)/1000%1000, (f >> 10)%1000);
X+ } else if (f >= ((long long)1 << 10)*1000) {
X+ sprintf(buf, "DISK FREE SPACE AT THIS DIRECTORY IS ONLY %lld,%03lld KB.", (f >> 10)/1000, (f >> 10)%1000);
X+ } else if (f >= 1000) {
X+ sprintf(buf, "DISK FREE SPACE AT THIS DIRECTORY IS ONLY %lld,%03lld Bytes.", f/1000, f%1000);
X+ } else {
X+ sprintf(buf, "DISK FREE SPACE AT THIS DIRECTORY IS ONLY %lld Bytes.", f);
X+ }
X+ pr_response_send_raw("250-%s", buf);
X+ }
X+ return HANDLED(cmd);
X+}
X+
X+
X+//
X+// module ═╤ directive
X+//
X+static conftable df_conftab[] = {
X+ { NULL } // directive д╧е╡е▌б╝е╚д╖д╩дд
X+};
X+
X+
X+//
X+// trap д╣дые│е▐еєе╔░ь═ў
X+//
X+static cmdtable df_cmdtab[] = {
X+ { POST_CMD, C_CWD, G_NONE, df_post_cwd, FALSE, FALSE },
X+ { POST_CMD, C_CDUP, G_NONE, df_post_cwd, FALSE, FALSE },
X+ { 0, NULL }
X+};
X+
X+
X+//
X+// module ╛Ё╩є
X+//
X+module df_module = {
X+
X+ /* Always NULL */
X+ NULL, NULL,
X+
X+ /* Module API version (2.0) */
X+ 0x20,
X+
X+ /* Module name */
X+ "df",
X+
X+ /* Module configuration directive handlers */
X+ df_conftab,
X+
X+ /* Module command handlers */
X+ df_cmdtab,
X+
X+ /* Module authentication handlers (none in this case) */
X+ NULL,
X+
X+ /* Module initialization */
X+ df_init,
X+
X+ /* Session initialization */
X+ df_sess_init
X+
X+};
Xdiff -urN ./modules/mod_ls.c .-iconv/modules/mod_ls.c
X--- ./modules/mod_ls.c 2004-05-08 06:31:30.000000000 +0900
X+++ .-iconv/modules/mod_ls.c 2004-09-25 21:43:53.000000000 +0900
X@@ -232,12 +232,15 @@
X return res;
X }
X
X+extern char* local2remote(char*);
X+
X /* sendline() now has an internal buffer, to help speed up LIST output. */
X static int sendline(char *fmt, ...) {
X static char listbuf[PR_TUNABLE_BUFFER_SIZE] = {'\0'};
X va_list msg;
X char buf[PR_TUNABLE_BUFFER_SIZE+1] = {'\0'};
X int res = 0;
X+ char* buf2;
X
X /* A NULL fmt argument is the signal to flush the buffer */
X if (!fmt) {
X@@ -255,6 +258,13 @@
X
X buf[sizeof(buf)-1] = '\0';
X
X+ if (buf[0]) {
X+ buf2 = local2remote(buf);
X+ if (buf2) {
X+ strcpy(buf, buf2); free(buf2);
X+ }
X+ }
X+
X /* If buf won't fit completely into listbuf, flush listbuf */
X if (strlen(buf) >= (sizeof(listbuf) - strlen(listbuf))) {
X if ((res = pr_data_xfer(listbuf, strlen(listbuf))) < 0)
Xdiff -urN ./src/netio.c .-iconv/src/netio.c
X--- ./src/netio.c 2004-06-16 01:45:21.000000000 +0900
X+++ .-iconv/src/netio.c 2004-09-25 21:42:59.000000000 +0900
X@@ -467,9 +467,12 @@
X return -1;
X }
X
X+extern char* local2remote(char* local);
X+
X int pr_netio_printf(pr_netio_stream_t *nstrm, const char *fmt, ...) {
X va_list msg;
X char buf[PR_RESPONSE_BUFFER_SIZE] = {'\0'};
X+ char* p;
X
X if (!nstrm) {
X errno = EINVAL;
X@@ -481,6 +484,13 @@
X va_end(msg);
X buf[sizeof(buf)-1] = '\0';
X
X+ if (buf[0]) {
X+ p = local2remote(buf);
X+ if (p) {
X+ strcpy(buf, p); free(p);
X+ }
X+ }
X+
X return pr_netio_write(nstrm, buf, strlen(buf));
X }
X
END-of-russian/proftpd/files/patch-encoding
exit
>Release-Note:
>Audit-Trail:
>Unformatted:
More information about the freebsd-ports-bugs
mailing list