#ifndef lint static const char rcsid[] = "$Id: receive.c,v 1.2 2001/10/25 23:56:29 efalk Exp $" ; #endif #define TEST /* standalone test */ #include #include #include "zmodem.h" #include #include #include #include #include #include /* define TCSBRK */ #include extern int errno ; static u_char zeros[4] = {0,0,0,0} ; main(argc,argv) int argc ; char **argv ; { struct termios old_settings, new_settings ; fd_set readfds ; struct timeval timeout ; int i ; int len ; char buffer[1024] ; int done = 0 ; int filecount = 0 ; ZModem info ; #ifdef TEST static u_char Amsg0[] = { 0x72, 0x7a, 0x0d, 0x2a, 0x2a, 0x18, 0x42, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x0d, 0x0a, 0x11, } ; static u_char Amsg1[] = { 0x2a, 0x18, 0x43, 0x02, 0x00, 0x00, 0x00, 0x00, 0x7d, 0xa4, 0xe2, 0xbc, 0x00, 0x18, 0x6b, 0x2f, 0xaa, 0xb9, 0x9b, 0x2a, 0x18, 0x43, 0x02, 0x00, 0x00, 0x00, 0x00, 0x7d, 0xa4, 0xe2, 0xbc, } ; static u_char Amsg2[] = { 0x00, 0x18, 0x6b, 0x2f, 0xaa, 0xb9, 0x9b, 0x2a, 0x18, 0x43, 0x04, 0x00, 0x00, 0x04, 0x00, 0xd9, 0x94, 0xce, 0x57, } ; static u_char Amsg3[] = { 0x72, 0x65, 0x63, 0x65, 0x69, 0x76, 0x65, 0x2e, 0x63, 0x00, 0x31, 0x36, 0x39, 0x38, 0x36, 0x20, 0x35, 0x37, 0x30, 0x30, 0x36, 0x36, 0x37, 0x36, 0x37, 0x30, 0x20, 0x31, 0x30, 0x30, 0x36, 0x36, 0x34, 0x20, 0x30, 0x20, 0x30, 0x20, 0x30, 0x20, 0x30, 0x00, 0x18, 0x6b, 0x57, 0xed, 0x76, 0xb6, } ; static u_char Amsg4[] = { 0x2a, 0x18, 0x43, 0x0a, 0x00, 0x00, 0x00, 0x00, 0xbc, 0xef, 0x92, 0x8c, 0x0a, 0x23, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x65, 0x09, 0x54, 0x45, 0x53, 0x54, 0x09, 0x2f, 0x2a, 0x20, 0x73, 0x74, 0x61, 0x6e, 0x64, 0x61, 0x6c, 0x6f, 0x6e, 0x65, 0x20, 0x74, 0x65, 0x73, 0x74, 0x20, 0x2a, 0x2f, 0x0a, 0x0a, 0x23, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x20, 0x3c, 0x75, 0x6e, 0x69, 0x73, 0x74, 0x64, 0x2e, 0x68, 0x3e, 0x0a, 0x23, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x20, 0x3c, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x68, 0x3e, 0x0a, 0x23, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x20, 0x22, 0x7a, 0x6d, 0x6f, 0x64, 0x65, 0x6d, 0x2e, 0x68, 0x22, 0x0a, 0x23, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x20, 0x3c, 0x73, 0x79, 0x73, 0x2f, 0x73, 0x74, 0x61, 0x74, 0x2e, 0x68, 0x3e, 0x0a, 0x0a, 0x23, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x20, 0x3c, 0x66, 0x63, 0x6e, 0x74, 0x6c, 0x2e, 0x68, 0x3e, 0x0a, 0x23, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x20, 0x3c, 0x65, 0x72, 0x72, 0x6e, 0x6f, 0x2e, 0x68, 0x3e, 0x0a, 0x23, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x20, 0x3c, 0x73, 0x79, 0x73, 0x2f, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x68, 0x3e, 0x0a, 0x23, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x20, 0x3c, 0x73, 0x79, 0x73, 0x2f, 0x74, 0x65, 0x72, 0x6d, 0x69, 0x6f, 0x73, 0x2e, 0x68, 0x3e, 0x0a, 0x23, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x20, 0x3c, 0x73, 0x79, 0x73, 0x2f, 0x74, 0x65, 0x72, 0x6d, 0x69, 0x6f, 0x2e, 0x68, 0x3e, 0x09, 0x09, 0x2f, 0x2a, 0x20, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x65, 0x20, 0x54, 0x43, 0x53, 0x42, 0x52, 0x4b, 0x20, 0x2a, 0x2f, 0x0a, 0x23, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x20, 0x3c, 0x73, 0x79, 0x73, 0x2f, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x2e, 0x68, 0x3e, 0x0a, 0x0a, 0x65, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x09, 0x69, 0x6e, 0x74, 0x09, 0x65, 0x72, 0x72, 0x6e, 0x6f, 0x20, 0x3b, 0x0a, 0x0a, 0x73, 0x74, 0x61, 0x74, 0x69, 0x63, 0x09, 0x75, 0x5f, 0x63, 0x68, 0x61, 0x72, 0x09, 0x7a, 0x65, 0x72, 0x6f, 0x73, 0x5b, 0x34, 0x5d, 0x20, 0x3d, 0x20, 0x7b, 0x30, 0x2c, 0x30, 0x2c, 0x30, 0x2c, 0x30, 0x7d, 0x20, 0x3b, 0x0a, 0x0a, 0x6d, 0x61, 0x69, 0x6e, 0x28, 0x61, 0x72, 0x67, 0x63, 0x2c, 0x61, 0x72, 0x67, 0x76, 0x29, 0x0a, 0x09, 0x69, 0x6e, 0x74, 0x09, 0x61, 0x72, 0x67, 0x63, 0x20, 0x3b, 0x0a, 0x09, 0x63, 0x68, 0x61, 0x72, 0x09, 0x2a, 0x2a, 0x61, 0x72, 0x67, 0x76, 0x20, 0x3b, 0x0a, 0x7b, 0x0a, 0x09, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x09, 0x74, 0x65, 0x72, 0x6d, 0x69, 0x6f, 0x73, 0x09, 0x6f, 0x6c, 0x64, 0x5f, 0x73, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x2c, 0x20, 0x6e, 0x65, 0x77, 0x5f, 0x73, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x20, 0x3b, 0x0a, 0x09, 0x66, 0x64, 0x5f, 0x73, 0x65, 0x74, 0x09, 0x72, 0x65, 0x61, 0x64, 0x66, 0x64, 0x73, 0x20, 0x3b, 0x0a, 0x09, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x20, 0x74, 0x69, 0x6d, 0x65, 0x76, 0x61, 0x6c, 0x20, 0x74, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x20, 0x3b, 0x0a, 0x09, 0x69, 0x6e, 0x74, 0x09, 0x69, 0x20, 0x3b, 0x0a, 0x09, 0x69, 0x6e, 0x74, 0x09, 0x6c, 0x65, 0x6e, 0x20, 0x3b, 0x0a, 0x09, 0x63, 0x68, 0x61, 0x72, 0x09, 0x62, 0x75, 0x66, 0x66, 0x65, 0x72, 0x5b, 0x31, 0x30, 0x32, 0x34, 0x5d, 0x20, 0x3b, 0x0a, 0x09, 0x69, 0x6e, 0x74, 0x09, 0x64, 0x6f, 0x6e, 0x65, 0x20, 0x3d, 0x20, 0x30, 0x20, 0x3b, 0x0a, 0x09, 0x69, 0x6e, 0x74, 0x09, 0x66, 0x69, 0x6c, 0x65, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x20, 0x3d, 0x20, 0x30, 0x20, 0x3b, 0x0a, 0x09, 0x5a, 0x4d, 0x6f, 0x64, 0x65, 0x6d, 0x09, 0x69, 0x6e, 0x66, 0x6f, 0x20, 0x3b, 0x0a, 0x0a, 0x23, 0x69, 0x66, 0x64, 0x65, 0x66, 0x09, 0x54, 0x45, 0x53, 0x54, 0x0a, 0x0a, 0x73, 0x74, 0x61, 0x74, 0x69, 0x63, 0x09, 0x75, 0x5f, 0x63, 0x68, 0x61, 0x72, 0x09, 0x41, 0x6d, 0x73, 0x67, 0x30, 0x5b, 0x5d, 0x20, 0x3d, 0x20, 0x7b, 0x0a, 0x09, 0x20, 0x20, 0x30, 0x78, 0x37, 0x32, 0x2c, 0x20, 0x30, 0x78, 0x37, 0x61, 0x2c, 0x20, 0x30, 0x78, 0x30, 0x64, 0x2c, 0x20, 0x30, 0x78, 0x32, 0x61, 0x2c, 0x20, 0x30, 0x78, 0x32, 0x61, 0x2c, 0x20, 0x30, 0x78, 0x31, 0x38, 0x2c, 0x20, 0x30, 0x78, 0x34, 0x32, 0x2c, 0x20, 0x30, 0x78, 0x33, 0x30, 0x2c, 0x20, 0x0a, 0x09, 0x20, 0x20, 0x30, 0x78, 0x33, 0x30, 0x2c, 0x20, 0x30, 0x78, 0x33, 0x30, 0x2c, 0x20, 0x30, 0x78, 0x33, 0x30, 0x2c, 0x20, 0x30, 0x78, 0x33, 0x30, 0x2c, 0x20, 0x30, 0x78, 0x33, 0x30, 0x2c, 0x20, 0x30, 0x78, 0x33, 0x30, 0x2c, 0x20, 0x30, 0x78, 0x33, 0x30, 0x2c, 0x20, 0x30, 0x78, 0x33, 0x30, 0x2c, 0x20, 0x0a, 0x09, 0x20, 0x20, 0x30, 0x78, 0x33, 0x30, 0x2c, 0x20, 0x30, 0x78, 0x33, 0x30, 0x2c, 0x20, 0x30, 0x78, 0x33, 0x30, 0x2c, 0x20, 0x30, 0x78, 0x33, 0x30, 0x2c, 0x20, 0x30, 0x78, 0x33, 0x30, 0x2c, 0x20, 0x30, 0x78, 0x30, 0x64, 0x2c, 0x20, 0x30, 0x78, 0x30, 0x61, 0x2c, 0x20, 0x30, 0x78, 0x31, 0x31, 0x2c, 0x20, 0x0a, 0x09, 0x7d, 0x20, 0x3b, 0x0a, 0x73, 0x74, 0x61, 0x74, 0x69, 0x63, 0x09, 0x75, 0x5f, 0x63, 0x68, 0x61, 0x72, 0x09, 0x41, 0x6d, 0x73, 0x67, 0x31, 0x5b, 0x5d, 0x20, 0x3d, 0x20, 0x7b, 0x0a, 0x09, 0x20, 0x20, 0x30, 0x78, 0x32, 0x61, 0x2c, 0x20, 0x30, 0x78, 0x31, 0x38, 0x2c, 0x20, 0x30, 0x78, 0x34, 0x33, 0x2c, 0x20, 0x30, 0x78, 0x30, 0x34, 0x2c, 0x20, 0x30, 0x78, 0x30, 0x30, 0x2c, 0x20, 0x30, 0x78, 0x30, 0x30, 0x2c, 0x20, 0x30, 0x78, 0x30, 0x30, 0x2c, 0x20, 0x30, 0x78, 0x30, 0x30, 0x2c, 0x20, 0x0a, 0x09, 0x20, 0x20, 0x30, 0x78, 0x64, 0x64, 0x2c, 0x20, 0x30, 0x78, 0x35, 0x31, 0x2c, 0x20, 0x30, 0x78, 0x61, 0x32, 0x2c, 0x20, 0x30, 0x78, 0x33, 0x33, 0x2c, 0x20, 0x30, 0x78, 0x37, 0x35, 0x2c, 0x20, 0x30, 0x78, 0x37, 0x34, 0x2c, 0x20, 0x30, 0x78, 0x36, 0x39, 0x2c, 0x20, 0x30, 0x78, 0x36, 0x63, 0x2c, 0x20, 0x0a, 0x09, 0x20, 0x20, 0x30, 0x78, 0x37, 0x33, 0x2c, 0x20, 0x30, 0x78, 0x32, 0x65, 0x2c, 0x20, 0x30, 0x78, 0x36, 0x33, 0x2c, 0x20, 0x30, 0x78, 0x30, 0x30, 0x2c, 0x20, 0x30, 0x78, 0x33, 0x31, 0x2c, 0x20, 0x30, 0x78, 0x33, 0x31, 0x2c, 0x20, 0x30, 0x78, 0x33, 0x30, 0x2c, 0x20, 0x30, 0x78, 0x33, 0x37, 0x2c, 0x20, 0x0a, 0x09, 0x20, 0x20, 0x30, 0x78, 0x32, 0x30, 0x2c, 0x20, 0x30, 0x78, 0x33, 0x35, 0x2c, 0x20, 0x30, 0x78, 0x33, 0x37, 0x2c, 0x20, 0x30, 0x78, 0x33, 0x30, 0x2c, 0x20, 0x30, 0x78, 0x33, 0x30, 0x2c, 0x20, 0x30, 0x78, 0x33, 0x30, 0x2c, 0x20, 0x30, 0x78, 0x33, 0x35, 0x2c, 0x20, 0x30, 0x78, 0x33, 0x36, 0x2c, 0x20, 0x0a, 0x09, 0x20, 0x20, 0x30, 0x78, 0x33, 0x31, 0x2c, 0x20, 0x30, 0x78, 0x33, 0x30, 0x2c, 0x20, 0x30, 0x78, 0x33, 0x34, 0x2c, 0x20, 0x30, 0x78, 0x32, 0x30, 0x2c, 0x20, 0x30, 0x78, 0x33, 0x18, 0x6a, 0xf8, 0x0e, 0xd1, 0x2f, 0x31, 0x2c, 0x20, 0x30, 0x78, 0x33, 0x30, 0x2c, 0x20, 0x30, 0x78, 0x33, 0x30, 0x2c, 0x20, 0x30, 0x78, 0x33, 0x36, 0x2c, 0x20, 0x0a, 0x09, 0x20, 0x20, 0x30, 0x78, 0x33, 0x36, 0x2c, 0x20, 0x30, 0x78, 0x33, 0x34, 0x2c, 0x20, 0x30, 0x78, 0x32, 0x30, 0x2c, 0x20, 0x30, 0x78, 0x33, 0x30, 0x2c, 0x20, 0x30, 0x78, 0x32, 0x30, 0x2c, 0x20, 0x30, 0x78, 0x33, 0x30, 0x2c, 0x20, 0x30, 0x78, 0x32, 0x30, 0x2c, 0x20, 0x30, 0x78, 0x33, 0x30, 0x2c, 0x20, 0x0a, 0x09, 0x20, 0x20, 0x30, 0x78, 0x32, 0x30, 0x2c, 0x20, 0x30, 0x78, 0x33, 0x30, 0x2c, 0x20, 0x30, 0x78, 0x30, 0x30, 0x2c, 0x20, 0x30, 0x78, 0x31, 0x38, 0x2c, 0x20, 0x30, 0x78, 0x36, 0x62, 0x2c, 0x20, 0x30, 0x78, 0x63, 0x63, 0x2c, 0x20, 0x30, 0x78, 0x38, 0x38, 0x2c, 0x20, 0x30, 0x78, 0x38, 0x36, 0x2c, 0x20, 0x0a, 0x09, 0x20, 0x20, 0x30, 0x78, 0x31, 0x61, 0x2c, 0x20, 0x0a, 0x09, 0x7d, 0x20, 0x3b, 0x0a, 0x73, 0x74, 0x61, 0x74, 0x69, 0x63, 0x09, 0x75, 0x5f, 0x63, 0x68, 0x61, 0x72, 0x09, 0x41, 0x6d, 0x73, 0x67, 0x32, 0x5b, 0x5d, 0x20, 0x3d, 0x20, 0x7b, 0x0a, 0x09, 0x20, 0x20, 0x30, 0x78, 0x32, 0x61, 0x2c, 0x20, 0x30, 0x78, 0x31, 0x38, 0x2c, 0x20, 0x30, 0x78, 0x34, 0x33, 0x2c, 0x20, 0x30, 0x78, 0x30, 0x34, 0x2c, 0x20, 0x30, 0x78, 0x30, 0x30, 0x2c, 0x20, 0x30, 0x78, 0x30, 0x30, 0x2c, 0x20, 0x30, 0x78, 0x30, 0x30, 0x2c, 0x20, 0x30, 0x78, 0x30, 0x30, 0x2c, 0x20, 0x0a, 0x09, 0x20, 0x20, 0x30, 0x78, 0x64, 0x64, 0x2c, 0x20, 0x30, 0x78, 0x35, 0x31, 0x2c, 0x20, 0x30, 0x78, 0x61, 0x32, 0x2c, 0x20, 0x30, 0x78, 0x33, 0x33, 0x2c, 0x20, 0x30, 0x78, 0x37, 0x35, 0x2c, 0x20, 0x30, 0x78, 0x37, 0x34, 0x2c, 0x20, 0x30, 0x78, 0x36, 0x39, 0x2c, 0x20, 0x30, 0x78, 0x36, 0x63, 0x2c, 0x20, 0x0a, 0x09, 0x20, 0x20, 0x30, 0x78, 0x37, 0x33, 0x2c, 0x20, 0x30, 0x78, 0x32, 0x65, 0x2c, 0x20, 0x30, 0x78, 0x36, 0x33, 0x2c, 0x20, 0x30, 0x78, 0x30, 0x30, 0x2c, 0x20, 0x30, 0x78, 0x33, 0x31, 0x2c, 0x20, 0x30, 0x78, 0x33, 0x31, 0x2c, 0x20, 0x30, 0x78, 0x33, 0x30, 0x2c, 0x20, 0x30, 0x78, 0x33, 0x37, 0x2c, 0x20, 0x0a, 0x09, 0x20, 0x20, 0x30, 0x78, 0x32, 0x30, 0x2c, 0x20, 0x30, 0x78, 0x33, 0x35, 0x2c, 0x20, 0x30, 0x78, 0x33, 0x37, 0x2c, 0x20, 0x30, 0x78, 0x33, 0x30, 0x2c, 0x20, 0x30, 0x78, 0x33, 0x30, 0x2c, 0x20, 0x30, 0x78, 0x33, 0x30, 0x2c, 0x20, 0x30, 0x78, 0x33, 0x35, 0x2c, 0x20, 0x30, 0x78, 0x33, 0x36, 0x2c, 0x20, 0x0a, 0x09, 0x20, 0x20, 0x30, 0x78, 0x33, 0x31, 0x2c, 0x20, 0x30, 0x78, 0x33, 0x30, 0x2c, 0x20, 0x30, 0x78, 0x33, 0x34, 0x2c, 0x20, 0x30, 0x78, 0x32, 0x30, 0x2c, 0x20, 0x30, 0x78, 0x33, 0x31, 0x2c, 0x20, 0x30, 0x78, 0x33, 0x30, 0x2c, 0x20, 0x30, 0x78, 0x33, 0x30, 0x2c, 0x20, 0x30, 0x78, 0x33, 0x36, 0x2c, 0x20, 0x0a, 0x09, 0x20, 0x20, 0x30, 0x78, 0x33, 0x36, 0x2c, 0x20, 0x30, 0x78, 0x33, 0x34, 0x2c, 0x20, 0x30, 0x78, 0x32, 0x30, 0x2c, 0x20, 0x30, 0x78, 0x33, 0x30, 0x2c, 0x20, 0x30, 0x78, 0x32, 0x30, 0x2c, 0x20, 0x30, 0x78, 0x33, 0x30, 0x2c, 0x20, 0x30, 0x78, 0x32, 0x30, 0x2c, 0x20, 0x30, 0x78, 0x33, 0x30, 0x2c, 0x20, 0x0a, 0x09, 0x20, 0x20, 0x30, 0x78, 0x32, 0x30, 0x2c, 0x20, 0x30, 0x78, 0x33, 0x30, 0x2c, 0x20, 0x30, 0x78, 0x30, 0x30, 0x2c, 0x20, 0x30, 0x78, 0x31, 0x38, 0x2c, 0x20, 0x30, 0x78, 0x36, 0x62, 0x2c, 0x20, 0x30, 0x78, 0x63, 0x63, 0x2c, 0x20, 0x30, 0x78, 0x38, 0x38, 0x2c, 0x20, 0x30, 0x78, 0x38, 0x36, 0x2c, 0x20, 0x0a, 0x09, 0x20, 0x20, 0x30, 0x78, 0x31, 0x61, 0x2c, 0x20, 0x0a, 0x09, 0x7d, 0x20, 0x3b, 0x0a, 0x73, 0x74, 0x61, 0x74, 0x69, 0x63, 0x09, 0x75, 0x5f, 0x63, 0x68, 0x61, 0x72, 0x09, 0x41, 0x6d, 0x73, 0x67, 0x33, 0x5b, 0x5d, 0x20, 0x3d, 0x20, 0x7b, 0x0a, 0x09, 0x20, 0x20, 0x30, 0x78, 0x32, 0x61, 0x2c, 0x20, 0x30, 0x78, 0x31, 0x38, 0x2c, 0x20, 0x30, 0x78, 0x34, 0x33, 0x2c, 0x20, 0x30, 0x78, 0x30, 0x61, 0x2c, 0x20, 0x30, 0x78, 0x30, 0x30, 0x2c, 0x20, 0x30, 0x78, 0x30, 0x30, 0x2c, 0x20, 0x30, 0x78, 0x30, 0x30, 0x2c, 0x20, 0x30, 0x78, 0x30, 0x30, 0x2c, 0x20, 0x0a, 0x09, 0x20, 0x20, 0x30, 0x78, 0x62, 0x63, 0x2c, 0x20, 0x30, 0x78, 0x65, 0x66, 0x2c, 0x20, 0x30, 0x78, 0x39, 0x32, 0x2c, 0x20, 0x30, 0x78, 0x38, 0x63, 0x2c, 0x20, 0x30, 0x78, 0x30, 0x61, 0x2c, 0x20, 0x30, 0x78, 0x32, 0x33, 0x2c, 0x20, 0x30, 0x78, 0x36, 0x39, 0x2c, 0x20, 0x30, 0x78, 0x36, 0x65, 0x2c, 0x20, 0x0a, 0x09, 0x20, 0x20, 0x30, 0x78, 0x36, 0x33, 0x2c, 0x20, 0x30, 0x78, 0x36, 0x63, 0x2c, 0x20, 0x30, 0x78, 0x37, 0x35, 0x2c, 0x20, 0x30, 0x78, 0x36, 0x34, 0x2c, 0x20, 0x30, 0x78, 0x36, 0x35, 0x2c, 0x20, 0x30, 0x78, 0x32, 0x30, 0x2c, 0x20, 0x30, 0x78, 0x33, 0x63, 0x2c, 0x20, 0x30, 0x78, 0x37, 0x33, 0x2c, 0x20, 0x0a, 0x09, 0x20, 0x20, 0x30, 0x78, 0x37, 0x39, 0x2c, 0x20, 0x30, 0x78, 0x36, 0x33, 0x2c, 0x20, 0x30, 0x78, 0x32, 0x66, 0x2c, 0x20, 0x30, 0x78, 0x37, 0x34, 0x2c, 0x20, 0x30, 0x78, 0x36, 0x35, 0x2c, 0x20, 0x30, 0x78, 0x37, 0x32, 0x2c, 0x20, 0x30, 0x78, 0x36, 0x64, 0x2c, 0x20, 0x30, 0x78, 0x36, 0x39, 0x2c, 0x20, 0x0a, 0x09, 0x20, 0x20, 0x30, 0x78, 0x36, 0x66, 0x2c, 0x20, 0x30, 0x78, 0x37, 0x33, 0x2c, 0x20, 0x30, 0x78, 0x32, 0x65, 0x2c, 0x20, 0x30, 0x78, 0x36, 0x38, 0x2c, 0x20, 0x30, 0x78, 0x33, 0x65, 0x2c, 0x20, 0x30, 0x78, 0x30, 0x61, 0x2c, 0x20, 0x30, 0x78, 0x32, 0x33, 0x2c, 0x20, 0x30, 0x78, 0x36, 0x39, 0x2c, 0x20, 0x0a, 0x09, 0x20, 0x20, 0x30, 0x78, 0x36, 0x65, 0x2c, 0x20, 0x30, 0x78, 0x36, 0x33, 0x2c, 0x20, 0x30, 0x78, 0x36, 0x63, 0x2c, 0x20, 0x30, 0x78, 0x37, 0x35, 0x2c, 0x20, 0x30, 0x78, 0x36, 0x34, 0x2c, 0x20, 0x30, 0x78, 0x36, 0x35, 0x2c, 0x20, 0x30, 0x78, 0x32, 0x30, 0x2c, 0x20, 0x30, 0x78, 0x32, 0x32, 0x2c, 0x20, 0x0a, 0x09, 0x20, 0x20, 0x30, 0x78, 0x37, 0x38, 0x2c, 0x20, 0x30, 0x78, 0x36, 0x64, 0x2c, 0x20, 0x30, 0x78, 0x36, 0x66, 0x2c, 0x20, 0x30, 0x78, 0x36, 0x34, 0x2c, 0x20, 0x30, 0x78, 0x36, 0x35, 0x2c, 0x20, 0x30, 0x78, 0x36, 0x64, 0x2c, 0x20, 0x30, 0x78, 0x32, 0x65, 0x2c, 0x20, 0x30, 0x78, 0x36, 0x38, 0x2c, 0x20, 0x0a, 0x09, 0x20, 0x20, 0x30, 0x78, 0x32, 0x32, 0x2c, 0x20, 0x30, 0x78, 0x30, 0x61, 0x2c, 0x20, 0x30, 0x78, 0x30, 0x61, 0x2c, 0x20, 0x30, 0x78, 0x30, 0x61, 0x2c, 0x20, 0x30, 0x78, 0x36, 0x39, 0x2c, 0x20, 0x30, 0x78, 0x36, 0x65, 0x2c, 0x20, 0x30, 0x78, 0x37, 0x34, 0x2c, 0x20, 0x30, 0x78, 0x30, 0x61, 0x2c, 0x20, 0x0a, 0x09, 0x20, 0x20, 0x30, 0x78, 0x37, 0x33, 0x2c, 0x20, 0x30, 0x78, 0x36, 0x35, 0x2c, 0x20, 0x30, 0x78, 0x36, 0x65, 0x2c, 0x20, 0x30, 0x78, 0x36, 0x34, 0x2c, 0x20, 0x30, 0x78, 0x34, 0x33, 0x2c, 0x20, 0x30, 0x78, 0x36, 0x18, 0x6a, 0x4a, 0xe5, 0x72, 0x71, } ; #define E(b) {b, sizeof(b)} static struct {u_char *am; int len} Amsgs[] = { E(Amsg0), E(Amsg1), E(Amsg2), E(Amsg3), E(Amsg4),} ; #endif /* TEST */ /* try to trap uninit. variables */ memset(&info,0xa5,sizeof(info)) ; info.zrinitflags = CANFDX|CANOVIO|CANBRK|CANFC32 ; info.packetsize = 128 ; info.bufsize = 0 ; #ifdef TEST done = ZmodemRInit(&info) ; for(i=0; !done; ++i ) done = ZmodemRcv(Amsgs[i].am, Amsgs[i].len, &info) ; #else if( argc < 2 ) exit(2) ; info.ifd = open(argv[1], O_RDWR) ; if( info.ifd == -1 ) exit(1) ; tcgetattr(info.ifd,&old_settings) ; new_settings = old_settings ; new_settings.c_iflag &= ~(ISTRIP|INLCR|IGNCR|ICRNL|IUCLC|IXON|IXOFF|IMAXBEL) ; new_settings.c_oflag = 0 ; new_settings.c_cflag = B300|CS8|CREAD|CLOCAL ; new_settings.c_lflag = 0 ; new_settings.c_cc[VMIN] = 32 ; new_settings.c_cc[VTIME] = 1 ; tcsetattr(info.ifd,TCSADRAIN, &new_settings) ; done = ZmodemRInit(&info) ; while(!done) { FD_ZERO(&readfds) ; FD_SET(info.ifd, &readfds) ; timeout.tv_sec = info.timeout ; timeout.tv_usec = 0 ; i = select(info.ifd+1, &readfds,NULL,NULL, &timeout) ; if( i<0 ) perror("select") ; else if( i==0 ) done = ZmodemTimeout(&info) ; else { len = read(info.ifd, buffer, sizeof(buffer)) ; done = ZmodemRcv(buffer, len, &info) ; } } tcsetattr(info.ifd,TCSADRAIN, &old_settings) ; #endif /* TEST */ exit(0) ; } int ZXmitStr(buffer, len, info) u_char *buffer ; int len ; ZModem *info ; { int i,j ; u_char c ; extern double drand48() ; #ifdef TEST for(i=0; i= 0177) ? '.' : c ) ; printf("|\n") ; } #else #ifdef COMMENT /* TEST: randomly corrupt one out of every 300 bytes */ for(i=0; iifd, buffer, len) != len ) return ZmErrSys ; #endif /* TEST */ return 0 ; } void ZIFlush(info) ZModem *info ; { } void ZOFlush(info) ZModem *info ; { } void ZStatus(i,j,str) { fprintf(stderr,"status %d=%d\n",i,j) ; } int ZAttn(info) ZModem *info ; { char *ptr ; int i = 0 ; for(ptr = info->attn; *ptr != '\0'; ++ptr) { if( *ptr == ATTNBRK ) ioctl(info->ifd, TCSBRK, 0) ; else if( *ptr == ATTNPSE ) sleep(1) ; else write(info->ifd, ptr, 1) ; } return 0 ; } FILE * ZOpenFile(name, crc, info) char *name ; u_long crc ; ZModem *info ; { struct stat buf ; int exists ; /* file already exists */ static int changeCount = 0 ; char name2[MAXPATHLEN] ; int apnd = 0 ; int f0,f1,f2,f3 ; /* TODO: if absolute path, do we want to allow it? * if relative path, do we want to prepend something? */ if( *name == '/' ) /* for now, disallow absolute paths */ return NULL ; if( stat(name, &buf) == 0 ) exists = 1 ; else if( errno == ENOENT ) exists = 0 ; else return NULL ; /* if remote end has not specified transfer flags, we can * accept the local definitions */ if( f0 == ZCRESUM ) { /* if exists, and we already have it, return */ if( exists && buf.st_size == info->len ) return NULL ; apnd = 1 ; } /* reject if file not found and it most be there (ZMSKNOLOC) */ if( !exists && (f1 & ZMSKNOLOC) ) return NULL ; switch( f1 & ZMMASK ) { case 0: /* Implementation-dependent. In this case, we * reject if file exists (and ZMSKNOLOC not set) */ if( exists && !(f1 & ZMSKNOLOC) ) return NULL ; break ; case ZMNEWL: /* take if newer or longer than file on disk */ if( exists && info->date <= buf.st_mtime && info->len <= buf.st_size ) return NULL ; break ; case ZMCRC: /* take if different CRC or length */ if( exists && info->len == buf.st_size && crc == FileCrc(name) ) return NULL ; break ; case ZMAPND: /* append */ apnd = 1 ; case ZMCLOB: /* unconditional replace */ break ; case ZMNEW: /* take if newer than file on disk */ if( exists && info->date <= buf.st_mtime ) return NULL ; break ; case ZMDIFF: /* take if different date or length */ if( exists && info->date == buf.st_mtime && info->len == buf.st_size ) return NULL ; break ; case ZMPROT: /* only if dest does not exist */ if( exists ) return NULL ; break ; case ZMCHNG: /* invent new filename if exists */ if( exists ) { while( exists ) { sprintf(name2, "%s_%d", name, changeCount++) ; exists = stat(name2, &buf) == 0 || errno != ENOENT ; } name = name2 ; } break ; } /* here if we've decided to accept */ if( exists && !apnd && unlink(name) != 0 ) return NULL ; /* TODO: build directory path if needed */ return fopen(name, apnd ? "a" : "w") ; } int ZWriteFile(buffer, len, file, info) u_char *buffer ; int len ; FILE *file ; ZModem *info ; { /* TODO: if ZCNL set in info->f0, convert * newlines to local convention */ return fwrite(buffer, 1, len, file) == len ? 0 : ZmErrSys ; } int ZCloseFile(info) ZModem *info ; { fclose(info->file) ; chmod(info->filename, info->mode&0777) ; }