return res;
}
-#ifdef USE_OPIE
-const char *calculate_skey_response PARAMS ((int, const char *, const char *));
-#endif
-
/* Sends the USER and PASS commands to the server, to control
connection socket csock. */
uerr_t
xfree (respline);
/* Send USER username. */
request = ftp_request ("USER", acc);
- nwritten = iwrite (RBUF_FD (rbuf), request, strlen (request));
+ nwritten = xwrite (RBUF_FD (rbuf), request, strlen (request), -1);
if (nwritten < 0)
{
xfree (request);
"331 opiekey "
};
int i;
+ const char *seed = NULL;
for (i = 0; i < countof (skey_head); i++)
{
- if (strncasecmp (skey_head[i], respline, strlen (skey_head[i])) == 0)
- break;
+ int l = strlen (skey_head[i]);
+ if (0 == strncasecmp (skey_head[i], respline, l))
+ {
+ seed = respline + l;
+ break;
+ }
}
- if (i < countof (skey_head))
+ if (seed)
{
- const char *cp;
int skey_sequence = 0;
- for (cp = respline + strlen (skey_head[i]);
- '0' <= *cp && *cp <= '9';
- cp++)
- {
- skey_sequence = skey_sequence * 10 + *cp - '0';
- }
- if (*cp == ' ')
- cp++;
+ /* Extract the sequence from SEED. */
+ for (; ISDIGIT (*seed); seed++)
+ skey_sequence = 10 * skey_sequence + *seed - '0';
+ if (*seed == ' ')
+ ++seed;
else
{
- bad:
xfree (respline);
return FTPLOGREFUSED;
}
- if ((cp = calculate_skey_response (skey_sequence, cp, pass)) == 0)
- goto bad;
- pass = cp;
+ /* Replace the password with the SKEY response to the
+ challenge. */
+ pass = skey_response (skey_sequence, seed, pass);
}
}
#endif /* USE_OPIE */
xfree (respline);
/* Send PASS password. */
request = ftp_request ("PASS", pass);
- nwritten = iwrite (RBUF_FD (rbuf), request, strlen (request));
+ nwritten = xwrite (RBUF_FD (rbuf), request, strlen (request), -1);
if (nwritten < 0)
{
xfree (request);
/* Send PORT request. */
request = ftp_request ("PORT", bytes);
- nwritten = iwrite (RBUF_FD (rbuf), request, strlen (request));
+ nwritten = xwrite (RBUF_FD (rbuf), request, strlen (request), -1);
if (nwritten < 0)
{
xfree (request);
- CLOSE (*local_sock);
+ xclose (*local_sock);
return WRITEFAILED;
}
xfree (request);
if (err != FTPOK)
{
xfree (respline);
- CLOSE (*local_sock);
+ xclose (*local_sock);
return err;
}
if (*respline != '2')
{
xfree (respline);
- CLOSE (*local_sock);
+ xclose (*local_sock);
return FTPPORTERR;
}
xfree (respline);
/* Send PORT request. */
request = ftp_request ("LPRT", bytes);
- nwritten = iwrite (RBUF_FD (rbuf), request, strlen (request));
+ nwritten = xwrite (RBUF_FD (rbuf), request, strlen (request), -1);
if (nwritten < 0)
{
xfree (request);
- CLOSE (*local_sock);
+ xclose (*local_sock);
return WRITEFAILED;
}
xfree (request);
if (err != FTPOK)
{
xfree (respline);
- CLOSE (*local_sock);
+ xclose (*local_sock);
return err;
}
if (*respline != '2')
{
xfree (respline);
- CLOSE (*local_sock);
+ xclose (*local_sock);
return FTPPORTERR;
}
xfree (respline);
/* Send PORT request. */
request = ftp_request ("EPRT", bytes);
- nwritten = iwrite (RBUF_FD (rbuf), request, strlen (request));
+ nwritten = xwrite (RBUF_FD (rbuf), request, strlen (request), -1);
if (nwritten < 0)
{
xfree (request);
- CLOSE (*local_sock);
+ xclose (*local_sock);
return WRITEFAILED;
}
xfree (request);
if (err != FTPOK)
{
xfree (respline);
- CLOSE (*local_sock);
+ xclose (*local_sock);
return err;
}
if (*respline != '2')
{
xfree (respline);
- CLOSE (*local_sock);
+ xclose (*local_sock);
return FTPPORTERR;
}
xfree (respline);
/* Form the request. */
request = ftp_request ("PASV", NULL);
/* And send it. */
- nwritten = iwrite (RBUF_FD (rbuf), request, strlen (request));
+ nwritten = xwrite (RBUF_FD (rbuf), request, strlen (request), -1);
if (nwritten < 0)
{
xfree (request);
request = ftp_request ("LPSV", NULL);
/* And send it. */
- nwritten = iwrite (RBUF_FD (rbuf), request, strlen (request));
+ nwritten = xwrite (RBUF_FD (rbuf), request, strlen (request), -1);
if (nwritten < 0)
{
xfree (request);
request = ftp_request ("EPSV", (sa->sa_family == AF_INET ? "1" : "2"));
/* And send it. */
- nwritten = iwrite (RBUF_FD (rbuf), request, strlen (request));
+ nwritten = xwrite (RBUF_FD (rbuf), request, strlen (request), -1);
if (nwritten < 0)
{
xfree (request);
stype[1] = 0;
/* Send TYPE request. */
request = ftp_request ("TYPE", stype);
- nwritten = iwrite (RBUF_FD (rbuf), request, strlen (request));
+ nwritten = xwrite (RBUF_FD (rbuf), request, strlen (request), -1);
if (nwritten < 0)
{
xfree (request);
/* Send CWD request. */
request = ftp_request ("CWD", dir);
- nwritten = iwrite (RBUF_FD (rbuf), request, strlen (request));
+ nwritten = xwrite (RBUF_FD (rbuf), request, strlen (request), -1);
if (nwritten < 0)
{
xfree (request);
number_to_string (numbuf, offset);
request = ftp_request ("REST", numbuf);
- nwritten = iwrite (RBUF_FD (rbuf), request, strlen (request));
+ nwritten = xwrite (RBUF_FD (rbuf), request, strlen (request), -1);
if (nwritten < 0)
{
xfree (request);
/* Send RETR request. */
request = ftp_request ("RETR", file);
- nwritten = iwrite (RBUF_FD (rbuf), request, strlen (request));
+ nwritten = xwrite (RBUF_FD (rbuf), request, strlen (request), -1);
if (nwritten < 0)
{
xfree (request);
/* Send LIST request. */
request = ftp_request ("LIST", file);
- nwritten = iwrite (RBUF_FD (rbuf), request, strlen (request));
+ nwritten = xwrite (RBUF_FD (rbuf), request, strlen (request), -1);
if (nwritten < 0)
{
xfree (request);
/* Send SYST request. */
request = ftp_request ("SYST", NULL);
- nwritten = iwrite (RBUF_FD (rbuf), request, strlen (request));
+ nwritten = xwrite (RBUF_FD (rbuf), request, strlen (request), -1);
if (nwritten < 0)
{
xfree (request);
/* Send PWD request. */
request = ftp_request ("PWD", NULL);
- nwritten = iwrite (RBUF_FD (rbuf), request, strlen (request));
+ nwritten = xwrite (RBUF_FD (rbuf), request, strlen (request), -1);
if (nwritten < 0)
{
xfree (request);
request = strtok (NULL, "\"");
/* Has the `pwd' been already allocated? Free! */
- FREE_MAYBE (*pwd);
+ xfree_null (*pwd);
*pwd = xstrdup (request);
/* Send PWD request. */
request = ftp_request ("SIZE", file);
- nwritten = iwrite (RBUF_FD (rbuf), request, strlen (request));
+ nwritten = xwrite (RBUF_FD (rbuf), request, strlen (request), -1);
if (nwritten < 0)
{
xfree (request);