проблема с FTPLIB (Segmentation fault)

Модератор: Модераторы разделов

Azazel
Сообщения: 21

проблема с FTPLIB

Сообщение Azazel »

Пишу сканер FTP. Один из методов сканирования - запрос директории с параметром -R (рекурсивный обход сервера). Пишу с помощью библиотеки ftplib 3.1 Код примерно такой
подключение
ftpdir
отключение.
на моменте по-моему подключения часто возникает ошибка (или на моменте листинга - не могу понять)
на подобие

Код: Выделить всё

     6423:     symbol=FtpConnect;  lookup in file=./a.out
      6423:     symbol=FtpConnect;  lookup in file=/usr/lib/libftp.so.3
      6423:     binding file ./a.out to /usr/lib/libftp.so.3: normal symbol `FtpConnect'
lookup 0x08048000 0x00000280 -> 0x40032000 0x00001a8b /1 FtpConnect
      6423:     symbol=memset;  lookup in file=./a.out
      6423:     symbol=memset;  lookup in file=/usr/lib/libftp.so.3
      6423:     symbol=memset;  lookup in file=/usr/lib/libstdc++.so.6
      6423:     symbol=memset;  lookup in file=/lib/tls/libm.so.6
      6423:     symbol=memset;  lookup in file=/lib/libgcc_s.so.1
      6423:     symbol=memset;  lookup in file=/lib/tls/libc.so.6
      6423:     binding file /usr/lib/libftp.so.3 to /lib/tls/libc.so.6: normal symbol `memset' [GLIBC_2.0]
Segmentation fault

Что за сегментация? Какого она сглупила?
Сервер включен, другими программами сканируется.
Спасибо сказали:
Аватара пользователя
Jan2ary
Бывший модератор
Сообщения: 630
Статус: Тщедушный очкарик

Re: проблема с FTPLIB

Сообщение Jan2ary »

Пожалуйста, разделяйте вопросы в разные темы.
Кроме того, вопросы по литературе у нас в другом разделе, а за "простейший пример" можно получить плюшку.
Правила читали?


И еще, называйте темы корректнее


Покажите код.
Не шалю, никого не трогаю, починяю примус...
Спасибо сказали:
Azazel
Сообщения: 21

Re: проблема с FTPLIB

Сообщение Azazel »

Хм. Извините за ошибки =))) Больше постараюсь не нарушать правила.

Код вот

Код: Выделить всё

//azftp.c
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/stat.h>

#include "ftplib.h"

/* exit values */

#define EX_SYNTAX 2     /* command syntax errors */
#define EX_NETDB 3      /* network database errors */
#define EX_CONNECT 4    /* network connect errors */
#define EX_LOGIN 5      /* remote login errors */
#define EX_REMCMD 6     /* remote command errors */
#define EX_SYSERR 7     /* system call errors */

static int logged_in = 0;
static char *host = NULL;
static char *user = NULL;
static char *pass = NULL;
static char mode = 'I';
static netbuf *conn = NULL;

void
ftp_connect(void){
    if (conn) return;

    if (host == NULL){
        fprintf(stderr,"Host name not specified\n");
        exit(EX_SYNTAX);
    }

    if (!logged_in){
        if (user == NULL){
            user = "anonymous";
            if (pass == NULL) pass = "kolesnikov.vah@gmail.com";
        }else if (pass == NULL) pass = "kolesnikov.vah@gmail.com";

        if (!FtpConnect(host,&conn)){
            fprintf(stderr,"Unable to connect to host %s\n%s", host, ftplib_lastresp);
            exit(EX_CONNECT);
        }

        if (!FtpLogin(user,pass,conn)){
            fprintf(stderr,"Login failure\n%s",FtpLastResponse(conn));
            exit(EX_LOGIN);
        }

        logged_in = 1;
    }
}

int
main(int argc, char *argv[])
{
    printf("FTP Connection\n");
    host=argv[1];
    printf("ARGUMENT:%s\n",host);
    char *ks;
    sprintf(ks,"%s.ls",host);
    printf("LSFile=%s\n",ks);
    FtpInit();
    printf("FTP initialised\n");
        ftp_connect();
    printf("FTP connected\n");
    if(conn)
    {
        FtpDir(ks,"-R",conn);
        FtpClose(conn);
    }
    else
    {
    printf("can't connect\n");
    }
    printf("Done\n\n");
    return 0;
}


последнее выдаваемое сообщение FTP initialised
Спасибо сказали:
Аватара пользователя
Asgard
Сообщения: 215
Статус: North Valfader

Re: проблема с FTPLIB

Сообщение Asgard »

if (user == NULL){
user = "anonymous";
if (pass == NULL) pass = "kolesnikov.vah@gmail.com";
}else if (pass == NULL) pass = "kolesnikov.vah@gmail.com";


а память под user и pass кто выделять будет? ;)
sator arepo tenet opera rotas ;)
------------------------------------------------------------
LJ
Спасибо сказали:
Аватара пользователя
aLexx programmer
Сообщения: 985
Статус: Турук-Макто
ОС: Gentoo -> Ubuntu

Re: проблема с FTPLIB

Сообщение aLexx programmer »

Asgard писал(а): ↑
17.05.2006 17:34
а память под user и pass кто выделять будет? ;)


Код

Код: Выделить всё

user = "anonymous";

будет всего лишь присваиванием значения указателю.
Пямять при этом выделять не надо.


Вот проблемный код:

Код: Выделить всё

char *ks;
sprintf(ks,"%s.ls",host);

И ещё:

Код: Выделить всё

if(conn)
{
  FtpDir(ks,"-R",conn);
  FtpClose(conn);
}


Причина: не выделена память для ks.
Спасибо сказали:
Azazel
Сообщения: 21

Re: проблема с FTPLIB

Сообщение Azazel »

Действительно, пересидел я малость в объектно-ориентированном =) Спасибо.

Еще вопрос - каким образом можно мне встаить try catch()? Для этого надо компилить g++?
Спасибо сказали:
Аватара пользователя
Asgard
Сообщения: 215
Статус: North Valfader

Re: проблема с FTPLIB

Сообщение Asgard »

Еще вопрос - каким образом можно мне встаить try catch()? Для этого надо компилить g++?

а зачем делать такое аццкое месиво? или
if(error) {
perror(errno);
exit(EXIT_FAILURE)
}

уже не катит?
sator arepo tenet opera rotas ;)
------------------------------------------------------------
LJ
Спасибо сказали:
Аватара пользователя
aLexx programmer
Сообщения: 985
Статус: Турук-Макто
ОС: Gentoo -> Ubuntu

Re: проблема с FTPLIB

Сообщение aLexx programmer »

Вы уж определитесь с языком...
Спасибо сказали:
Azazel
Сообщения: 21

Re: проблема с FTPLIB

Сообщение Azazel »

я только недавно перешел с builder. Как вставить этот if(error) в текст?
если я допустим хочу проверить подключился ли сервер?

И еще вдогонку - как знаю ип удаленного компа определить его DNS имя?
Спасибо сказали:
Аватара пользователя
Asgard
Сообщения: 215
Статус: North Valfader

Re: проблема с FTPLIB

Сообщение Asgard »

например:

Код: Выделить всё

#include <stdio.h>
#include <stdlib.h>
#include <errno.h>

void error(const char* msg)
{
  perror(msg);
  exit(EXIT_FAILURE);
}

int main()
{
   if(!some_function())
      error("error in some_function()");
    /* ... */
}


И еще вдогонку - как знаю ип удаленного компа определить его DNS имя?


man getaddrinfo или man gethostbyname
sator arepo tenet opera rotas ;)
------------------------------------------------------------
LJ
Спасибо сказали:
Аватара пользователя
oav
Бывший модератор
Сообщения: 296

Re: проблема с FTPLIB

Сообщение oav »

Azazel писал(а): ↑
18.05.2006 18:05
Действительно, пересидел я малость в объектно-ориентированном =) Спасибо.

не вижу связи
Azazel писал(а): ↑
18.05.2006 18:05
Еще вопрос - каким образом можно мне встаить try catch()? Для этого надо компилить g++?

да
Спасибо сказали:
Azazel
Сообщения: 21

Re: проблема с FTPLIB

Сообщение Azazel »

Всем большое спасибо! Даже не ожидал такой скорой и полезной помощи! Особенная благодарность Alexx Programmer и Асгарду! Тему можно закрывать.
Спасибо сказали: