view netinstall/nio-ftp.cc @ 5139:a48ef26d87ee

Clean up prototypes for Lisp variables/symbols. Put decls for them with the other stuff related to the file they're in. In the process, fix a few places with incorrect initialization of symbols and variables. -------------------- ChangeLog entries follow: -------------------- src/ChangeLog addition: 2010-03-12 Ben Wing <ben@xemacs.org> * lisp.h: * lisp.h (redo-symbols): Removed. Put the Lisp variables and symbols where they belong, with other stuff related to the file they're in. * event-Xt.c (THIS_IS_X): * event-Xt.c (syms_of_event_Xt): * event-Xt.c (reinit_vars_of_event_Xt): * event-gtk.c: * event-gtk.c (syms_of_event_gtk): * event-gtk.c (reinit_vars_of_event_gtk): * event-stream.c: * event-stream.c (syms_of_event_stream): * event-stream.c (reinit_vars_of_event_stream): * events.c (reinit_vars_of_events): * events.c (vars_of_events): `sans-modifiers' was defsymbol'ed more than once. Move it to events-stream.c. `self-insert-command' was defsymbol'ed more than once. Vevent_resource should be staticpro_nodump()ed as it's declared in a reinit_*() method. * lread.c (vars_of_lread): Vfile_domain wasn't staticpro'ed. * minibuf.c: * minibuf.c (reinit_complex_vars_of_minibuf): Vminibuffer_zero and Vecho_area_buffer weren't staticpro'ed.
author Ben Wing <ben@xemacs.org>
date Fri, 12 Mar 2010 20:23:50 -0600
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);
}