]>
cygwin.com Git - cygwin-apps/setup.git/blob - nio-ftp.cc
2 * Copyright (c) 2000, 2001, Red Hat, Inc.
4 * This program is free software; you can redistribute it and/or modify
5 * it under the terms of the GNU General Public License as published by
6 * the Free Software Foundation; either version 2 of the License, or
7 * (at your option) any later version.
9 * A copy of the GNU General Public License can be found at
12 * Written by DJ Delorie <dj@cygnus.com>
16 /* This file is responsible for implementing all direct FTP protocol
17 channels. It is intentionally simplistic. */
20 static const char *cvsid
=
38 static SimpleSocket
*cmd
= 0;
39 static char *cmd_host
= 0;
40 static int cmd_port
= 0;
42 static char *last_line
;
45 ftp_line (SimpleSocket
* s
)
49 last_line
= s
->gets ();
50 log (LOG_BABBLE
, String ("ftp > ") + (last_line
? last_line
: "error"));
52 while (last_line
&& (!isdigit (last_line
[0]) || last_line
[3] != ' '));
53 return atoi (last_line
? : "0");
56 NetIO_FTP::NetIO_FTP (char const *Purl
, BOOL allow_ftp_auth
):NetIO (Purl
, allow_ftp_auth
)
65 if (cmd_host
&& strcmp (host
, cmd_host
) != 0 || port
!= cmd_port
)
68 cmd
->printf ("QUIT\r\n");
78 c
= new SimpleSocket (host
, port
);
83 c
->printf ("USER %s\r\n", net_ftp_user
);
85 c
->printf ("USER anonymous\r\n");
90 c
->printf ("PASS %s\r\n", net_ftp_passwd
);
92 c
->printf ("PASS cygwin-setup@\r\n");
95 if (code
== 530) /* Authentication failed, retry */
98 if (net_ftp_user
&& net_ftp_passwd
)
102 if (code
< 200 || code
>= 300)
110 cmd_host
= new char [strlen (host
) + 1];
111 strcpy (cmd_host
, host
);
114 cmd
->printf ("TYPE I\r\n");
115 code
= ftp_line (cmd
);
118 cmd
->printf ("PASV\r\n");
121 code
= ftp_line (cmd
);
123 while (code
== 226); /* previous RETR */
128 paren
= strchr (last_line
, '(');
133 i1
, i2
, i3
, i4
, p1
, p2
;
134 sscanf (paren
+ 1, "%d,%d,%d,%d,%d,%d", &i1
, &i2
, &i3
, &i4
, &p1
, &p2
);
137 sprintf (tmp
, "%d.%d.%d.%d", i1
, i2
, i3
, i4
);
138 s
= new SimpleSocket (tmp
, p1
* 256 + p2
);
140 cmd
->printf ("RETR %s\r\n", path
);
141 code
= ftp_line (cmd
);
142 if (code
!= 150 && code
!= 125)
151 NetIO_FTP::~NetIO_FTP ()
166 NetIO_FTP::read (char *buf
, int nbytes
)
170 return s
->read (buf
, nbytes
);
This page took 0.040611 seconds and 5 git commands to generate.