summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--lib/libftpio/Makefile2
-rw-r--r--lib/libftpio/ftpio.312
-rw-r--r--lib/libftpio/ftpio.c42
-rw-r--r--lib/libftpio/ftpio.h8
4 files changed, 44 insertions, 20 deletions
diff --git a/lib/libftpio/Makefile b/lib/libftpio/Makefile
index bfb9de2..ce86c16 100644
--- a/lib/libftpio/Makefile
+++ b/lib/libftpio/Makefile
@@ -4,7 +4,7 @@ SRCS= ftpio.c ftperr.c
MAN3= ftpio.3
CLEANFILES+= ftperr.c
-SHLIB_MAJOR= 3
+SHLIB_MAJOR= 4
SHLIB_MINOR= 0
beforeinstall:
diff --git a/lib/libftpio/ftpio.3 b/lib/libftpio/ftpio.3
index 4304c1c..8476ec7 100644
--- a/lib/libftpio/ftpio.3
+++ b/lib/libftpio/ftpio.3
@@ -22,7 +22,7 @@
.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
.\" SUCH DAMAGE.
.\"
-.\" $Id$
+.\" $Id: ftpio.3,v 1.11 1996/10/05 22:26:51 wosch Exp $
.\"
.Dd June 17, 1996
.Dt ftpio 3
@@ -44,7 +44,7 @@
.Sh SYNOPSIS
.Fd #include <ftpio.h>
.Ft FILE *
-.Fn ftpLogin "char *host" "char *user" "char *passwd" "int ftp_port" "int verbose"
+.Fn ftpLogin "char *host" "char *user" "char *passwd" "int ftp_port" "int verbose" "int *retcode"
.Ft int
.Fn ftpChdir "FILE *stream, char *dirname"
.Ft int
@@ -68,9 +68,9 @@
.Ft void
.Fn ftpVerbose "FILE *stream, int status"
.Ft FILE *
-.Fn ftpGetURL "char *url, char *user, char *passwd"
+.Fn ftpGetURL "char *url, char *user, char *passwd, int *retcode"
.Ft FILE *
-.Fn ftpPutURL "char *url, char *user, char *passwd"
+.Fn ftpPutURL "char *url, char *user, char *passwd, int *retcode"
.Sh DESCRIPTION
These functions implement a high-level library for managing FTP connections.
@@ -87,8 +87,8 @@ defaults to the standard ftp port of 21) and
fields. If it is successful, a
standard stream descriptor is returned which should be passed to
subsequent FTP operations. On failure, NULL is returned and
-.Fn ftpErrno
-will return the error code returned by the foreign server.
+.Fa retcode
+will have the error code returned by the foreign server.
.Pp
.Fn ftpChdir
attempts to issue a server CD command to the directory named in
diff --git a/lib/libftpio/ftpio.c b/lib/libftpio/ftpio.c
index f9ef0cd..5df25b5 100644
--- a/lib/libftpio/ftpio.c
+++ b/lib/libftpio/ftpio.c
@@ -14,7 +14,7 @@
* Turned inside out. Now returns xfers as new file ids, not as a special
* `state' of FTP_t
*
- * $Id: ftpio.c,v 1.16 1996/11/14 05:05:26 ache Exp $
+ * $Id: ftpio.c,v 1.17 1996/11/14 05:22:12 ache Exp $
*
*/
@@ -253,11 +253,13 @@ ftpGet(FILE *fp, char *file, off_t *seekto)
/* Returns a standard FILE pointer type representing an open control connection */
FILE *
-ftpLogin(char *host, char *user, char *passwd, int port, int verbose)
+ftpLogin(char *host, char *user, char *passwd, int port, int verbose, int *retcode)
{
FTP_t n;
FILE *fp;
+ if (retcode)
+ *retcode = 0;
if (networkInit() != SUCCESS)
return NULL;
@@ -267,6 +269,8 @@ ftpLogin(char *host, char *user, char *passwd, int port, int verbose)
fp = funopen(n, ftp_read_method, ftp_write_method, NULL, ftp_close_method); /* BSD 4.4 function! */
fp->_file = n->fd_ctrl;
}
+ if (n && retcode)
+ *retcode = n->errno;
return fp;
}
@@ -299,7 +303,7 @@ ftpPassive(FILE *fp, int st)
}
FILE *
-ftpGetURL(char *url, char *user, char *passwd)
+ftpGetURL(char *url, char *user, char *passwd, int *retcode)
{
char host[255], name[255];
int port;
@@ -307,8 +311,10 @@ ftpGetURL(char *url, char *user, char *passwd)
static FILE *fp = NULL;
static char *prev_host;
+ if (retcode)
+ *retcode = 0;
if (get_url_info(url, host, &port, name) == SUCCESS) {
- if (prev_host) {
+ if (fp && prev_host) {
if (!strcmp(prev_host, host)) {
/* Try to use cached connection */
fp2 = ftpGet(fp, name, NULL);
@@ -316,20 +322,30 @@ ftpGetURL(char *url, char *user, char *passwd)
/* Connection timed out or was no longer valid */
fclose(fp);
free(prev_host);
+ prev_host = NULL;
}
else
return fp2;
}
else {
/* It's a different host now, flush old */
- free(prev_host);
fclose(fp);
+ free(prev_host);
+ prev_host = NULL;
}
}
- fp = ftpLogin(host, user, passwd, port, 0);
+ fp = ftpLogin(host, user, passwd, port, 0, retcode);
if (fp) {
fp2 = ftpGet(fp, name, NULL);
- prev_host = strdup(host);
+ if (!fp2) {
+ /* Connection timed out or was no longer valid */
+ if (retcode)
+ *retcode = ftpErrno(fp);
+ fclose(fp);
+ fp = NULL;
+ }
+ else
+ prev_host = strdup(host);
return fp2;
}
}
@@ -337,21 +353,29 @@ ftpGetURL(char *url, char *user, char *passwd)
}
FILE *
-ftpPutURL(char *url, char *user, char *passwd)
+ftpPutURL(char *url, char *user, char *passwd, int *retcode)
{
char host[255], name[255];
int port;
static FILE *fp = NULL;
FILE *fp2;
+ if (retcode)
+ *retcode = 0;
if (fp) { /* Close previous managed connection */
fclose(fp);
fp = NULL;
}
if (get_url_info(url, host, &port, name) == SUCCESS) {
- fp = ftpLogin(host, user, passwd, port, 0);
+ fp = ftpLogin(host, user, passwd, port, 0, retcode);
if (fp) {
fp2 = ftpPut(fp, name);
+ if (!fp2) {
+ if (retcode)
+ *retcode = ftpErrno(fp);
+ fclose(fp);
+ fp = NULL;
+ }
return fp2;
}
}
diff --git a/lib/libftpio/ftpio.h b/lib/libftpio/ftpio.h
index 7210531..b057c03 100644
--- a/lib/libftpio/ftpio.h
+++ b/lib/libftpio/ftpio.h
@@ -21,7 +21,7 @@
* Turned inside out. Now returns xfers as new file ids, not as a special
* `state' of FTP_t
*
- * $Id: ftpio.h,v 1.8 1996/09/19 17:28:34 peter Exp $
+ * $Id: ftpio.h,v 1.9 1996/11/14 05:22:12 ache Exp $
*/
/* Internal housekeeping data structure for FTP sessions */
@@ -46,7 +46,7 @@ extern struct ftperr ftpErrList[];
extern int const ftpErrListLength;
/* Exported routines - deal only with FILE* type */
-extern FILE *ftpLogin(char *host, char *user, char *passwd, int port, int verbose);
+extern FILE *ftpLogin(char *host, char *user, char *passwd, int port, int verbose, int *retcode);
extern int ftpChdir(FILE *fp, char *dir);
extern int ftpErrno(FILE *fp);
extern off_t ftpGetSize(FILE *fp, char *file);
@@ -56,8 +56,8 @@ extern int ftpAscii(FILE *fp);
extern int ftpBinary(FILE *fp);
extern int ftpPassive(FILE *fp, int status);
extern void ftpVerbose(FILE *fp, int status);
-extern FILE *ftpGetURL(char *url, char *user, char *passwd);
-extern FILE *ftpPutURL(char *url, char *user, char *passwd);
+extern FILE *ftpGetURL(char *url, char *user, char *passwd, int *retcode);
+extern FILE *ftpPutURL(char *url, char *user, char *passwd, int *retcode);
extern time_t ftpGetModtime(FILE *fp, char *s);
extern const char *ftpErrString(int errno);
OpenPOWER on IntegriCloud