Upgraded to FSTCPROD.008

This commit is contained in:
Michiel Broek 2003-12-31 18:21:11 +00:00
parent c3f5fc08b5
commit c7eb19a3d0
3 changed files with 162 additions and 78 deletions

View File

@ -5,6 +5,7 @@ v0.39.5 24-Dec-2003
general: general:
Added code for new binkp development, the code is disabled by Added code for new binkp development, the code is disabled by
default and can only be used with the right configure option. default and can only be used with the right configure option.
Upgraded to new released ftscprod.008
common.a: common.a:
Allows node locking with zero bytes lockfiles created by some Allows node locking with zero bytes lockfiles created by some

View File

@ -291,3 +291,4 @@
11FF,MBSEBBS,Linux/FreeBSD/NetBSD,Mailer/Packer,Michiel_Broek,2:280/2802,20030215 11FF,MBSEBBS,Linux/FreeBSD/NetBSD,Mailer/Packer,Michiel_Broek,2:280/2802,20030215
12FF,SBBSecho,DOS/OS2/Win32/Linux/FreeBSD/OpenBSD/Solaris,Packer,Rob_Swindell,1:103/705,20030215 12FF,SBBSecho,DOS/OS2/Win32/Linux/FreeBSD/OpenBSD/Solaris,Packer,Rob_Swindell,1:103/705,20030215
13FF,binkd,DOS/OS2/Win32/Unix,Mailer,Pavel_Gulchouck,2:463/68,20030215 13FF,binkd,DOS/OS2/Win32/Unix,Mailer,Pavel_Gulchouck,2:463/68,20030215
14FF,Mail-ennium/32,Win32,Mailer/Packer,Chris_Cranford,1:379/1200,20031231

View File

@ -106,14 +106,13 @@ static char *ftstate[] = { (char *)"InitTransfer", (char *)"Switch", (char *)"Re
static time_t Timer; static time_t Timer;
int transferred = FALSE; /* Anything transferred in batch */
int ext_rand = 0; int ext_rand = 0;
the_queue *tql = NULL; /* The Queue List */ the_queue *tql = NULL; /* The Queue List */
file_list *tosend = NULL; /* Files to send */ file_list *tosend = NULL; /* Files to send */
binkp_list *bll = NULL; /* Files to send with status */ binkp_list *bll = NULL; /* Files to send with status */
static binkp_list *cursend = NULL; /* Current file being transmitted */
struct binkprec { struct binkprec {
@ -182,15 +181,16 @@ int binkp_banner(void); /* Send system banner */
int binkp_recv_command(char *, int *, int *); /* Receive command frame */ int binkp_recv_command(char *, int *, int *); /* Receive command frame */
void parse_m_nul(char *); /* Parse M_NUL message */ void parse_m_nul(char *); /* Parse M_NUL message */
int binkp_poll_frame(void); /* Poll for a frame */ int binkp_poll_frame(void); /* Poll for a frame */
void binkp_addqueue(char *frame); /* Add cmd frame to queue */ void binkp_add_message(char *frame); /* Add cmd frame to queue */
int binkp_countqueue(void); /* Count commands on the queue */ int binkp_count_messages(void); /* Count commands on the queue */
int binkp_processthequeue(void); /* Process the queue */ int binkp_process_messages(void); /* Process the queue */
int binkp_resync(off_t); /* File resync */ int binkp_resync(off_t); /* File resync */
char *unix2binkp(char *); /* Binkp -> Unix escape */ char *unix2binkp(char *); /* Binkp -> Unix escape */
char *binkp2unix(char *); /* Unix -> Binkp escape */ char *binkp2unix(char *); /* Unix -> Binkp escape */
void fill_binkp_list(binkp_list **, file_list *, off_t); void fill_binkp_list(binkp_list **, file_list *, off_t); /* Build pending files */
void debug_binkp_list(binkp_list **); void debug_binkp_list(binkp_list **); /* Debug pending files list */
int binkp_pendingfiles(void); int binkp_pendingfiles(void); /* Count pending files */
static int orgbinkp(void); /* Originate session state */ static int orgbinkp(void); /* Originate session state */
static int ansbinkp(void); /* Answer session state */ static int ansbinkp(void); /* Answer session state */
@ -589,14 +589,12 @@ SM_STATE(WaitConn)
strcpy(s, "OPT "); strcpy(s, "OPT ");
MD_toString(s+4, bp.MD_Challenge[0], bp.MD_Challenge+1); MD_toString(s+4, bp.MD_Challenge[0], bp.MD_Challenge+1);
bp.CRAMflag = TRUE; bp.CRAMflag = TRUE;
rc = binkp_send_command(MM_NUL, "%s", s); if ((rc = binkp_send_command(MM_NUL, "%s", s))) {
if (rc) {
SM_ERROR; SM_ERROR;
} }
} }
rc = binkp_banner(); if ((rc = binkp_banner())) {
if (rc) {
SM_ERROR; SM_ERROR;
} }
@ -811,6 +809,7 @@ SM_RETURN
/* /*
* We do not use the normal state machine because that produces a lot * We do not use the normal state machine because that produces a lot
* of debug logging that will drive up the CPU usage. * of debug logging that will drive up the CPU usage.
* FIXME: Remove these messages!!
*/ */
int file_transfer(void) int file_transfer(void)
{ {
@ -873,6 +872,7 @@ int file_transfer(void)
binkp_settimer(BINKP_TIMEOUT); binkp_settimer(BINKP_TIMEOUT);
bp.FtState = Switch; bp.FtState = Switch;
} else if (Trc == Failure) { } else if (Trc == Failure) {
Syslog('+', "Binkp: receiver failure");
bp.rc = 1; bp.rc = 1;
bp.FtState = DeinitTransfer; bp.FtState = DeinitTransfer;
} }
@ -884,6 +884,7 @@ int file_transfer(void)
binkp_settimer(BINKP_TIMEOUT); binkp_settimer(BINKP_TIMEOUT);
bp.FtState = Switch; bp.FtState = Switch;
} else if (Trc == Failure) { } else if (Trc == Failure) {
Syslog('+', "Binkp: transmitter failure");
bp.rc = 1; bp.rc = 1;
bp.FtState = DeinitTransfer; bp.FtState = DeinitTransfer;
} }
@ -935,7 +936,7 @@ TrType binkp_receiver(void)
bp.RxState = RxDone; bp.RxState = RxDone;
return Failure; return Failure;
} else if ((bcmd == MM_GET) || (bcmd == MM_GOT) || (bcmd == MM_SKIP)) { } else if ((bcmd == MM_GET) || (bcmd == MM_GOT) || (bcmd == MM_SKIP)) {
binkp_addqueue(bp.rxbuf); binkp_add_message(bp.rxbuf);
return Ok; return Ok;
} else if (bcmd == MM_NUL) { } else if (bcmd == MM_NUL) {
parse_m_nul(bp.rxbuf +1); parse_m_nul(bp.rxbuf +1);
@ -980,6 +981,8 @@ TrType binkp_receiver(void)
if (bp.DidSendGET) { if (bp.DidSendGET) {
Syslog('b', "Binkp: DidSendGET is set"); Syslog('b', "Binkp: DidSendGET is set");
/* /*
* FIXME: this was from the old driver, still needed???
*
* The file was partly received, via the openfile the resync function * The file was partly received, via the openfile the resync function
* has send a GET command to start this file with a offset. This means * has send a GET command to start this file with a offset. This means
* we will get a new FILE command to open this file with a offset. * we will get a new FILE command to open this file with a offset.
@ -1001,10 +1004,8 @@ TrType binkp_receiver(void)
} }
if (statfs(tempinbound, &sfs) == 0) { if (statfs(tempinbound, &sfs) == 0) {
Syslog('b', "blocksize %lu free blocks %lu", sfs.f_bsize, sfs.f_bfree);
Syslog('b', "need %lu blocks", (unsigned long)(bp.rsize / (sfs.f_bsize + 1)));
if ((bp.rsize / (sfs.f_bsize + 1)) >= sfs.f_bfree) { if ((bp.rsize / (sfs.f_bsize + 1)) >= sfs.f_bfree) {
Syslog('!', "Only %lu blocks free (need %lu) in %s", sfs.f_bfree, Syslog('!', "Binkp: only %lu blocks free (need %lu) in %s for this file", sfs.f_bfree,
(unsigned long)(bp.rsize / (sfs.f_bsize + 1)), tempinbound); (unsigned long)(bp.rsize / (sfs.f_bsize + 1)), tempinbound);
closefile(); closefile();
bp.rxfp = NULL; /* Force SKIP command */ bp.rxfp = NULL; /* Force SKIP command */
@ -1062,7 +1063,7 @@ TrType binkp_receiver(void)
bp.RxState = RxDone; bp.RxState = RxDone;
return Failure; return Failure;
} else if ((bcmd == MM_GET) || (bcmd == MM_GOT) || (bcmd == MM_SKIP)) { } else if ((bcmd == MM_GET) || (bcmd == MM_GOT) || (bcmd == MM_SKIP)) {
binkp_addqueue(bp.rxbuf); binkp_add_message(bp.rxbuf);
return Ok; return Ok;
} else if (bcmd == MM_NUL) { } else if (bcmd == MM_NUL) {
parse_m_nul(bp.rxbuf +1); parse_m_nul(bp.rxbuf +1);
@ -1097,7 +1098,6 @@ TrType binkp_receiver(void)
} }
bp.rxpos += written; bp.rxpos += written;
if (bp.rxpos == bp.rsize) { if (bp.rxpos == bp.rsize) {
Syslog('b', "We are at EOF");
rc = binkp_send_command(MM_GOT, "%s %ld %ld", bp.rname, bp.rsize, bp.rtime); rc = binkp_send_command(MM_GOT, "%s %ld %ld", bp.rname, bp.rsize, bp.rtime);
closefile(); closefile();
bp.rxpos = bp.rxpos - bp.rxbytes; bp.rxpos = bp.rxpos - bp.rxbytes;
@ -1105,7 +1105,6 @@ TrType binkp_receiver(void)
Syslog('+', "Binkp: OK %s", transfertime(bp.rxtvstart, bp.rxtvend, bp.rxpos, FALSE)); Syslog('+', "Binkp: OK %s", transfertime(bp.rxtvstart, bp.rxtvend, bp.rxpos, FALSE));
rcvdbytes += bp.rxpos; rcvdbytes += bp.rxpos;
bp.RxState = RxWaitF; bp.RxState = RxWaitF;
transferred = TRUE;
if (rc) if (rc)
return Failure; return Failure;
else else
@ -1130,7 +1129,7 @@ TrType binkp_receiver(void)
bp.RxState = RxDone; bp.RxState = RxDone;
return Failure; return Failure;
} else if ((bcmd == MM_GET) || (bcmd == MM_GOT) || (bcmd == MM_SKIP)) { } else if ((bcmd == MM_GET) || (bcmd == MM_GOT) || (bcmd == MM_SKIP)) {
binkp_addqueue(bp.rxbuf); binkp_add_message(bp.rxbuf);
return Ok; return Ok;
} else if (bcmd == MM_NUL) { } else if (bcmd == MM_NUL) {
parse_m_nul(bp.rxbuf +1); parse_m_nul(bp.rxbuf +1);
@ -1171,7 +1170,7 @@ TrType binkp_transmitter(void)
char *nonhold_mail; char *nonhold_mail;
fa_list *eff_remote; fa_list *eff_remote;
file_list *tsl; file_list *tsl;
static binkp_list *tmp, *cursend; static binkp_list *tmp;
Syslog('B', "Binkp: transmitter state %s", txstate[bp.TxState]); Syslog('B', "Binkp: transmitter state %s", txstate[bp.TxState]);
@ -1207,7 +1206,10 @@ TrType binkp_transmitter(void)
debug_binkp_list(&bll); debug_binkp_list(&bll);
Syslog('+', "Binkp: mail %ld, files %ld bytes", bp.nethold, bp.mailhold); Syslog('+', "Binkp: mail %ld, files %ld bytes", bp.nethold, bp.mailhold);
binkp_send_command(MM_NUL, "TRF %ld %ld", bp.nethold, bp.mailhold); if ((rc = binkp_send_command(MM_NUL, "TRF %ld %ld", bp.nethold, bp.mailhold))) {
bp.TxState = TxDone;
return Failure;
}
} }
for (tmp = bll; tmp; tmp = tmp->next) { for (tmp = bll; tmp; tmp = tmp->next) {
@ -1244,13 +1246,16 @@ TrType binkp_transmitter(void)
bp.txpos = bp.stxpos = tmp->offset; bp.txpos = bp.stxpos = tmp->offset;
Syslog('+', "Binkp: send \"%s\" as \"%s\"", MBSE_SS(tmp->local), MBSE_SS(tmp->remote)); Syslog('+', "Binkp: send \"%s\" as \"%s\"", MBSE_SS(tmp->local), MBSE_SS(tmp->remote));
Syslog('+', "Binkp: size %lu bytes, dated %s", (unsigned long)tmp->size, date(tmp->date)); Syslog('+', "Binkp: size %lu bytes, dated %s", (unsigned long)tmp->size, date(tmp->date));
binkp_send_command(MM_FILE, "%s %lu %ld %ld", MBSE_SS(tmp->remote), rc = binkp_send_command(MM_FILE, "%s %lu %ld %ld", MBSE_SS(tmp->remote),
(unsigned long)tmp->size, (long)tmp->date, (unsigned long)tmp->offset); (unsigned long)tmp->size, (long)tmp->date, (unsigned long)tmp->offset);
if (rc) {
bp.TxState = TxDone;
return Failure;
}
gettimeofday(&bp.txtvstart, &bp.tz); gettimeofday(&bp.txtvstart, &bp.tz);
tmp->state = Sending; tmp->state = Sending;
cursend = tmp; cursend = tmp;
bp.TxState = TxTryR; bp.TxState = TxTryR;
transferred = TRUE;
return Continue; return Continue;
} /* if state == NoState */ } /* if state == NoState */
} /* for */ } /* for */
@ -1273,12 +1278,12 @@ TrType binkp_transmitter(void)
} else if (bp.TxState == TxTryR) { } else if (bp.TxState == TxTryR) {
if (binkp_countqueue() == 0) { if (binkp_count_messages() == 0) {
Syslog('b', "The queue is empty"); Syslog('b', "The queue is empty");
bp.TxState = TxReadS; bp.TxState = TxReadS;
return Continue; return Continue;
} else { } else {
if (binkp_processthequeue()) { if (binkp_process_messages()) {
bp.TxState = TxDone; bp.TxState = TxDone;
return Failure; return Failure;
} else } else
@ -1318,6 +1323,7 @@ TrType binkp_transmitter(void)
} }
cursend->state = IsSent; cursend->state = IsSent;
cursend = NULL;
bp.TxState = TxGNF; bp.TxState = TxGNF;
return Ok; return Ok;
} else { } else {
@ -1333,12 +1339,14 @@ TrType binkp_transmitter(void)
} else if (bp.TxState == TxWLA) { } else if (bp.TxState == TxWLA) {
if ((binkp_countqueue() == 0) && (binkp_pendingfiles() == 0) && (bp.RxState >= RxEOB)) { if ((binkp_count_messages() == 0) && (binkp_pendingfiles() == 0) && (bp.RxState >= RxEOB)) {
Syslog('b', "The queue is empty and RxState >= RxEOB"); Syslog('b', "The queue is empty and RxState >= RxEOB");
bp.TxState = TxDone; bp.TxState = TxDone;
Syslog('+', "Binkp: there were %d messages", bp.messages); Syslog('+', "Binkp: there were %d messages", bp.messages);
if (bp.local_EOB && bp.remote_EOB) if (bp.local_EOB && bp.remote_EOB) {
Syslog('b', "Binkp: transmitter puts receiver state to RxDone");
bp.RxState = RxDone; /* Not in FSP-1018 rev.1 */ bp.RxState = RxDone; /* Not in FSP-1018 rev.1 */
}
if (tosend != NULL) { if (tosend != NULL) {
Syslog('b', "Clear current filelist"); Syslog('b', "Clear current filelist");
@ -1374,14 +1382,14 @@ TrType binkp_transmitter(void)
return Ok; return Ok;
} }
if ((binkp_countqueue() == 0) && (binkp_pendingfiles() == 0) && (bp.RxState < RxEOB)) { if ((binkp_count_messages() == 0) && (binkp_pendingfiles() == 0) && (bp.RxState < RxEOB)) {
Syslog('b', "The queue is empty and RxState < RxEOB"); Syslog('b', "The queue is empty and RxState < RxEOB");
bp.TxState = TxWLA; bp.TxState = TxWLA;
return Ok; return Ok;
} }
if (binkp_countqueue()) { if (binkp_count_messages()) {
if (binkp_processthequeue()) { if (binkp_process_messages()) {
return Failure; return Failure;
} }
} }
@ -1691,6 +1699,8 @@ int binkp_poll_frame(void)
bp.messages++; bp.messages++;
bcmd = bp.rxbuf[0]; bcmd = bp.rxbuf[0];
Syslog('b', "Binkp: got %s %s", bstate[bcmd], printable(bp.rxbuf+1, 0)); Syslog('b', "Binkp: got %s %s", bstate[bcmd], printable(bp.rxbuf+1, 0));
} else {
Syslog('b', "Binkp: got data frame %s bytes", bp.rxlen);
} }
rc = 1; rc = 1;
break; break;
@ -1708,16 +1718,15 @@ int binkp_poll_frame(void)
/* /*
* Add received command frame to the queue * Add received command frame to the queue, will be processed by the transmitter.
*/ */
void binkp_addqueue(char *frame) void binkp_add_message(char *frame)
{ {
the_queue **tmpl; the_queue **tmpl;
int bcmd; int bcmd;
Syslog('b', "Binkp: add \"%s\" to the message queue", printable(frame, 0));
bcmd = frame[0]; bcmd = frame[0];
Syslog('b', "Binkp: got %s %s", bstate[bcmd], printable(frame +1, 0)); Syslog('b', "Binkp: add message %s %s", bstate[bcmd], printable(frame +1, 0));
for (tmpl = &tql; *tmpl; tmpl = &((*tmpl)->next)); for (tmpl = &tql; *tmpl; tmpl = &((*tmpl)->next));
*tmpl = (the_queue *)malloc(sizeof(the_queue)); *tmpl = (the_queue *)malloc(sizeof(the_queue));
@ -1730,9 +1739,9 @@ void binkp_addqueue(char *frame)
/* /*
* Get nr of messages on the queue * Get nr of messages on the queue FIXME: Change to static counter.
*/ */
int binkp_countqueue(void) int binkp_count_messages(void)
{ {
the_queue *tmp; the_queue *tmp;
int count = 0; int count = 0;
@ -1748,67 +1757,121 @@ int binkp_countqueue(void)
/*
* Count number of pending files
*/
int binkp_pendingfiles(void)
{
binkp_list *tmpl;
int count = 0;
for (tmpl = bll; tmpl; tmpl = tmpl->next) {
Syslog('B', "%s %s %s %ld", MBSE_SS(tmpl->local), MBSE_SS(tmpl->remote), lbstate[tmpl->state], tmpl->offset);
if ((tmpl->state != Got) && (tmpl->state != Skipped))
count++;
}
Syslog('b', "Binkp: %d pending files on queue", count);
return count;
}
/* /*
* Process all messages on the queue, the oldest are on top, after * Process all messages on the queue, the oldest are on top, after
* processing release memory and reset the messages queue. * processing release memory and reset the messages queue.
*/ */
int binkp_processthequeue(void) int binkp_process_messages(void)
{ {
the_queue *tmpq, *oldq; the_queue *tmpq, *oldq;
binkp_list *tmp; binkp_list *tmp;
int Found; int Found;
char *lname; char *lname;
time_t ltime; time_t ltime;
long lsize; long lsize, loffs;
Syslog('b', "Binkp: Process The Messages Queue Start"); Syslog('b', "Binkp: Process The Messages Queue Start");
lname = calloc(512, sizeof(char)); lname = calloc(512, sizeof(char));
for (tmpq = tql; tmpq; tmpq = tmpq->next) { for (tmpq = tql; tmpq; tmpq = tmpq->next) {
Syslog('b', "Binkp: %s \"%s\"", bstate[tmpq->cmd], printable(tmpq->data, 0)); Syslog('+', "Binkp: %s \"%s\"", bstate[tmpq->cmd], printable(tmpq->data, 0));
if (tmpq->cmd == MM_GET) { if (tmpq->cmd == MM_GET) {
/* Requested file is not in know files list: Report */ sscanf(tmpq->data, "%s %ld %ld %ld", lname, &lsize, &ltime, &loffs);
/* Requested pos is filesize: Close and finalize */ Found = FALSE;
/* Requested pos is less then filesize: Set filepos to requested, report, TxState -> TxGNF */ for (tmp = bll; tmp; tmp = tmp->next) {
if ((strcmp(lname, tmp->remote) == 0) && (lsize == tmp->size) && (ltime == tmp->date)) {
if (lsize == loffs) {
/*
* Requested offset is filesize, close file.
*/
if (cursend && (strcmp(lname, cursend->remote) == 0) &&
(lsize == cursend->size) && (ltime == cursend->date)) {
Syslog('b', "Got M_GET with offset == filesize for current file, close");
/*
* Close transmitter file
*/
fclose(bp.txfp);
bp.txfp = NULL;
if (bp.txpos >= 0) {
bp.stxpos = bp.txpos - bp.stxpos;
Syslog('+', "Binkp: OK %s", transfertime(bp.txtvstart, bp.txtvend, bp.stxpos, TRUE));
} else {
Syslog('+', "Binkp: transmitter skipped file after %ld seconds",
bp.txtvend.tv_sec - bp.txtvstart.tv_sec);
}
cursend->state = IsSent;
cursend = NULL;
bp.TxState = TxGNF;
} else {
Syslog('+', "Binkp: requested offset = filesize, but is not the current file");
}
} else if (loffs < lsize) {
tmp->state = NoState;
tmp->offset = loffs;
if (loffs) {
Syslog('+', "Binkp: Remote wants %s for resync at offset %ld", tmp->remote, tmp->offset);
} else {
Syslog('+', "Binkp: Remote wants %s again from start", tmp->remote);
}
bp.TxState = TxGNF;
} else {
Syslog('+', "Binkp: requested offset > filesize, ignore");
}
Found = TRUE;
break;
}
if (!Found) {
Syslog('!', "Binkp: unexpected M_GET \"%s\"", tmpq->data); /* Ignore frame */
}
}
} else if (tmpq->cmd == MM_GOT) { } else if (tmpq->cmd == MM_GOT) {
/* File is transmitting: close and finalize, report remote refused, TxState -> TxGNF */
sscanf(tmpq->data, "%s %ld %ld", lname, &lsize, &ltime); sscanf(tmpq->data, "%s %ld %ld", lname, &lsize, &ltime);
Found = FALSE; Found = FALSE;
for (tmp = bll; tmp; tmp = tmp->next) { for (tmp = bll; tmp; tmp = tmp->next) {
if ((strcmp(lname, tmp->remote) == 0) && (lsize == tmp->size) && (ltime == tmp->date)) { if ((strcmp(lname, tmp->remote) == 0) && (lsize == tmp->size) && (ltime == tmp->date)) {
Found = TRUE;
if (tmp->state == Sending) {
Syslog('+', "Binkp: remote refused %s", tmp->remote);
fclose(bp.txfp);
bp.txfp = NULL;
tmp->state = Got;
cursend = NULL;
} else {
Syslog('+', "Binkp: remote GOT \"%s\"", tmp->remote); Syslog('+', "Binkp: remote GOT \"%s\"", tmp->remote);
tmp->state = Got; tmp->state = Got;
Found = TRUE; }
bp.TxState = TxGNF;
break; break;
} }
} }
if (!Found) { if (!Found) {
Syslog('!', "Binkp: unexpected GOT \"%s\"", tmpq->data); /* Ignore frame */ Syslog('!', "Binkp: unexpected M_GOT \"%s\"", tmpq->data); /* Ignore frame */
} }
} else if (tmpq->cmd == MM_SKIP) { } else if (tmpq->cmd == MM_SKIP) {
/* File is transmitting: close (no finalize), TxState -> TxGNF */ sscanf(tmpq->data, "%s %ld %ld", lname, &lsize, &ltime);
/* File not transmitting: report, remove from list */ Found = FALSE;
for (tmp = bll; tmp; tmp = tmp->next) {
if ((strcmp(lname, tmp->remote) == 0) && (lsize == tmp->size) && (ltime == tmp->date)) {
Found = TRUE;
if (tmp->state == Sending) {
Syslog('+', "Binkp: remote skipped %s, may be accepted later", tmp->remote);
fclose(bp.txfp);
bp.txfp = NULL;
cursend = NULL;
bp.TxState = TxGNF;
} else {
Syslog('+', "Binkp: remote refused %s", tmp->remote);
}
tmp->state = Skipped;
break;
}
}
if (!Found) {
Syslog('!', "Binkp: unexpected M_GOT \"%s\"", tmpq->data); /* Ignore frame */
}
} else { } else {
/* Illegal message on the queue */ /* Illegal message on the queue */
} }
@ -1831,6 +1894,25 @@ int binkp_processthequeue(void)
} }
/*
* * Count number of pending files
* */
int binkp_pendingfiles(void)
{
binkp_list *tmpl;
int count = 0;
for (tmpl = bll; tmpl; tmpl = tmpl->next) {
Syslog('B', "%s %s %s %ld", MBSE_SS(tmpl->local), MBSE_SS(tmpl->remote), lbstate[tmpl->state], tmpl->offset);
if ((tmpl->state != Got) && (tmpl->state != Skipped))
count++;
}
Syslog('b', "Binkp: %d pending files on queue", count);
return count;
}
#ifndef DOTEST #ifndef DOTEST
/* /*
@ -1999,18 +2081,18 @@ int main()
frame = xstrcpy((char *)"xSEAP\\x7e2GU.TGZ 338538 1072728016"); frame = xstrcpy((char *)"xSEAP\\x7e2GU.TGZ 338538 1072728016");
frame[0] = MM_GOT; frame[0] = MM_GOT;
binkp_addqueue(frame); binkp_add_message(frame);
free(frame); free(frame);
binkp_countqueue(); binkp_count_messages();
frame = xstrcpy((char *)"x39fb3e70.tic 441 1072728026"); frame = xstrcpy((char *)"x39fb3e70.tic 441 1072728026");
frame[0] = MM_GOT; frame[0] = MM_GOT;
binkp_addqueue(frame); binkp_add_message(frame);
free(frame); free(frame);
binkp_countqueue(); binkp_count_messages();
binkp_processthequeue(); binkp_process_messages();
binkp_countqueue(); binkp_count_messages();
Syslog(' ', "MBTEST finished"); Syslog(' ', "MBTEST finished");
ExitClient(0); ExitClient(0);