/***************************************************************************** * * File ..................: mbcico/sendbark.c * Purpose ...............: Fidonet mailer * Last modification date : 29-Oct-2000 * ***************************************************************************** * Copyright (C) 1997-2000 * * 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, 675 Mass Ave, Cambridge, MA 02139, USA. *****************************************************************************/ #include "../lib/libs.h" #include "../lib/structs.h" #include "../lib/common.h" #include "../lib/clcomm.h" #include "ttyio.h" #include "session.h" #include "statetbl.h" #include "sendbark.h" #include "xmrecv.h" static int send_bark(void); static char *nm,*pw,*dt; int sendbark(void) { char *fn; FILE *fp; char buf[256], *p; int rc = 0; fn = reqname(remote->addr); if ((fp = fopen(fn,"r")) == NULL) { Syslog('s', "no request file for this node"); PUTCHAR(ETB); return 0; } while (fgets(buf,sizeof(buf)-1,fp)) { nm = buf; pw = strchr(buf, '!'); dt = strchr(buf, '+'); if (pw) *pw++= '\0'; if (dt) *dt++= '\0'; if (nm) { while (isspace(*nm)) nm++; for (p = nm; (*p != '!') && (*p != '+') && (!isspace(*p)); p++); *p = '\0'; } if (pw) { while (isspace(*pw)) pw++; for (p = pw; (*p != '!') && (*p != '+') && (!isspace(*p)); p++); *p = '\0'; } else pw = (char *)""; if (dt) { while (isspace(*nm)) nm++; for (p = nm; (*p != '!') && (*p != '+') && (*p != '-') && (!isspace(*p)); p++); *p = '\0'; } else dt = (char *)"0"; if (*nm == ';') continue; Syslog('+', "Sending bark request for \"%s\", password \"%s\", update \"%s\"",MBSE_SS(nm),MBSE_SS(pw),MBSE_SS(dt)); if ((rc = send_bark())) break; } if (rc == 0) PUTCHAR(ETB); fclose(fp); if (rc == 0) unlink(fn); return rc; } SM_DECL(send_bark,(char *)"sendbark") SM_STATES Send, waitack, getfile SM_NAMES (char *)"send", (char *)"waitack", (char *)"getfile" SM_EDECL int c; char buf[256]; unsigned short crc; int count = 0; Syslog('s', "send_bark INIT"); sprintf(buf,"%s %s %s",nm,dt,pw); crc = crc16xmodem(buf, strlen(buf)); Syslog('s', "sending bark packet \"%s\", crc = 0x%04x", buf, crc); SM_START(Send) SM_STATE(Send) Syslog('s', "send_bark SEND"); if (count++ > 5) { Syslog('+', "Bark request failed"); SM_ERROR; } PUTCHAR(ACK); PUT(buf, strlen(buf)); PUTCHAR(ETX); PUTCHAR(crc & 0xff); PUTCHAR((crc >> 8) & 0xff); if (STATUS) { SM_ERROR; } else { SM_PROCEED(waitack); } SM_STATE(waitack) Syslog('s', "send_bark WAITACK"); c = GETCHAR(10); if (c == TIMEOUT) { Syslog('s', "sendbark got timeout waiting for ACK"); SM_PROCEED(Send); } else if (c < 0) { SM_PROCEED(Send); } else if (c == ACK) { SM_PROCEED(getfile); } else { Syslog('s', "sendbark got %s waiting for ACK", printablec(c)); SM_PROCEED(Send); } SM_STATE(getfile) Syslog('s', "send_bark GETFILE"); switch (xmrecv(NULL)) { case 0: SM_PROCEED(getfile); break; case 1: SM_SUCCESS; break; default: SM_ERROR; break; } SM_END SM_RETURN