/* WARNING -- This C source program generated by gwart preprocessor. */ /* Do not edit this file; edit the gwart-format source file instead, */ /* and then run it through gwart to produce a new C source file. */ /* G P R O T O -- Protocol module for gkermit */ /* -*-C-*- */ /* Author: Frank da Cruz The Kermit Project Columbia University 612 West 115th Street New York NY 10025-7799 USA http://www.columbia.edu/kermit/ kermit@columbia.edu Copyright (C) 1999, The Trustees of Columbia University in the City of New York. This program 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 of the License, or (at your option) any later version. This program 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 this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ #include #include "gkermit.h" _MYPROTOTYPE( int closof, (void) ); /* Close output file */ _MYPROTOTYPE( VOID errpkt, (char *) ); /* Send Error packet */ extern char * xdata, *rdatap, **cmlist, *cmarg, *rpar(), strbuf[], filnam[]; extern int start, bctu, bctr, delay, cx, cz, failure, attributes, datalen; extern int streamok, streaming, timint; extern FILE * db; static int x; static VOID streamon() { /* Start streaming if negotiated */ x = 0; if (streamok > 0) { streaming = 1; timint = 0; } } /* Declare gwart states (like lex) */ #define ssini 1 #define ssfil 2 #define ssdat 3 #define ssatt 4 #define sseot 5 #define sseof 6 #define sipkt 7 #define srini 8 #define srfil 9 #define srdat 10 #define sratt 11 /* Packets are read by the input() function, which returns the packet type */ /* that serves as the input to the state machine, which follows... */ #define BEGIN state = int state = 0; int gwart() { int c,actno; extern short tbl[]; while (1) { c = input() - 32; if (c < 0 || c > 95) c = 0; if ((actno = tbl[c + state*96]) != -1) switch(actno) { case 1: { /* Start state for Send. */ tinit(); /* Initialize transaction. */ if (sinit('S') < 0) { errpkt("sinit"); } /* Build and send the S packet. */ else BEGIN ssini; } break; case 2: { /* Receive ACK to I packet */ spar(rdatap); /* Set parameters from it */ bctu = bctr; /* Switch to negotiated block check */ if (gnfile() > 0) { /* Is there a file to send? */ if (sfile() < 0) { /* Yes, open it, send F packet, */ errpkt("sfile"); } else { /* No error */ streamon(); BEGIN ssfil; } } else { /* No files to send, */ if (seot() < 0) { errpkt("seot"); } /* so send EOT packet. */ else BEGIN sseot; } } break; case 3: { /* Receive ACK to File header packet */ if (attributes) { /* If attributes negotiated */ if (sattr() < 0) { /* Send file attributes */ errpkt("sattr"); } else BEGIN ssatt; } else if ((x = sdata()) == 0) { /* Otherwise send first Data packet */ if (seof("") < 0) { /* Empty file - send EOF */ errpkt("seof"); } else { BEGIN sseof; } } else if (x < 0) { /* Error */ errpkt("sdata"); } else { /* OK - switch to Data state */ BEGIN ssdat; } } break; case 4: { /* Receive ACK to Attribute packet */ if (*rdatap == 'N') { /* Check for refusal */ seof("D"); BEGIN sseof; } else if ((x = sdata()) == 0) { /* Otherwise send first Data packet */ if (seof("") < 0) { /* Empty file - send EOF */ errpkt("seof"); } else { BEGIN sseof; } } else if (x < 0) { /* Error */ errpkt("sdata"); } else { /* OK - switch to Data state */ BEGIN ssdat; } } break; case 5: { /* Receive ACK to Data packet */ if (*rdatap == 'X') /* Check for file cancellation */ cx = 1; else if (*rdatap == 'Z') /* Check for batch cancellation */ cz = 1; if ((x = sdata()) == 0) { /* Send data packet if data left. */ if (seof((cx | cz) ? "D" : "") < 0) { /* If not, send Z packet */ errpkt("seof"); } else { BEGIN sseof; } } else if (x < 0) /* Fatal error sending data */ errpkt("sdata"); } break; case 6: { /* Receive ACK to EOF */ if (gnfile() > 0) { /* Get next file from list */ if (sfile() > 0) BEGIN ssfil; else { errpkt("sfile"); } } else { /* No more files */ seot(); /* Send EOT */ BEGIN sseot; } } break; case 7: { return(failure); } break; case 8: { tinit(); rinit(); BEGIN srini; } break; case 9: { /* Receive S packet */ spar(rdatap); /* Set parameters from it */ ack1(rpar()); /* ACK with our parameters */ bctu = bctr; /* Switch to negotiated block check */ streamon(); BEGIN srfil; /* Wait for file or EOT */ } break; case 10: { ack(); return(failure); } break; case 11: { /* Receive File header packet */ if (rcvfil() < 0) { errpkt("rcvfil"); } else { encstr(filnam); ack1(xdata); streamon(); BEGIN sratt; } } break; case 12: { /* Receive Attribute packet */ if (gattr(rdatap) == 0) { ack(); } else { ack1("\""); } } break; case 13: { /* Receive first Data packet */ if (decode(datalen) < 0) { errpkt("Packet decoding error"); } else { ack(); BEGIN srdat; } } break; case 14: { /* Empty file */ if (*rdatap == 'D') /* Check for Discard directive */ cx = 1; if (closof() < 0) { /* Close the output file */ errpkt("closof"); } else { ack(); /* Send ACK */ BEGIN srfil; /* Wait for another file or EOT */ } } break; case 15: { /* Receive Data packet */ if (decode(datalen) < 0) errpkt("Packet decoding error"); else ack(); } break; case 16: { /* Receive EOF packet */ if (*rdatap == 'D') /* Check for Discard directive */ cx = 1; if (closof() < 0) { /* Close the output file */ errpkt("closof"); } else { ack(); /* Send ACK */ BEGIN srfil; /* Wait for another file or EOT */ } } break; case 17: { /* Start state for Get */ tinit(); /* Initialize transaction */ ginit(); /* Initialize Get */ sinit('I'); /* Send I packet */ BEGIN sipkt; } break; case 18: { /* Receive ACK for I packet */ spar(rdatap); /* Set parameters from it */ if (scmd('R',cmarg) < 0) /* Send GET packet file filespec */ errpkt("scmd"); else BEGIN srini; /* Wait for S packet */ } break; case 19: { return(failure = 1); } break; case 20: { errpkt("Unknown packet type"); } break; } } } short tbl[] = { -1, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 19, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 17, 1, 20, 20, 8, 20, 20, 20, 20, 20, 20, 20, 20, 20, -1, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 19, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 2, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 17, 1, 20, 20, 8, 20, 20, 20, 20, 20, 20, 20, 20, 20, -1, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 19, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 3, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 17, 1, 20, 20, 8, 20, 20, 20, 20, 20, 20, 20, 20, 20, -1, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 19, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 5, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 17, 1, 20, 20, 8, 20, 20, 20, 20, 20, 20, 20, 20, 20, -1, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 19, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 4, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 17, 1, 20, 20, 8, 20, 20, 20, 20, 20, 20, 20, 20, 20, -1, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 19, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 7, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 17, 1, 20, 20, 8, 20, 20, 20, 20, 20, 20, 20, 20, 20, -1, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 19, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 6, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 17, 1, 20, 20, 8, 20, 20, 20, 20, 20, 20, 20, 20, 20, -1, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 19, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 18, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 17, 1, 20, 20, 8, 20, 20, 20, 20, 20, 20, 20, 20, 20, -1, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 19, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 9, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 17, 1, 20, 20, 8, 20, 20, 20, 20, 20, 20, 20, 20, 20, -1, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 10, 20, 20, 19, 11, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 17, 1, 20, 20, 8, 20, 20, 20, 20, 20, 20, 20, 20, 20, -1, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 15, 19, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 16, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 17, 1, 20, 20, 8, 20, 20, 20, 20, 20, 20, 20, 20, 20, 0, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 12, 20, 20, 13, 19, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 14, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 17, 1, 20, 20, 8, 20, 20, 20, 20, 20, 20, 20, 20,20 };