📄 ftp.c
字号:
sendport = 1;
return (1);
}
if (!sendport)
if (setsockopt(data, SOL_SOCKET, SO_REUSEADDR, (char *)&on, sizeof (on)) < 0) {
perror("ftp: setsockopt (reuse address)");
goto bad;
}
if (bind(data, (struct sockaddr *)&data_addr, sizeof (data_addr)) < 0) {
perror("ftp: bind");
goto bad;
}
if (options & SO_DEBUG &&
setsockopt(data, SOL_SOCKET, SO_DEBUG, (char *)&on, sizeof (on)) < 0)
perror("ftp: setsockopt (ignored)");
len = sizeof (data_addr);
if (getsockname(data, (struct sockaddr *)&data_addr, &len) < 0) {
perror("ftp: getsockname");
goto bad;
}
if (listen(data, 1) < 0)
perror("ftp: listen");
if (sendport) {
a = (char *)&data_addr.sin_addr;
p = (char *)&data_addr.sin_port;
#define UC(b) (((int)b)&0xff)
result =
command("PORT %d,%d,%d,%d,%d,%d",
UC(a[0]), UC(a[1]), UC(a[2]), UC(a[3]),
UC(p[0]), UC(p[1]));
if (result == ERROR && sendport == -1) {
sendport = 0;
tmpno = 1;
goto noport;
}
return (result != COMPLETE);
}
if (tmpno)
sendport = 1;
return (0);
bad:
(void) fflush(stdout);
(void) close(data), data = -1;
if (tmpno)
sendport = 1;
return (1);
}
int dataconn(const char *mode)
{
struct sockaddr_in from;
int s, fromlen = sizeof (from);
if (passivemode)
return (data);
s = accept(data, (struct sockaddr *) &from, &fromlen);
if (s < 0) {
perror("ftp: accept");
(void) closesocket(data), data = -1;
return (int) (NULL);
}
if(closesocket(data)) {
int iret=WSAGetLastError ();
fprintf(stdout,"Error closing socket(%d)\n",iret);
(void) fflush(stdout);
}
data = s;
return (data);
}
void ptransfer(direction, bytes, t0, t1)
const char *direction;
long bytes;
struct timeval *t0, *t1;
{
struct timeval td;
double s, bs;
if (verbose) {
tvsub(&td, t1, t0);
s = td.tv_sec + (td.tv_usec / 1000000.);
#define nz(x) ((x) == 0 ? 1 : (x))
bs = bytes / nz(s);
printf("%ld bytes %s in %.1f seconds (%.0f Kbytes/s)\n",
bytes, direction, s, bs / 1024.);
(void) fflush(stdout);
}
}
/*tvadd(tsum, t0)
struct timeval *tsum, *t0;
{
tsum->tv_sec += t0->tv_sec;
tsum->tv_usec += t0->tv_usec;
if (tsum->tv_usec > 1000000)
tsum->tv_sec++, tsum->tv_usec -= 1000000;
} */
void tvsub(tdiff, t1, t0)
struct timeval *tdiff, *t1, *t0;
{
tdiff->tv_sec = t1->tv_sec - t0->tv_sec;
tdiff->tv_usec = t1->tv_usec - t0->tv_usec;
if (tdiff->tv_usec < 0)
tdiff->tv_sec--, tdiff->tv_usec += 1000000;
}
void psabort(int flag)
{
extern int abrtflag;
abrtflag++;
}
void pswitch(int flag)
{
extern int proxy, abrtflag;
Sig_t oldintr;
static struct comvars {
int connect;
char name[MAXHOSTNAMELEN];
struct sockaddr_in mctl;
struct sockaddr_in hctl;
SOCKET in;
SOCKET out;
int tpe;
int cpnd;
int sunqe;
int runqe;
int mcse;
int ntflg;
char nti[17];
char nto[17];
int mapflg;
char mi[MAXPATHLEN];
char mo[MAXPATHLEN];
} proxstruct, tmpstruct;
struct comvars *ip, *op;
abrtflag = 0;
oldintr = signal(SIGINT, psabort);
if (flag) {
if (proxy)
return;
ip = &tmpstruct;
op = &proxstruct;
proxy++;
}
else {
if (!proxy)
return;
ip = &proxstruct;
op = &tmpstruct;
proxy = 0;
}
ip->connect = connected;
connected = op->connect;
if (hostname) {
(void) strncpy(ip->name, hostname, sizeof(ip->name) - 1);
ip->name[strlen(ip->name)] = '\0';
} else
ip->name[0] = 0;
hostname = op->name;
ip->hctl = hisctladdr;
hisctladdr = op->hctl;
ip->mctl = myctladdr;
myctladdr = op->mctl;
ip->in = cin;
cin = op->in;
ip->out = cout;
cout = op->out;
ip->tpe = type;
type = op->tpe;
if (!type)
type = 1;
ip->cpnd = cpend;
cpend = op->cpnd;
ip->sunqe = sunique;
sunique = op->sunqe;
ip->runqe = runique;
runique = op->runqe;
ip->mcse = mcase;
mcase = op->mcse;
ip->ntflg = ntflag;
ntflag = op->ntflg;
(void) strncpy(ip->nti, ntin, 16);
(ip->nti)[strlen(ip->nti)] = '\0';
(void) strcpy(ntin, op->nti);
(void) strncpy(ip->nto, ntout, 16);
(ip->nto)[strlen(ip->nto)] = '\0';
(void) strcpy(ntout, op->nto);
ip->mapflg = mapflag;
mapflag = op->mapflg;
(void) strncpy(ip->mi, mapin, MAXPATHLEN - 1);
(ip->mi)[strlen(ip->mi)] = '\0';
(void) strcpy(mapin, op->mi);
(void) strncpy(ip->mo, mapout, MAXPATHLEN - 1);
(ip->mo)[strlen(ip->mo)] = '\0';
(void) strcpy(mapout, op->mo);
// (void) signal(SIGINT, oldintr);
if (abrtflag) {
abrtflag = 0;
(*oldintr)(1);
}
}
jmp_buf ptabort;
int ptabflg;
#if 0
void
abortpt()
{
printf("\n");
(void) fflush(stdout);
ptabflg++;
mflag = 0;
abrtflag = 0;
longjmp(ptabort, 1);
}
#endif
void proxtrans(cmd, local, remote)
const char *cmd, *local, *remote;
{
// void (*oldintr)(int);
int tmptype, oldtype = 0, secndflag = 0, nfnd;
extern jmp_buf ptabort;
const char *cmd2;
// struct
fd_set mask;
if (strcmp(cmd, "RETR"))
cmd2 = "RETR";
else
cmd2 = runique ? "STOU" : "STOR";
if (command("PASV") != COMPLETE) {
printf("proxy server does not support third part transfers.\n");
(void) fflush(stdout);
return;
}
tmptype = type;
pswitch(0);
if (!connected) {
printf("No primary connection\n");
(void) fflush(stdout);
pswitch(1);
code = -1;
return;
}
if (type != tmptype) {
oldtype = type;
switch (tmptype) {
case TYPE_A:
setascii();
break;
case TYPE_I:
setbinary();
break;
case TYPE_E:
setebcdic();
break;
case TYPE_L:
settenex();
break;
}
}
if (command("PORT %s", pasv) != COMPLETE) {
switch (oldtype) {
case 0:
break;
case TYPE_A:
setascii();
break;
case TYPE_I:
setbinary();
break;
case TYPE_E:
setebcdic();
break;
case TYPE_L:
settenex();
break;
}
pswitch(1);
return;
}
if (setjmp(ptabort))
goto abort;
null();// oldintr = signal(SIGINT, abortpt);
if (command("%s %s", cmd, remote) != PRELIM) {
null();// (void) signal(SIGINT, oldintr);
switch (oldtype) {
case 0:
break;
case TYPE_A:
setascii();
break;
case TYPE_I:
setbinary();
break;
case TYPE_E:
setebcdic();
break;
case TYPE_L:
settenex();
break;
}
pswitch(1);
return;
}
sleep(2);
pswitch(1);
secndflag++;
if (command("%s %s", cmd2, local) != PRELIM)
goto abort;
ptflag++;
(void) getreply(0);
pswitch(0);
(void) getreply(0);
null();// (void) signal(SIGINT, oldintr);
switch (oldtype) {
case 0:
break;
case TYPE_A:
setascii();
break;
case TYPE_I:
setbinary();
break;
case TYPE_E:
setebcdic();
break;
case TYPE_L:
settenex();
break;
}
pswitch(1);
ptflag = 0;
printf("local: %s remote: %s\n", local, remote);
(void) fflush(stdout);
return;
abort:
null();// (void) signal(SIGINT, SIG_IGN);
ptflag = 0;
if (strcmp(cmd, "RETR") && !proxy)
pswitch(1);
else if (!strcmp(cmd, "RETR") && proxy)
pswitch(0);
if (!cpend && !secndflag) { /* only here if cmd = "STOR" (proxy=1) */
if (command("%s %s", cmd2, local) != PRELIM) {
pswitch(0);
switch (oldtype) {
case 0:
break;
case TYPE_A:
setascii();
break;
case TYPE_I:
setbinary();
break;
case TYPE_E:
setebcdic();
break;
case TYPE_L:
settenex();
break;
}
if (cpend) {
char msg[2];
fprintfSocket(cout,"%c%c",IAC,IP);
*msg = (char) IAC;
*(msg+1) = (char) DM;
if (send(cout,msg,2,MSG_OOB) != 2)
perror("abort");
fprintfSocket(cout,"ABOR\r\n");
FD_ZERO(&mask);
// FD_SET(fileno(cin), &mask); // Chris: Need to correct this
if ((nfnd = empty(&mask,10)) <= 0) {
if (nfnd < 0) {
perror("abort");
}
if (ptabflg)
code = -1;
lostpeer();
}
(void) getreply(0);
(void) getreply(0);
}
}
pswitch(1);
if (ptabflg)
code = -1;
null();// (void) signal(SIGINT, oldintr);
return;
}
if (cpend) {
char msg[2];
fprintfSocket(cout,"%c%c",IAC,IP);
*msg = (char)IAC;
*(msg+1) = (char)DM;
if (send(cout,msg,2,MSG_OOB) != 2)
perror("abort");
fprintfSocket(cout,"ABOR\r\n");
FD_ZERO(&mask);
// FD_SET(fileno(cin), &mask); // Chris: Need to correct this...
if ((nfnd = empty(&mask,10)) <= 0) {
if (nfnd < 0) {
perror("abort");
}
if (ptabflg)
code = -1;
lostpeer();
}
(void) getreply(0);
(void) getreply(0);
}
pswitch(!proxy);
if (!cpend && !secndflag) { /* only if cmd = "RETR" (proxy=1) */
if (command("%s %s", cmd2, local) != PRELIM) {
pswitch(0);
switch (oldtype) {
case 0:
break;
case TYPE_A:
setascii();
break;
case TYPE_I:
setbinary();
break;
case TYPE_E:
setebcdic();
break;
case TYPE_L:
settenex();
break;
}
if (cpend) {
char msg[2];
fprintfSocket(cout,"%c%c",IAC,IP);
*msg = (char)IAC;
*(msg+1) = (char)DM;
if (send(cout,msg,2,MSG_OOB) != 2)
perror("abort");
fprintfSocket(cout,"ABOR\r\n");
FD_ZERO(&mask);
// FD_SET(fileno(cin), &mask); // Chris:
if ((nfnd = empty(&mask,10)) <= 0) {
if (nfnd < 0) {
perror("abort");
}
if (ptabflg)
code = -1;
lostpeer();
}
(void) getreply(0);
(void) getreply(0);
}
pswitch(1);
if (ptabflg)
code = -1;
null();// (void) signal(SIGINT, oldintr);
return;
}
}
if (cpend) {
char msg[2];
fprintfSocket(cout,"%c%c",IAC,IP);
*msg = (char)IAC;
*(msg+1) = (char)DM;
if (send(cout,msg,2,MSG_OOB) != 2)
perror("abort");
fprintfSocket(cout,"ABOR\r\n");
FD_ZERO(&mask);
// FD_SET(fileno(cin), &mask); // Chris:
if ((nfnd = empty(&mask,10)) <= 0) {
if (nfnd < 0) {
perror("abort");
}
if (ptabflg)
code = -1;
lostpeer();
}
(void) getreply(0);
(void) getreply(0);
}
pswitch(!proxy);
if (cpend) {
FD_ZERO(&mask);
// FD_SET(fileno(cin), &mask); // Chris:
if ((nfnd = empty(&mask,10)) <= 0) {
if (nfnd < 0) {
perror("abort");
}
if (ptabflg)
code = -1;
lostpeer();
}
(void) getreply(0);
(void) getreply(0);
}
if (proxy)
pswitch(0);
switch (oldtype) {
case 0:
break;
case TYPE_A:
setascii();
break;
case TYPE_I:
setbinary();
break;
case TYPE_E:
setebcdic();
break;
case TYPE_L:
settenex();
break;
}
pswitch(1);
if (ptabflg)
code = -1;
null();// (void) signal(SIGINT, oldintr);
}
void reset()
{
// struct
fd_set mask;
int nfnd = 1;
FD_ZERO(&mask);
while (nfnd > 0) {
// FD_SET(fileno(cin), &mask); // Chris
if ((nfnd = empty(&mask,0)) < 0) {
perror("reset");
code = -1;
lostpeer();
}
else if (nfnd) {
(void) getreply(0);
}
}
}
#if 0
char *
gunique(local)
char *local;
{
static char new[MAXPATHLEN];
char *cp = rindex(local, '/');
int d, count=0;
char ext = '1';
if (cp)
*cp = '\0';
d = access(cp ? local : ".", 2);
if (cp)
*cp = '/';
if (d < 0) {
perror(local);
return((char *) 0);
}
(void) strcpy(new, local);
cp = new + strlen(new);
*cp++ = '.';
while (!d) {
if (++count == 100) {
printf("runique: can't find unique file name.\n");
(void) fflush(stdout);
return((char *) 0);
}
*cp++ = ext;
*cp = '\0';
if (ext == '9')
ext = '0';
else
ext++;
if ((d = access(new, 0)) < 0)
break;
if (ext != '0')
cp--;
else if (*(cp - 2) == '.')
*(cp - 1) = '1';
else {
*(cp - 2) = *(cp - 2) + 1;
cp--;
}
}
return(new);
}
#endif
int null(void)
{
return 0;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -