180 lines
3.3 KiB
C
180 lines
3.3 KiB
C
/*****************************************************************************
|
|
*
|
|
* $Id: m7recv.c,v 1.6 2004/02/21 17:22:01 mbroek Exp $
|
|
* Purpose ...............: Fidonet mailer
|
|
*
|
|
*****************************************************************************
|
|
* Copyright (C) 1997-2004
|
|
*
|
|
* Michiel Broek FIDO: 2:280/2802
|
|
* Beekmansbos 10
|
|
* 1971 BV IJmuiden
|
|
* the Netherlands
|
|
*
|
|
* This file is part of MBSE BBS.
|
|
*
|
|
* This BBS is free software; you can redistribute it and/or modify it
|
|
* under the terms of the GNU General Public License as published by the
|
|
* Free Software Foundation; either version 2, or (at your option) any
|
|
* later version.
|
|
*
|
|
* MBSE BBS is distributed in the hope that it will be useful, but
|
|
* WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
* General Public License for more details.
|
|
*
|
|
* You should have received a copy of the GNU General Public License
|
|
* along with MBSE BBS; see the file COPYING. If not, write to the Free
|
|
* Software Foundation, 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
|
|
*****************************************************************************/
|
|
|
|
#include "../config.h"
|
|
#include "../lib/mbselib.h"
|
|
#include "statetbl.h"
|
|
#include "ttyio.h"
|
|
#include "m7recv.h"
|
|
|
|
|
|
|
|
static int m7_recv(void);
|
|
static char* fn;
|
|
static int last;
|
|
|
|
int m7recv(char *fname)
|
|
{
|
|
int rc;
|
|
|
|
fn = fname;
|
|
last = 0;
|
|
rc = m7_recv();
|
|
if (rc)
|
|
return -1;
|
|
else if (last)
|
|
return 1;
|
|
else
|
|
return 0;
|
|
}
|
|
|
|
|
|
|
|
SM_DECL(m7_recv,(char *)"m7recv")
|
|
SM_STATES
|
|
sendnak,
|
|
waitack,
|
|
waitchar,
|
|
sendack,
|
|
sendcheck,
|
|
waitckok
|
|
SM_NAMES
|
|
(char *)"sendnak",
|
|
(char *)"waitack",
|
|
(char *)"waitchar",
|
|
(char *)"sendack",
|
|
(char *)"sendcheck",
|
|
(char *)"waitckok"
|
|
SM_EDECL
|
|
|
|
int count = 0;
|
|
int c, i = 0;
|
|
char *p = fn;
|
|
char cs = SUB;
|
|
|
|
SM_START(waitchar)
|
|
|
|
SM_STATE(sendnak)
|
|
|
|
if (count++ > 20) {
|
|
Syslog('+', "Too many tries getting modem7 name");
|
|
SM_ERROR;
|
|
}
|
|
p = fn;
|
|
cs = SUB;
|
|
i = 0;
|
|
PUTCHAR(NAK);
|
|
if (STATUS) {
|
|
SM_ERROR;
|
|
} else {
|
|
SM_PROCEED(waitack);
|
|
}
|
|
|
|
SM_STATE(waitack)
|
|
|
|
c = GETCHAR(5);
|
|
if (c == TIMEOUT) {
|
|
Syslog('x', "m7 got timeout waiting for ACK");
|
|
SM_PROCEED(sendnak);
|
|
} else if (c < 0) {
|
|
SM_ERROR;
|
|
} else {
|
|
switch (c) {
|
|
case ACK: SM_PROCEED(waitchar);
|
|
break;
|
|
case EOT: last=1;
|
|
SM_SUCCESS;
|
|
break;
|
|
default: Syslog('x', "m7 got '%s' waiting for ACK", printablec(c));
|
|
break;
|
|
}
|
|
}
|
|
|
|
SM_STATE(waitchar)
|
|
|
|
c = GETCHAR(1);
|
|
if (c == TIMEOUT) {
|
|
Syslog('x', "m7 got timeout waiting for char",c);
|
|
SM_PROCEED(sendnak);
|
|
} else if (c < 0) {
|
|
SM_ERROR;
|
|
} else {
|
|
switch (c) {
|
|
case EOT: last=1;
|
|
SM_SUCCESS;
|
|
break;
|
|
case SUB: *p='\0';
|
|
SM_PROCEED(sendcheck);
|
|
break;
|
|
case 'u': SM_PROCEED(sendnak);
|
|
break;
|
|
default: cs += c;
|
|
if (i < 15) {
|
|
if (c != ' ') {
|
|
if (i == 8)
|
|
*p++='.';
|
|
*p++ = tolower(c);
|
|
}
|
|
i++;
|
|
}
|
|
SM_PROCEED(sendack);
|
|
break;
|
|
}
|
|
}
|
|
|
|
SM_STATE(sendack)
|
|
|
|
PUTCHAR(ACK);
|
|
SM_PROCEED(waitchar);
|
|
|
|
SM_STATE(sendcheck)
|
|
|
|
PUTCHAR(cs);
|
|
SM_PROCEED(waitckok);
|
|
|
|
SM_STATE(waitckok)
|
|
|
|
c = GETCHAR(1);
|
|
if (c == TIMEOUT) {
|
|
Syslog('x', "m7 got timeout waiting for ack ACK");
|
|
SM_PROCEED(sendnak);
|
|
} else if (c < 0) {
|
|
SM_ERROR;
|
|
} else if (c == ACK) {
|
|
SM_SUCCESS;
|
|
} else {
|
|
SM_PROCEED(sendnak);
|
|
}
|
|
|
|
SM_END
|
|
SM_RETURN
|
|
|
|
|