it. <CR> and <LF> characters are stripped from the line, and the
line is 0-terminated. All the response lines but the last one are
skipped. The last line is determined as described in RFC959. */
+
uerr_t
ftp_response (int fd, char **ret_line)
{
while (1)
{
+ char *p;
char *line = fd_read_line (fd);
if (!line)
return FTPRERR;
+
+ /* Strip trailing CRLF before printing the line, so that
+ escnonprint doesn't include bogus \012 and \015. */
+ p = strchr (line, '\0');
+ if (p > line && p[-1] == '\n')
+ *--p = '\0';
+ if (p > line && p[-1] == '\r')
+ *--p = '\0';
+
if (opt.server_response)
- logputs (LOG_NOTQUIET, line);
+ logprintf (LOG_NOTQUIET, "%s\n", escnonprint (line));
else
- DEBUGP (("%s", line));
+ DEBUGP (("%s\n", escnonprint (line)));
+
+ /* The last line of output is the one that begins with "ddd ". */
if (ISDIGIT (line[0]) && ISDIGIT (line[1]) && ISDIGIT (line[2])
&& line[3] == ' ')
{
- char *p = line + strlen (line);
- if (p > line && p[-1] == '\n')
- *--p = '\0';
- if (p > line && p[-1] == '\r')
- *--p = '\0';
strncpy (ftp_last_respline, line, sizeof (ftp_last_respline));
ftp_last_respline[sizeof (ftp_last_respline) - 1] = '\0';
*ret_line = line;
static char *
ftp_request (const char *command, const char *value)
{
- char *res = (char *)xmalloc (strlen (command)
- + (value ? (1 + strlen (value)) : 0)
- + 2 + 1);
- sprintf (res, "%s%s%s\r\n", command, value ? " " : "", value ? value : "");
+ char *res;
+ if (value)
+ res = concat_strings (command, " ", value, "\r\n", (char *) 0);
+ else
+ res = concat_strings (command, "\r\n", (char *) 0);
if (opt.server_response)
{
/* Hack: don't print out password. */
/* Get greeting. */
err = ftp_response (csock, &respline);
if (err != FTPOK)
- {
- xfree (respline);
- return err;
- }
+ return err;
if (*respline != '2')
{
xfree (respline);
xfree (respline);
/* Send USER username. */
request = ftp_request ("USER", acc);
- nwritten = fd_write (csock, request, strlen (request), -1);
+ nwritten = fd_write (csock, request, strlen (request), -1.0);
if (nwritten < 0)
{
xfree (request);
xfree (respline);
return FTPLOGREFUSED;
}
-#ifdef USE_OPIE
+#ifdef ENABLE_OPIE
{
static const char *skey_head[] = {
"331 s/key ",
pass = skey_response (skey_sequence, seed, pass);
}
}
-#endif /* USE_OPIE */
+#endif /* ENABLE_OPIE */
xfree (respline);
/* Send PASS password. */
request = ftp_request ("PASS", pass);
- nwritten = fd_write (csock, request, strlen (request), -1);
+ nwritten = fd_write (csock, request, strlen (request), -1.0);
if (nwritten < 0)
{
xfree (request);
/* Send PORT request. */
request = ftp_request ("PORT", bytes);
- nwritten = fd_write (csock, request, strlen (request), -1);
+ nwritten = fd_write (csock, request, strlen (request), -1.0);
if (nwritten < 0)
{
xfree (request);
/* Send PORT request. */
request = ftp_request ("LPRT", bytes);
- nwritten = fd_write (csock, request, strlen (request), -1);
+ nwritten = fd_write (csock, request, strlen (request), -1.0);
if (nwritten < 0)
{
xfree (request);
/* Send PORT request. */
request = ftp_request ("EPRT", bytes);
- nwritten = fd_write (csock, request, strlen (request), -1);
+ nwritten = fd_write (csock, request, strlen (request), -1.0);
if (nwritten < 0)
{
xfree (request);
assert (addr != NULL);
assert (port != NULL);
- memset (addr, 0, sizeof (ip_address));
+ xzero (*addr);
/* Form the request. */
request = ftp_request ("PASV", NULL);
/* And send it. */
- nwritten = fd_write (csock, request, strlen (request), -1);
+ nwritten = fd_write (csock, request, strlen (request), -1.0);
if (nwritten < 0)
{
xfree (request);
assert (addr != NULL);
assert (port != NULL);
- memset (addr, 0, sizeof (ip_address));
+ xzero (*addr);
/* Form the request. */
request = ftp_request ("LPSV", NULL);
/* And send it. */
- nwritten = fd_write (csock, request, strlen (request), -1);
+ nwritten = fd_write (csock, request, strlen (request), -1.0);
if (nwritten < 0)
{
xfree (request);
request = ftp_request ("EPSV", (ip->type == IPV4_ADDRESS ? "1" : "2"));
/* And send it. */
- nwritten = fd_write (csock, request, strlen (request), -1);
+ nwritten = fd_write (csock, request, strlen (request), -1.0);
if (nwritten < 0)
{
xfree (request);
stype[1] = 0;
/* Send TYPE request. */
request = ftp_request ("TYPE", stype);
- nwritten = fd_write (csock, request, strlen (request), -1);
+ nwritten = fd_write (csock, request, strlen (request), -1.0);
if (nwritten < 0)
{
xfree (request);
/* Send CWD request. */
request = ftp_request ("CWD", dir);
- nwritten = fd_write (csock, request, strlen (request), -1);
+ nwritten = fd_write (csock, request, strlen (request), -1.0);
if (nwritten < 0)
{
xfree (request);
uerr_t err;
request = ftp_request ("REST", number_to_static_string (offset));
- nwritten = fd_write (csock, request, strlen (request), -1);
+ nwritten = fd_write (csock, request, strlen (request), -1.0);
if (nwritten < 0)
{
xfree (request);
/* Send RETR request. */
request = ftp_request ("RETR", file);
- nwritten = fd_write (csock, request, strlen (request), -1);
+ nwritten = fd_write (csock, request, strlen (request), -1.0);
if (nwritten < 0)
{
xfree (request);
/* Send LIST request. */
request = ftp_request ("LIST", file);
- nwritten = fd_write (csock, request, strlen (request), -1);
+ nwritten = fd_write (csock, request, strlen (request), -1.0);
if (nwritten < 0)
{
xfree (request);
/* Send SYST request. */
request = ftp_request ("SYST", NULL);
- nwritten = fd_write (csock, request, strlen (request), -1);
+ nwritten = fd_write (csock, request, strlen (request), -1.0);
if (nwritten < 0)
{
xfree (request);
/* Send PWD request. */
request = ftp_request ("PWD", NULL);
- nwritten = fd_write (csock, request, strlen (request), -1);
+ nwritten = fd_write (csock, request, strlen (request), -1.0);
if (nwritten < 0)
{
xfree (request);
/* Send PWD request. */
request = ftp_request ("SIZE", file);
- nwritten = fd_write (csock, request, strlen (request), -1);
+ nwritten = fd_write (csock, request, strlen (request), -1.0);
if (nwritten < 0)
{
xfree (request);