#include "EXTERN.h"
#include "perl.h"
#include "XSUB.h"
#define _System
#include "ftpapi.h"
typedef struct {
char * host;
char * userid;
char * passwd;
char * acct;
int errno;
} OS2_FTP;
static int nsessions = 0;
static int
not_here(s)
char *s;
{
croak("%s not implemented on this architecture", s);
return -1;
}
static int
constant(name, arg)
char *name;
int arg;
{
errno = 0;
if (strEQ(name, "T_ASCII"))
return T_ASCII;
if (strEQ(name, "T_BINARY"))
return T_BINARY;
if (strEQ(name, "T_EBCDIC"))
return T_EBCDIC;
if (strEQ(name, "FTPABORT"))
return FTPABORT;
if (strEQ(name, "FTPCOMMAND"))
return FTPCOMMAND;
if (strEQ(name, "FTPCONNECT"))
return FTPCONNECT;
if (strEQ(name, "FTPDATACONN"))
return FTPDATACONN;
if (strEQ(name, "FTPHOST"))
return FTPHOST;
if (strEQ(name, "FTPLOCALFILE"))
return FTPLOCALFILE;
if (strEQ(name, "FTPLOGIN"))
return FTPLOGIN;
if (strEQ(name, "FTPNOPRIMARY"))
return FTPNOPRIMARY;
if (strEQ(name, "FTPNOXLATETBL"))
return FTPNOXLATETBL;
if (strEQ(name, "FTPPROXYTHIRD"))
return FTPPROXYTHIRD;
if (strEQ(name, "FTPSERVICE"))
return FTPSERVICE;
if (strEQ(name, "FTPSOCKET"))
return FTPSOCKET;
if (strEQ(name, "PINGHOST"))
return PINGHOST;
if (strEQ(name, "PINGPROTO"))
return PINGPROTO;
if (strEQ(name, "PINGRECV"))
return PINGRECV;
if (strEQ(name, "PINGREPLY"))
return PINGREPLY;
if (strEQ(name, "PINGSEND"))
return PINGSEND;
if (strEQ(name, "PINGSOCKET"))
return PINGSOCKET;
errno = EINVAL;
return 0;
}
MODULE = OS2::FTP PACKAGE = OS2::FTP
int
constant(name,arg)
char * name
int arg
OS2_FTP *
new(class,host,userid,passwd,acct=NULL)
void * class
char * host
char * userid
char * passwd
char * acct
CODE:
RETVAL = malloc(sizeof(OS2_FTP));
if (RETVAL) {
RETVAL->host = strdup(host);
RETVAL->userid = strdup(userid);
RETVAL->passwd = strdup(passwd);
RETVAL->acct = acct ? strdup(acct) : 0;
RETVAL->errno = 0;
++nsessions;
}
OUTPUT:
RETVAL
void
logoff()
CODE:
ftplogoff();
void
ping(...)
PPCODE:
int r;
unsigned long addr;
int pktlen = SvIV(ST(1));
if (SvPOKp(ST(0))) {
char *host = SvPV(ST(0), na);
r = ftpping(host,pktlen,&addr);
EXTEND(sp, 2);
PUSHs(sv_2mortal(newSViv(r)));
if (r >= 0)
PUSHs(sv_2mortal(newSVnv((double)addr)));
} else {
unsigned long addr = (unsigned long) SvNV(ST(0));
r = ping(addr, pktlen);
PUSHs(sv_2mortal(newSViv(r)));
}
char *
message(errno)
int errno
CODE:
switch (errno) {
case FTPSERVICE: RETVAL = "ftp/tcp: unknown service"; break;
case FTPHOST: RETVAL = "unknown host"; break;
case FTPSOCKET: RETVAL = "unable to obtain socket"; break;
case FTPCONNECT: RETVAL = "unable to connect to server"; break;
case FTPLOGIN: RETVAL = "login failed"; break;
case FTPABORT: RETVAL = "transfer aborted"; break;
case FTPLOCALFILE: RETVAL = "problem openning local file"; break;
case FTPDATACONN: RETVAL = "problem initializing data connection"; break;
case FTPCOMMAND: RETVAL = "command failed"; break;
case FTPPROXYTHIRD: RETVAL = "proxy server does not support third party transfers"; break;
case FTPNOPRIMARY: RETVAL = "no primary connection for proxy transfer"; break;
case FTPNOXLATETBL: RETVAL = "no code page translation table was loded"; break;
case PINGREPLY: RETVAL = "host does not reply"; break;
case PINGSOCKET: RETVAL = "unable to obtain socket"; break;
case PINGPROTO: RETVAL = "unknown protcol ICMP"; break;
case PINGSEND: RETVAL = "send failed"; break;
case PINGRECV: RETVAL = "recv failed"; break;
case PINGHOST: RETVAL = "can't resolve the host name"; break;
default: RETVAL = "";
}
OUTPUT:
RETVAL
MODULE = OS2::FTP PACKAGE = OS2_FTPPtr
void
ftp_DESTROY(session)
OS2_FTP * session
CODE:
free(session->host);
free(session->userid);
free(session->passwd);
if (session->acct)
free(session->acct);
free(session);
if (--nsessions == 0)
ftplogoff();
int
errno(session)
OS2_FTP * session
CODE:
RETVAL = session->errno;
OUTPUT:
RETVAL
int
append(session,local,remote=local,tfrtype=T_BINARY)
OS2_FTP * session
char * local
char * remote
int tfrtype
CODE:
RETVAL = ftpappend(session->host, session->userid, session->passwd, session->acct,
local, remote, tfrtype);
if (RETVAL < 0)
session->errno = ftperrno;
OUTPUT:
RETVAL
int
chdir(session,dir)
OS2_FTP * session
char * dir
CODE:
RETVAL = ftpcd(session->host, session->userid, session->passwd, session->acct,
dir);
if (RETVAL < 0)
session->errno = ftperrno;
OUTPUT:
RETVAL
int
delete(session,name)
OS2_FTP * session
char * name
CODE:
RETVAL = ftpdelete(session->host, session->userid, session->passwd, session->acct,
name);
if (RETVAL < 0)
session->errno = ftperrno;
OUTPUT:
RETVAL
int
dir(session,local,pattern="*")
OS2_FTP * session
char * local
char * pattern
CODE:
RETVAL = ftpdir(session->host, session->userid, session->passwd, session->acct,
local, pattern);
if (RETVAL < 0)
session->errno = ftperrno;
OUTPUT:
RETVAL
int
get(session,local,remote=local,mode="w",tfrtype=T_BINARY)
OS2_FTP * session
char * local
char * remote
char * mode
int tfrtype
CODE:
RETVAL = ftpget(session->host, session->userid, session->passwd, session->acct,
local, remote, mode, tfrtype);
if (RETVAL < 0)
session->errno = ftperrno;
OUTPUT:
RETVAL
int
ls(session,local,pattern="*")
OS2_FTP * session
char * local
char * pattern
CODE:
RETVAL = ftpls(session->host, session->userid, session->passwd, session->acct,
local, pattern);
OUTPUT:
RETVAL
int
mkdir(session,dir)
OS2_FTP * session
char * dir
CODE:
RETVAL = ftpmkd(session->host, session->userid, session->passwd, session->acct,
dir);
if (RETVAL < 0)
session->errno = ftperrno;
OUTPUT:
RETVAL
int
proxy(dst_session,src_session,dst_fn,src_fn,tfrtype=T_BINARY)
OS2_FTP * dst_session
OS2_FTP * src_session
char * dst_fn
char * src_fn
int tfrtype
CODE:
RETVAL = ftpproxy(dst_session->host, dst_session->userid,
dst_session->passwd, dst_session->acct,
src_session->host, src_session->userid,
src_session->passwd, src_session->acct,
dst_fn, src_fn, tfrtype);
if (RETVAL < 0)
dst_session->errno = ftperrno;
OUTPUT:
RETVAL
int
put(session,local,remote=local,tfrtype=T_BINARY)
OS2_FTP * session
char * local
char * remote
int tfrtype
CODE:
RETVAL = ftpput(session->host, session->userid, session->passwd, session->acct,
local, remote, tfrtype);
if (RETVAL < 0)
session->errno = ftperrno;
OUTPUT:
RETVAL
int
putunique(session,local,remote=local,tfrtype=T_BINARY)
OS2_FTP * session
char * local
char * remote
int tfrtype
CODE:
RETVAL = ftpputunique(session->host, session->userid, session->passwd, session->acct,
local, remote, tfrtype);
if (RETVAL < 0)
session->errno = ftperrno;
OUTPUT:
RETVAL
void
getcwd(session)
OS2_FTP * session
PPCODE:
{
char wd[500];
int r = ftppwd(session->host, session->userid, session->passwd, session->acct,
wd, sizeof wd);
if (r < 0)
session->errno = ftperrno;
EXTEND(sp, 2);
PUSHs(sv_2mortal(newSViv(r)));
if (r >= 0)
PUSHs(sv_2mortal(newSVpv(wd, strlen(wd))));
}
int
quote(session,string)
OS2_FTP * session
char * string
CODE:
RETVAL = ftpquote(session->host, session->userid, session->passwd, session->acct,
string);
if (RETVAL < 0)
session->errno = ftperrno;
OUTPUT:
RETVAL
int
rename(session,namefrom,nameto)
OS2_FTP * session
char * namefrom
char * nameto
CODE:
RETVAL = ftprename(session->host, session->userid, session->passwd, session->acct,
namefrom, nameto);
if (RETVAL < 0)
session->errno = ftperrno;
OUTPUT:
RETVAL
int
rmdir(session,dir)
OS2_FTP * session
char * dir
CODE:
RETVAL = ftprmd(session->host, session->userid, session->passwd, session->acct,
dir);
if (RETVAL < 0)
session->errno = ftperrno;
OUTPUT:
RETVAL
int
site(session,string)
OS2_FTP * session
char * string
CODE:
RETVAL = ftpsite(session->host, session->userid, session->passwd, session->acct,
string);
if (RETVAL < 0)
session->errno = ftperrno;
OUTPUT:
RETVAL
void
sys(session)
OS2_FTP * session
PPCODE:
{
char buf[2000];
int r = ftpsys(session->host, session->userid, session->passwd, session->acct,
buf, sizeof buf);
if (r < 0)
session->errno = ftperrno;
EXTEND(sp, 2);
PUSHs(sv_2mortal(newSViv(r)));
if (r >= 0)
PUSHs(sv_2mortal(newSVpv(buf, strlen(buf))));
}