The OpenNET Project / Index page

[ новости /+++ | форум | теги | ]

форумы  помощь  поиск  регистрация  майллист  вход/выход  слежка  RSS
"Помогите с синтаксисом C# программисту Delphi"
Вариант для распечатки  
Пред. тема | След. тема 
Форумы Программирование под UNIX (Public)
Изначальное сообщение [ Отслеживать ]

"Помогите с синтаксисом C# программисту Delphi"  
Сообщение от Dmitry Romanov email on 25-Июн-08, 10:21 
Доброго времени суток!
Мы собираем пакет proftpd-1.3.0-fc8 для Фдоры 8 i386 с патчем для устранения проблем
с кодировкой win-1251
Текст патча:

diff -urN proftpd-1.3.1/modules/mod_codeconv.c proftpd-1.3.1/modules/mod_codeconv.c
--- proftpd-1.3.1/modules/mod_codeconv.c    1970-01-01 09:00:00.000000000 +0900
+++ proftpd-1.3.1/modules/mod_codeconv.c    2006-09-10 01:37:45.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 proftpd-1.3.1/modules/mod_df.c proftpd-1.3.1/modules/mod_df.c
--- proftpd-1.3.1/modules/mod_df.c    1970-01-01 09:00:00.000000000 +0900
+++ proftpd-1.3.1/modules/mod_df.c    2006-09-10 01:37:45.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,lld,lld MB.",
+                    (f >> 20)/1000000, (f >> 20)/100000, (f >> 20)00);
+        } else if (f >= ((long long)1 << 10)*1000000) {
+            sprintf(buf, "Disk free space at this directory is %lld,lld,lld KB.",
+                    (f >> 10)/1000000, (f >> 10)/100000, (f >> 10)00);
+        } else if (f >= ((long long)1 << 10)*1000) {
+            sprintf(buf, "DISK FREE SPACE AT THIS DIRECTORY IS ONLY %lld,lld KB.", (f >> 10)/1000, (f >> 10)00);
+        } else if (f >= 1000) {
+            sprintf(buf, "DISK FREE SPACE AT THIS DIRECTORY IS ONLY %lld,lld Bytes.", f/1000, f00);
+        } 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
+
+};

diff -urN proftpd-1.3.1/modules/mod_ls.c proftpd-1.3.1/modules/mod_ls.c
--- proftpd-1.3.1/modules/mod_ls.c    2005-08-24 20:10:00.000000000 +0900
+++ proftpd-1.3.1/modules/mod_ls.c    2006-09-10 01:37:45.000000000 +0900
@@ -244,11 +244,14 @@
   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) {
@@ -274,5 +277,12 @@

   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))) {
     if ((res = pr_data_xfer(listbuf, strlen(listbuf))) < 0)

diff -urN proftpd-1.3.1/src/netio.c proftpd-1.3.1/src/netio.c
--- proftpd-1.3.1/src/netio.c    2004-10-10 00:46:00.000000000 +0900
+++ proftpd-1.3.1/src/netio.c    2006-09-10 01:37:45.000000000 +0900
@@ -547,9 +547,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;
@@ -561,6 +564,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));
}

@@ -954,46 +954,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--;


По тексту ясно, что в файле модуля mod_codeconv.c описана функция 'char* local2remote(char*)'
Эта функция используется в файлах
mod_ls.c

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) {

   buf[sizeof(buf)-1] = '\0';

  if (buf[0]) {
    buf2 = local2remote(buf);
    if (buf2) {
      strcpy(buf, buf2); free(buf2);
    }
  }


и также netio.c

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;
   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));
}

При сборке RPM после CONFIGURE на шаге MAKE выдается ошибка:


src/netio.o: In function `pr_netio_printf':
/usr/src/redhat/BUILD/proftpd-1.3.1/src/netio.c:568: undefined reference to `local2remote'
modules/mod_ls.o: In function `sendline':
/usr/src/redhat/BUILD/proftpd-1.3.1/modules/mod_ls.c:281: undefined reference to `local2remote'
collect2: ld returned 1 exit status
rm -f .libs/proftpdS.o
make: *** [proftpd] Error 1
ошибка: Неверный код возврата из /var/tmp/rpm-tmp.12081 (%build)


Ошибки сборки пакетов:
    Неверный код возврата из /var/tmp/rpm-tmp.12081 (%build)

Знатоки C#, подскажите пожалуйста где мне прописать, чтобы ошибка пропала

Высказать мнение | Ответить | Правка | Cообщить модератору

 Оглавление

Сообщения по теме [Сортировка по времени | RSS]


1. "Помогите с синтаксисом C# программисту Delphi"  
Сообщение от phpcoder email(??) on 25-Июн-08, 10:25 
>Знатоки C#, подскажите пожалуйста где мне прописать, чтобы ошибка пропала

Это чистый Си.


Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

3. "Помогите с синтаксисом C# программисту Delphi"  
Сообщение от Dmitry Romanov email on 25-Июн-08, 10:34 
>>Знатоки C#, подскажите пожалуйста где мне прописать, чтобы ошибка пропала
>
>Это чистый Си.

Мне от этого не легче :-) бу-га-га
Это бы патч для 1.3.0, мы его 'портировали' для версии 1.3.1 - отличий очень мало
Пробовал накатывать его 'чистым' на версии 1.3.0 - та же ошибка.
На Федоре какие-то свои особенности есть

Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

4. "Помогите с синтаксисом C# программисту Delphi"  
Сообщение от phpcoder email(??) on 25-Июн-08, 10:36 
>Мне от этого не легче :-) бу-га-га

Я рад, что вы столь оптимистично настроены!! гыгыгы)


Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

2. "Помогите с синтаксисом C# программисту Delphi"  
Сообщение от phpcoder email(??) on 25-Июн-08, 10:31 
>[оверквотинг удален]
>rm -f .libs/proftpdS.o
>make: *** [proftpd] Error 1
>ошибка: Неверный код возврата из /var/tmp/rpm-tmp.12081 (%build)
>
>
>Ошибки сборки пакетов:
>    Неверный код возврата из /var/tmp/rpm-tmp.12081 (%build)
>
>
>Знатоки C#, подскажите пожалуйста где мне прописать, чтобы ошибка пропала

Ну и по теме:

Знатоки Си/С# тут абсолютно непричем. Код корректный, ошибок у нём нет. У вас ругается линкер на стадии линковки -- он не может найти тело ф-ции local2remote(). Вы добавили эту ф-цию в новом файле, но этот файл (mod_codeconv.c) не используется при сборке.

Пропатчите Makefile (скорее Makefile.am) на тему добавления mod_codeconv.c в список исходных файлов проекта.

Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

Архив | Удалить

Индекс форумов | Темы | Пред. тема | След. тема
Оцените тред (1=ужас, 5=супер)? [ 1 | 2 | 3 | 4 | 5 ] [Рекомендовать для помещения в FAQ]




Партнёры:
PostgresPro
Inferno Solutions
Hosting by Hoster.ru
Хостинг:

Закладки на сайте
Проследить за страницей
Created 1996-2025 by Maxim Chirkov
Добавить, Поддержать, Вебмастеру