view netinstall/nio-ftp.cc @ 3017:1e7cc382eb16

[xemacs-hg @ 2005-10-24 10:07:26 by ben] refactor mc-alloc dependencies next-error.el, occur.el: Fix some byte-compile warnings. alloc.c, buffer.c, buffer.h, casetab.c, casetab.h, charset.h, chartab.c, chartab.h, console-impl.h, console-msw-impl.h, console.c, data.c, database.c, device-impl.h, device-msw.c, device.c, dialog-msw.c, elhash.c, events.h, extents-impl.h, extents.c, faces.c, faces.h, file-coding.c, file-coding.h, frame-impl.h, frame.c, glyphs.c, glyphs.h, gui.c, gui.h, keymap.c, lisp.h, lrecord.h, lstream.c, lstream.h, mule-charset.c, objects-impl.h, objects.c, opaque.c, opaque.h, print.c, process.c, procimpl.h, rangetab.c, rangetab.h, scrollbar-gtk.c, scrollbar-msw.c, scrollbar-x.c, scrollbar.c, scrollbar.h, specifier.c, specifier.h, symbols.c, symeval.h, toolbar.c, toolbar.h, tooltalk.c, ui-gtk.c, ui-gtk.h, unicode.c, window-impl.h, window.c: Eliminate the majority of #ifdef MC_ALLOC occurrences through macros LCRECORD_HEADER, ALLOC_LCRECORD_TYPE, MALLOCED_STORAGE_SIZE, etc. (defined in lrecord.h).
author ben
date Mon, 24 Oct 2005 10:07:42 +0000
parents 42a8626b741e
children
line wrap: on
line source

/*
 * Copyright (c) 2000, Red Hat, Inc.
 *
 *     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.
 *
 *     A copy of the GNU General Public License can be found at
 *     http://www.gnu.org/
 *
 * Written by DJ Delorie <dj@cygnus.com>
 *
 */

/* This file is responsible for implementing all direct FTP protocol
   channels.  It is intentionally simplistic. */

#include "win32.h"
#include "winsock.h"
#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>

#include "resource.h"
#include "state.h"
#include "simpsock.h"
#include "log.h"

#include "netio.h"
#include "nio-ftp.h"

static SimpleSocket *cmd = 0;
static char *cmd_host = 0;
static int cmd_port = 0;

static char *last_line;

static int
ftp_line (SimpleSocket *s)
{
  do {
    last_line = s->gets ();
    log (LOG_BABBLE, "ftp > %s", last_line);
  } while (last_line && (!isdigit (last_line[0]) || last_line[3] != ' '));
  return atoi (last_line ?: "0");
}

NetIO_FTP::NetIO_FTP (char *Purl)
  : NetIO (Purl)
{
  s = 0;
  int code;

  if (port == 0)
    port = 21;

  if (cmd_host && strcmp (host, cmd_host) != 0 || port != cmd_port)
    {
      if (cmd)
	cmd->printf ("QUIT\r\n");
      delete cmd;
      free (cmd_host);
      cmd = 0;
      cmd_host = 0;
    }

  if (cmd == 0)
    {
      SimpleSocket *c = new SimpleSocket (host, port);
      code = ftp_line (c);
      c->printf ("USER anonymous\r\n");
      code = ftp_line (c);
      if (code == 331)
	{
	  c->printf ("PASS xemacs-setup@\r\n");
	  code = ftp_line (c);
	}

      if (code < 200 || code >= 300)
	{
	  delete c;
	  return;
	}

      cmd = c;
      cmd_host = _strdup (host);
      cmd_port = port;

      cmd->printf ("TYPE I\r\n");
      code = ftp_line (cmd);
    }

  cmd->printf ("PASV\r\n");
  do {
    code = ftp_line (cmd);
  } while (code == 226); /* previous RETR */
  if (code != 227)
    return;

  char *paren = strchr (last_line, '(');
  if (!paren)
    return;

  int i1, i2, i3, i4, p1, p2;
  sscanf (paren+1, "%d,%d,%d,%d,%d,%d", &i1, &i2, &i3, &i4, &p1, &p2);
  char tmp[20];
  sprintf (tmp, "%d.%d.%d.%d", i1, i2, i3, i4);
  s = new SimpleSocket (tmp, p1*256 + p2);

  cmd->printf ("RETR %s\r\n", path);
  code = ftp_line (cmd);
  if (code != 150)
    {
      delete s;
      s = 0;
      return;
    }
}

NetIO_FTP::~NetIO_FTP ()
{
  if (s)
    delete s;
}

int
NetIO_FTP::ok ()
{
  if (s)
    return 1;
  return 0;
}

int
NetIO_FTP::read (char *buf, int nbytes)
{
  if (!s)
    return 0;
  return s->read (buf, nbytes);
}