home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
kermit.columbia.edu
/
kermit.columbia.edu.tar
/
kermit.columbia.edu
/
uniflex
/
ufcutl.c
< prev
next >
Wrap
C/C++ Source or Header
|
1993-08-22
|
9KB
|
260 lines
#include "ufk.h"
/*
* s p a r
*
* Fill the data array with my send-init parameters
*
*/
spar(data,len)
char data[];
int *len;
{
data[0] = tochar(maxpacksiz); /* Biggest packet I can receive */
data[1] = tochar(mytime); /* When I want to be timed out */
data[2] = tochar(mypad); /* How much padding I need */
data[3] = ctl(mypchar); /* Padding character I want */
data[4] = tochar(myeol); /* End-Of-Line character I want */
data[5] = myquote; /* Control-Quote character I send */
if ((data[6] = myeightquote) == 0)
data[6] = 'N'; /* No eight bit quoting */
else if (config > 3) /* 8 bits link */
data[6] = 'Y'; /* 8th bit quoting on request */
data[7] = myblock_check_type + '0'; /* Type of block check */
if ((data[8] = myrptquote) == 0) /* Repeat count quote character */
data[8] = ' '; /* No repeat quoting done */
*len = 10;
if (allowattr)
data[9] = tochar(0x08); /* Set capability bit for attr */
else
data[9] = tochar(0); /* Not used */
if (maxpacksiz > 94) /* Use extended packet length ? */
{
data[0] = tochar(I_MYPACKSIZE); /* Use default if long packets */
data[9] = tochar(0x0a); /* Set capability bit for this */
data[10] = tochar(0); /* No sliding windows */
data[11] = tochar(maxpacksiz / 95); /* Send packet length */
data[12] = tochar(maxpacksiz % 95);
*len = 13; /* Count all this */
}
data[*len] = '\0'; /* For debug printout */
}
/* r p a r
*
* Get the other host's send-init parameters
*
*/
rpar(data,len)
char data[];
int len;
{
char c;
if (len > 0)
spsiz = unchar(data[0]); /* Maximum send packet size */
else
spsiz = I_MYPACKSIZE; /* Use default */
if (len > 1)
timint = unchar(data[1]); /* When I should time out */
else
timint = I_MYTIME;
if (len > 2)
pad = unchar(data[2]); /* Number of pads to send */
else
pad = I_MYPAD;
if (len > 3)
padchar = ctl(data[3]); /* Padding character to send */
else
padchar = I_MYPCHAR;
if (len > 4)
eol = unchar(data[4]); /* EOL character I must send */
else
eol = I_MYEOL;
if (len > 5)
quote = data[5]; /* Incoming data quote character */
else
quote = I_MYQUOTE;
if (len > 6)
{
if ((c = data[6]) == 'N')
eight_quote = 0; /* Don't use eight_bit quoting */
else if (c == 'Y')
{
if (config <= 3) /* 7 bits link */
eight_quote = myeightquote; /* Use default */
else
eight_quote = 0; /* Don't use it */
}
else
eight_quote = c; /* Use this char for eight bit quoting */
}
else
eight_quote = 0; /* Don't use it */
if ((len > 7) && ((c = data[7] - '0') == myblock_check_type))
block_check_type = c; /* Setup block check type */
else
block_check_type = I_BLOCKCHECKTYPE;/* Set initial value */
if ((len > 8) && ((c = data[8]) == myrptquote) && (c != ' '))
repeat_quote = c; /* Setup repeat quote character */
else
repeat_quote = 0; /* Don't use repeat quoting */
if (len > 9)
{
if ((unchar(data[9]) & 0x08) && /* Check for attribute packets */
allowattr)
attribute = TRUE; /* We can handle it */
if (unchar(data[9]) & 0x02)
{ /* The remote kermit can handle extended length packets */
c = 9; /* Check for more capability bytes */
while (c < len)
if (!(unchar(data[c++]) & 0x01))
break; /* End of capability bytes */
spsiz = maxpacksiz; /* Use default */
if (maxpacksiz > 94) /* Do I want extended length ? */
{ /* Yes */
if ((c == len) || (c == (len - 1))) /* No length specified */
spsiz = I_DEFLONGSIZE; /* Use default long size */
else
{
c++; /* Skip window size (not implemented) */
spsiz = 95 * unchar(data[c]) + /* Re-construct packet length */
unchar(data[c+1]);
}
}
}
}
disp_params(); /* Show all selected parameters */
}
alloc_pkt(type)
char type;
{
char *p, *q, *malloc();
dealloc_pkt(); /* Get rid of old memory */
if (((p = malloc(BIG_SIZE)) == NULL) || /* Allocate packet buffers */
((q = malloc(SMALL_SIZE)) == NULL)) /* for send and receive */
{
prterr(ER_NOMEM); /* No memory */
return(FALSE);
}
if (type == RECEIVE)
{
recpkt = p; /* Receive buffer is large */
sndpkt = q; /* Send buffer is small */
}
else if (type == SEND)
{
recpkt = q; /* Receive buffer is small */
sndpkt = p; /* Send buffer is large */
}
return (TRUE);
}
dealloc_pkt()
{
if (recpkt) /* De-allocate use receive packet */
{
free(recpkt);
recpkt = 0;
}
if (sndpkt) /* De-allocate used send packet */
{
free(sndpkt);
sndpkt = 0;
}
}
set_default_comm()
{
eol = myeol; /* EOL for outgoing packets */
quote = myquote; /* Standard control-quote char "#" */
pad = mypad; /* No padding */
padchar = mypchar; /* Use null if any padding wanted */
timint = mytime; /* Timeout value */
eight_quote = myeightquote; /* Set eight_bit quote character */
repeat_quote = myrptquote; /* Set repeat quote character */
block_check_type = I_BLOCKCHECKTYPE; /* Set initial value */
attribute = FALSE; /* No attribute packets yet */
binfil = image; /* Reset file type */
}
disp_params() /* Show parameter settings */
{ /* After negotiation */
char tmp1, tmp2;
if (debug && screen && (sflg || rflg)) /* Only if sending or receiving */
{
posit(0,15);
printf("Packet length: %4d Timeout: %2d Block check type: %d",
spsiz, timint, block_check_type);
posit(0,16);
printf("End of line: %02x Padding char: %02x Pad count: %2d",
eol, padchar, pad);
if ((tmp1 = repeat_quote) == 0)
tmp1 = 'N';
if ((tmp2 = eight_quote) == 0)
tmp2 = 'N';
posit(0,17);
printf("Control quote: %c Repeat quote: %c Eight bit quote: %c",
quote, tmp1, tmp2);
}
}
disp_size_transferred()
{
float xmitted,
percentage;
if (!remote && (transmit_chr_count != 0) && screen && !nooutput)
{
xmitted = transmit_chr_count / 1024.; /* Size transferred so far in K */
posit(18,4);
printf("%6.2f K", xmitted);
if (sflg || (rflg && attribute && (file_size != 0)))
{
percentage = 100. * ((float)transmit_chr_count / (float)file_size);
posit(39,4);
printf("%3.0f %%", percentage);
}
}
}
init_xfer()
{
chr_sent = dchr_sent = chr_rec = dchr_rec = 0; /* zero counters */
nak_sent = nak_rec = pack_sent = pack_rec = 0;
data_rate = 0;
start_time = time(0);
}
fin_xfer()
{
int numbits;
t_chr_sent += chr_sent; /* adjust performance counters */
t_dchr_sent += dchr_sent;
t_nak_sent += nak_sent;
t_pack_sent += pack_sent;
t_chr_rec += chr_rec;
t_dchr_rec += dchr_rec;
t_nak_rec += nak_rec;
t_pack_rec += pack_rec;
end_time = time(0); /* Get current time */
/* calculate number of bits in transmission */
numbits = (config == 2 || config == 3 || config == 5) ? 10 : 11;
if (rflg) /* received data */
data_rate = (chr_rec / (end_time - start_time)) * (100 / numbits);
else if (sflg) /* transmitted data */
data_rate = (chr_sent / (end_time - start_time)) * (100 / numbits);
t_data_rate = (((t_data_rate == 0) ? data_rate : t_data_rate)
+ data_rate) / 2;
}