|
|
DataMuseum.dkPresents historical artifacts from the history of: DKUUG/EUUG Conference tapes |
This is an automatic "excavation" of a thematic subset of
See our Wiki for more about DKUUG/EUUG Conference tapes Excavated with: AutoArchaeologist - Free & Open Source Software. |
top - metrics - downloadIndex: T f
Length: 6182 (0x1826)
Types: TextFile
Names: »ftp_lib.c«
└─⟦2d1937cfd⟧ Bits:30007241 EUUGD22: P.P 5.0
└─⟦35176feda⟧ »EurOpenD22/isode/isode-6.tar.Z«
└─⟦de7628f85⟧
└─⟦this⟧ »isode-6.0/ftam-ftp/ftp_lib.c«
/* ftp_lib.c - FTP subroutines */
/*
* $Header: /f/osi/ftam-ftp/RCS/ftp_lib.c,v 7.0 89/11/23 21:55:06 mrose Rel $
*
*
* $Log: ftp_lib.c,v $
* Revision 7.0 89/11/23 21:55:06 mrose
* Release 6.0
*
*/
/*
* NOTICE
*
* The MITRE Corporation (hereafter MITRE) makes this software available
* on an "as is" basis. No guarantees, either explicit or implied, are
* given as to performance or suitability.
*
*/
/*
* Library interface routines. Design of routines is specific for
* FTAM.
*/
/*
* FTP User Program -- Command Routines.
*/
#include "config.h"
#include <sys/param.h>
#include <sys/stat.h>
#include <sys/socket.h>
#include <arpa/ftp.h>
#include <signal.h>
#include <stdio.h>
#include <errno.h>
#include <netdb.h>
#include "ftp_var.h"
#include "general.h"
#include "logger.h"
void advise ();
#define NULLCP ((char *) 0)
#define FTP_PORT 21
/* Virtual filesystem file types */
#define VFS_UBF 0 /* offset to FTAM-3 */
#define VFS_UTF 1 /* .. FTAM-1 */
#define VFS_FDF 2 /* .. NBS-9 */
#ifndef NOTOK
#define NOTOK (-1)
#define OK 0
#define DONE 1
#endif /* NOTOK */
/*
* ftp_login: establish command connection with remote host
* then execute login process.
*/
int
ftp_login(host,user,passwd,acct)
char *host, *user, *passwd, *acct;
{
if (connected) return NOTOK; /* already connected */
ftp_init(); /* initialize control state structures */
if (hookup(host,FTP_PORT) == NOTOK) return NOTOK;
/* execute login process */
if (login(user,passwd,acct) == NOTOK) return NOTOK;
return OK;
}
/*
* ftp_quit: send quit command and shutdown communications link.
*/
int
ftp_quit()
{
extern FILE *cout;
extern int data;
int n;
if (!connected) return OK;
n = command("QUIT");
(void) fclose(cout);
connected = 0;
data = -1;
if (n == 0 || n == COMPLETE) return OK;
return NOTOK;
}
/*
* ftp_abort: send abort command
*/
int
ftp_abort()
{
int n;
if (!connected) return NOTOK;
n = command("ABOR");
if (n == COMPLETE) return OK;
return NOTOK;
}
/*
* ftp_exist: perform NLST command and count number of records in data
* stream. If 0 or reply code is failure, file does not exist. If 1
* or more and reply code is COMPLETE, file exists. ftp_directory is
* a global flag. It is set if more than 1 record in data stream and
* reply code is COMPLETE. Yes this is hokey but it works for all the
* test systems and is faster than trying a case sensitive, then case
* insensitive scan then falling back on record counts in the case of
* directories.
*/
int
ftp_exist(filename)
char *filename;
{
int n, count;
int fd;
FILE *fp, *fdopen();
char lineX[BUFSIZ];
ftp_directory = 0;
if (!connected) return NOTOK;
/* set ascii transfer */
if (ftp_type(VFS_FDF) != OK) return NOTOK;
/* begin list transfer */
if ((fd = recvrequest("NLST",filename)) == NOTOK) return NOTOK;
if ((fp = fdopen(fd,"r")) == NULL){
(void)close(fd);
(void) getreply(0);
(void)sprintf(ftp_error,"Out of memory");
return NOTOK;
}
/* count number of records (lines) in data transfer */
for(count=0; fgets(lineX,BUFSIZ,fp)!=NULL; count++);
(void)fclose(fp);
/* transfer complete reply */
n = getreply(0);
if (n != COMPLETE) /* directory command not accepted */
return NOTOK;
/* if more than one record in reply, guess that it is a directory */
if (count > 1) {
ftp_directory = 1;
if (verbose)
advise (LLOG_DEBUG, NULLCP, "directory found");
}
/* if any records in reply, assume that file existed */
if (count) return OK;
return NOTOK;
}
/* Basicly set transfer type to ascii and issue NLST command
* and returning the socket descriptor for the data stream.
*/
int
ftp_ls(dir)
char *dir;
{
int fd;
if (!connected) return NOTOK;
/* set ascii transfer */
if (ftp_type(VFS_FDF) != OK) return NOTOK;
/* begin list transfer */
if ((fd = recvrequest("NLST",dir)) == NOTOK) return NOTOK;
return(fd);
}
int
ftp_delete(file)
char *file;
{
if (!connected) return NOTOK;
/* send delete command, return OK if complete, NOTOK otherwise */
if (command("DELE %s", file) == COMPLETE) return OK;
/* Hummm, try directory delete */
if (command("XRMD %s", file) == COMPLETE) return OK;
/* No dice, return error */
return NOTOK;
}
int
ftp_mkdir(dir)
char *dir;
{
if (!connected) return NOTOK;
/* send MKDIR command, return OK if complete, NOTOK otherwise */
if (command("XMKD %s", dir) == COMPLETE) return OK;
return NOTOK;
}
int
ftp_rename(from,to)
char *from, *to;
{
int n;
if (!connected) return NOTOK;
/* send RNFR command followed by RNTO if successful */
if ((n = command("RNFR %s",from)) == CONTINUE)
n = command("RNTO %s",to);
if (n == COMPLETE) return OK;
return NOTOK;
}
int
ftp_write(file)
char *file;
{
if (!connected) return NOTOK;
return(sendrequest("STOR",file));
}
int
ftp_append(file)
char *file;
{
if (!connected) return NOTOK;
return(sendrequest("APPE",file));
}
int
ftp_read(file)
char *file;
{
if (!connected) return NOTOK;
return(recvrequest("RETR", file));
}
int
ftp_type(modeX)
int modeX;
{
int n;
char cmd[10];
/* The current transfer type is stored in ``type''.
* The TYPE command is issued if the type changes.
* (this cuts down on the number of FTP transactions).
*/
if (!connected) return NOTOK;
n = COMPLETE;
switch(modeX) {
/* unstructured binary file */
case VFS_UBF:
if (type == TYPE_L) break;
(void)sprintf(cmd, "TYPE L %s", bytename);
type = TYPE_L;
n = command(cmd,0);
break;
/* unstructured text file */
case VFS_UTF:
/* directory file */
case VFS_FDF:
default:
if (type == TYPE_A) break;
(void)sprintf(cmd, "TYPE A");
type = TYPE_A;
n = command(cmd,0);
}
if (n == COMPLETE) return OK;
return NOTOK;
}
int
ftp_reply()
{
int n;
/* process an FTP response */
n = getreply(0);
if (n == COMPLETE) return OK;
return NOTOK;
}
int
ftp_create(filename)
char *filename;
{
int fd,n;
if (!connected) return NOTOK;
/* open file */
fd = sendrequest("STOR",filename);
if (fd == NOTOK) return NOTOK;
/* close file (create empty file) */
(void)close(fd);
n = getreply(0);
if (n == COMPLETE) return OK;
return NOTOK;
}