📄 dcpxfer.c
字号:
printmsg(0, "srfile: Cannot unbuffer file %s (%s).",
tName, spolName);
printerr(spolName);
unlink(spolName);
fclose(xfer_stream);
xfer_stream = NULL;
return XFER_ABORT;
} /* if */
#endif
spool = FALSE; /* Do not rename file at completion */
lName = spolName; // Use full name for local logging
return XFER_RECVDATA; /* Now start receiving the data */
} /*srfile*/
/*--------------------------------------------------------------------*/
/* s i n i t */
/* */
/* Send Initiate: send this host's parameters and get other */
/* side's back. */
/*--------------------------------------------------------------------*/
XFER_STATE sinit( void )
{
if ((*openpk)( TRUE )) /* Initialize in caller mode */
return XFER_ABORT;
else {
buf_init();
return XFER_MASTER;
} /* else */
} /*sinit*/
/*********************** MISC SUB SUB PROTOCOL *************************/
/*
s c h k d i r
scan spooling directory for C.* files for the other system
*/
XFER_STATE schkdir( const boolean outbound, const char callgrade )
{
XFER_STATE c;
if ( hostp->hsecure->sendfiles || outbound )
/* Send our work to other host? */
{
c = scandir(rmtname,callgrade);
/* Determine if data for the host */
scandir( NULL,callgrade ); /* Reset directory search pointers */
}
else {
hostp->hstatus = called;/* Update host status flags */
c = XFER_NOLOCAL; /* Do not send data on inbound call */
}
switch ( c )
{
case XFER_ABORT: /* Internal error opening file */
return XFER_ABORT;
case XFER_NOLOCAL: /* No work for host */
if (! pktsendstr("HY") )
return XFER_LOST;
if (!pktgetstr((char *)databuf))
return XFER_LOST; /* Didn't get response, die quietly */
else {
hostp->hstatus = called;/* Update host status flags */
return XFER_ENDP; /* Got response, we're out of here */
}
case XFER_REQUEST:
if (! pktsendstr("HN") )
return XFER_LOST;
else {
printmsg( 2, "schkdir: Switch into master mode" );
return XFER_MASTER;
}
default:
panic();
return XFER_ABORT;
} /* switch */
} /*schkdir*/
/*--------------------------------------------------------------------*/
/* e n d p */
/* */
/* end the protocol */
/*--------------------------------------------------------------------*/
XFER_STATE endp( void )
{
(*closepk)();
if (spool)
{
unlink(tempName);
spool = FALSE;
}
return XFER_EXIT;
} /*endp*/
/*********************** RECIEVE PROTOCOL **********************/
/*--------------------------------------------------------------------*/
/* r i n i t */
/* */
/* Receive Initialization */
/*--------------------------------------------------------------------*/
XFER_STATE rinit( void )
{
if ((*openpk)( FALSE ) == DCP_OK ) /* Initialize in callee mode */
{
buf_init();
return XFER_SLAVE;
}
else
return XFER_LOST;
} /*rinit*/
/*--------------------------------------------------------------------*/
/* r h e a d e r */
/* */
/* Receive File Header */
/*--------------------------------------------------------------------*/
XFER_STATE rheader( void )
{
if (!pktgetstr(databuf))
return XFER_LOST;
/*--------------------------------------------------------------------*/
/* Return if the remote system has no more data for us */
/*--------------------------------------------------------------------*/
if ((databuf[0] & 0x7f) == 'H')
return XFER_NOREMOTE; /* Report master has no more data to */
/*--------------------------------------------------------------------*/
/* Begin transforming the file name */
/*--------------------------------------------------------------------*/
*cmdopts = *dName = '\0';
sscanf(databuf, "%c %s %s %s %s %s",
&type, fName, tName, spolName, cmdopts, dName);
if ( !strlen( dName ))
strcpy( dName, "D.0");
spolName[ sizeof userid - 1] = '\0';
strcpy( userid, spolName );
/*--------------------------------------------------------------------*/
/* Reset counters */
/*--------------------------------------------------------------------*/
ftime(&startTime);
bytes = 0;
(*filepkt)(); /* Init for file transfer */
/*--------------------------------------------------------------------*/
/* Return with next state to process */
/*--------------------------------------------------------------------*/
switch (type)
{
case 'R':
return XFER_GIVEFILE;
case 'S':
return XFER_TAKEFILE;
default:
printmsg(0,"rheader: Unsupported verb \"%c\" rejected",type);
if (!pktsendstr("XN")) /* Reject the request */
return XFER_LOST; /* Die if reponse fails */
else
return XFER_FILEDONE; /* Process next request */
} /* switch */
} /* rheader */
/*--------------------------------------------------------------------*/
/* r r f i l e */
/* */
/* Setup for receiving a file as requested by the remote host */
/*--------------------------------------------------------------------*/
XFER_STATE rrfile( void )
{
char fileName[FILENAME_MAX];
size_t subscript;
struct stat statbuf;
/*--------------------------------------------------------------------*/
/* Determine if the file can go into the spool directory */
/*--------------------------------------------------------------------*/
if ( isupper(*tName) &&
(tName[1] == '.') &&
(strchr(tName,'/') == NULL ) &&
(strchr(tName,'\\') == NULL ))
spool = TRUE;
else
spool = FALSE;
strcpy( fileName, tName );
if ( ! spool )
expand_path( fileName, securep->pubdir, securep->pubdir , NULL );
/*--------------------------------------------------------------------*/
/* Check if the name is a directory name (end with a '/') */
/*--------------------------------------------------------------------*/
subscript = strlen( fileName ) - 1;
if ((fileName[subscript] == '/') ||
((stat(fileName , &statbuf) == 0) && (statbuf.st_mode & S_IFDIR)))
{
char *slash = strrchr(fName, '/');
if (slash == NULL)
slash = fName;
else
slash++;
printmsg(3, "rrfile: destination is directory \"%s\", adding \"%s\"",
fileName, slash);
if ( fileName[ subscript ] != '/')
strcat(fileName, "/");
strcat(fileName, slash);
} /* if */
/*--------------------------------------------------------------------*/
/* Let host munge filename as appropriate */
/*--------------------------------------------------------------------*/
importpath(spolName, fileName, rmtname);
/*--------------------------------------------------------------------*/
/* If the name has a path and we don't allow it, reject the */
/* transfer. We also reject attempts to send call files, */
/* because they would bypass security. */
/*--------------------------------------------------------------------*/
if (( !spool && !ValidateFile( spolName , ALLOW_WRITE )) ||
( spool && (*tName == 'C' )))
{
if (!pktsendstr("SN2")) /* Report access denied to requestor */
return XFER_LOST;
else
return XFER_FILEDONE; /* Look for next file from master */
} /* if */
/*--------------------------------------------------------------------*/
/* The filename is transformed, try to open it */
/*--------------------------------------------------------------------*/
if (spool)
#ifdef __TURBOC__
{
char *p = tmpnam( tempName );
denormalize( p );
xfer_stream = fopen( p, "wb");
}
#else
/*--------------------------------------------------------------------*/
/* MS C 6.0 doesn't generate the name for the current directory, */
/* so we cheat and use our own temporary file name generation */
/* routine. */
/*--------------------------------------------------------------------*/
{
char *savetemp = E_tempdir; /* Save the real temp directory */
E_tempdir = E_spooldir; /* Generate this file in spool */
mktempname(tempName, "TMP"); /* Get the file name */
E_tempdir = savetemp; /* Restore true directory name */
denormalize( tempName );
xfer_stream = fopen( tempName , "wb");
}
#endif
else if (strchr( cmdopts,'d'))
xfer_stream = FOPEN( spolName, "w", BINARY_MODE);
else {
denormalize( spolName );
xfer_stream = fopen( spolName, "wb");
}
if (xfer_stream == NULL)
{
printmsg(0, "rrfile: cannot open file %s (%s).",
fileName, spool ? tempName : spolName);
printerr(spool ? tempName : spolName);
if (!pktsendstr("SN4")) /* Report cannot create file */
return XFER_LOST; /* School is out, die */
else
return XFER_FILEDONE; /* Tell them to send next file */
} /* if */
/*--------------------------------------------------------------------*/
/* The file is open, now try to buffer it */
/*--------------------------------------------------------------------*/
#ifndef _Windows // Leave file buffered under Windows
if (setvbuf( xfer_stream, NULL, _IONBF, 0))
{
printmsg(0, "rrfile: Cannot unbuffer file %s (%s).",
fileName, spool ? tempName : spolName);
printerr(spool ? tempName : spolName);
fclose(xfer_stream);
xfer_stream = NULL;
pktsendstr("SN4"); /* Report cannot create file */
return XFER_ABORT;
} /* if */
#endif
/*--------------------------------------------------------------------*/
/* Announce we are receiving the file to console and to remote */
/*--------------------------------------------------------------------*/
printmsg(spool ? 2 : 0 , "Receiving \"%s\" as \"%s\" (%s)",
fName,fileName,spolName);
if (spool)
printmsg(2,"Using temp name %s",tempName);
if (!pktsendstr("SY"))
{
fclose(xfer_stream);
xfer_stream = NULL;
return XFER_LOST;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -