Annotation of sbbs/src/sbbs3/zmodem.h, revision 1.1.1.2

1.1       root        1: /*
                      2:  * zmodem.h
                      3:  * zmodem constants
                      4:  * (C) Mattheij Computer Service 1994
                      5:  */
                      6: 
1.1.1.2 ! root        7: /* $Id: zmodem.h,v 1.52 2010/03/05 20:56:16 rswindell Exp $ */
1.1       root        8: 
                      9: #ifndef _ZMODEM_H
                     10: #define _ZMODEM_H
                     11: 
                     12: #include <stdio.h>     /* FILE */
                     13: 
1.1.1.2 ! root       14: #define ZMODEM_FILE_SIZE_MAX   0xffffffff      /* 32-bits, blame Chuck */
        !            15: 
1.1       root       16: /*
                     17:  * ascii constants
                     18:  */
                     19: 
                     20: #ifndef SOH
                     21: #define        SOH                     0x01
                     22: #define        STX                     0x02
                     23: #define        EOT                     0x04
                     24: #define        ENQ                     0x05
                     25: #define        ACK                     0x06
                     26: #if 0
                     27: #define        LF                      0x0a
                     28: #define        CR                      0x0d
                     29: #endif
                     30: #define DLE                    0x10
                     31: #define        XON                     0x11
                     32: #define        XOFF            0x13
                     33: #define        NAK                     0x15
                     34: #define        CAN                     0x18
                     35: #endif
                     36: 
                     37: /*
                     38:  * zmodem constants
                     39:  */
                     40: 
                     41: #define ZBLOCKLEN      1024            /* "true" Zmodem max subpacket length */
                     42: 
                     43: #define ZMAXHLEN    0x10               /* maximum header information length */
                     44: #define ZMAXSPLEN      0x400           /* maximum subpacket length */
                     45: 
                     46: 
                     47: #define        ZPAD            0x2a            /* pad character; begins frames */
                     48: #define        ZDLE            0x18            /* ctrl-x zmodem escape */
                     49: #define        ZDLEE           0x58            /* escaped ZDLE */      
                     50: 
                     51: #define        ZBIN            0x41            /* binary frame indicator (CRC16) */
                     52: #define        ZHEX            0x42            /* hex frame indicator */
                     53: #define        ZBIN32          0x43            /* binary frame indicator (CRC32) */
                     54: #define        ZBINR32         0x44            /* run length encoded binary frame (CRC32) */
                     55: 
                     56: #define        ZVBIN           0x61            /* binary frame indicator (CRC16) */
                     57: #define        ZVHEX           0x62            /* hex frame indicator */
                     58: #define        ZVBIN32         0x63            /* binary frame indicator (CRC32) */
                     59: #define        ZVBINR32        0x64            /* run length encoded binary frame (CRC32) */
                     60: 
                     61: #define        ZRESC           0x7e            /* run length encoding flag / escape character */
                     62: 
                     63: /*
                     64:  * zmodem frame types
                     65:  */
                     66: 
                     67: #define        ZRQINIT         0x00            /* request receive init (s->r) */
                     68: #define        ZRINIT          0x01            /* receive init (r->s) */
                     69: #define        ZSINIT          0x02            /* send init sequence (optional) (s->r) */
                     70: #define        ZACK            0x03            /* ack to ZRQINIT ZRINIT or ZSINIT (s<->r) */
                     71: #define        ZFILE           0x04            /* file name (s->r) */
                     72: #define        ZSKIP           0x05            /* skip this file (r->s) */
                     73: #define        ZNAK            0x06            /* last packet was corrupted (?) */
                     74: #define        ZABORT          0x07            /* abort batch transfers (?) */
                     75: #define        ZFIN            0x08            /* finish session (s<->r) */
                     76: #define        ZRPOS           0x09            /* resume data transmission here (r->s) */
                     77: #define        ZDATA           0x0a            /* data packet(s) follow (s->r) */
                     78: #define        ZEOF            0x0b            /* end of file reached (s->r) */
                     79: #define        ZFERR           0x0c            /* fatal read or write error detected (?) */
                     80: #define        ZCRC            0x0d            /* request for file CRC and response (?) */
                     81: #define        ZCHALLENGE      0x0e            /* security challenge (r->s) */
                     82: #define        ZCOMPL          0x0f            /* request is complete (?) */   
                     83: #define        ZCAN            0x10            /* pseudo frame; 
                     84:                                                                   other end cancelled session with 5* CAN */
                     85: #define        ZFREECNT        0x11            /* request free bytes on file system (s->r) */
                     86: #define        ZCOMMAND        0x12            /* issue command (s->r) */
                     87: #define        ZSTDERR         0x13            /* output data to stderr (??) */
                     88: 
                     89: /*
                     90:  * ZDLE sequences
                     91:  */
                     92: 
                     93: #define        ZCRCE           0x68            /* CRC next, frame ends, header packet follows */
                     94: #define        ZCRCG           0x69            /* CRC next, frame continues nonstop */
                     95: #define        ZCRCQ           0x6a            /* CRC next, frame continuous, ZACK expected */
                     96: #define        ZCRCW           0x6b            /* CRC next, frame ends,       ZACK expected */
                     97: #define        ZRUB0           0x6c            /* translate to rubout 0x7f */
                     98: #define        ZRUB1           0x6d            /* translate to rubout 0xff */
                     99: 
                    100: /*
                    101:  * frame specific data.
                    102:  * entries are prefixed with their location in the header array.
                    103:  */
                    104: 
                    105: /*
                    106:  * Byte positions within header array
                    107:  */
                    108: 
                    109: #define FTYPE 0                                        /* frame type */
                    110: 
                    111: #define ZF0    4                                       /* First flags byte */
                    112: #define ZF1    3
                    113: #define ZF2    2
                    114: #define ZF3    1
                    115: 
                    116: #define ZP0    1                                       /* Low order 8 bits of position */
                    117: #define ZP1    2
                    118: #define ZP2    3
                    119: #define ZP3    4                                       /* High order 8 bits of file position */
                    120: 
                    121: /*
                    122:  * ZRINIT frame
                    123:  * zmodem receiver capability flags
                    124:  */
                    125: 
                    126: #define        ZF0_CANFDX              0x01    /* Receiver can send and receive true full duplex */
                    127: #define        ZF0_CANOVIO             0x02    /* receiver can receive data during disk I/O */
                    128: #define        ZF0_CANBRK              0x04    /* receiver can send a break signal */
                    129: #define        ZF0_CANCRY              0x08    /* Receiver can decrypt DONT USE */
                    130: #define        ZF0_CANLZW              0x10    /* Receiver can uncompress DONT USE */
                    131: #define        ZF0_CANFC32             0x20    /* Receiver can use 32 bit Frame Check */
                    132: #define        ZF0_ESCCTL              0x40    /* Receiver expects ctl chars to be escaped */
                    133: #define        ZF0_ESC8                0x80    /* Receiver expects 8th bit to be escaped */
                    134: 
                    135: #define ZF1_CANVHDR            0x01    /* Variable headers OK */
                    136: 
                    137: /*
                    138:  * ZSINIT frame
                    139:  * zmodem sender capability
                    140:  */
                    141: 
                    142: #define ZF0_TESCCTL    0x40    /* Transmitter expects ctl chars to be escaped */
                    143: #define ZF0_TESC8      0x80    /* Transmitter expects 8th bit to be escaped */
                    144: 
                    145: #define ZATTNLEN               0x20    /* Max length of attention string */
                    146: #define ALTCOFF                        ZF1             /* Offset to alternate canit string, 0 if not used */
                    147: 
                    148: /*
                    149:  * ZFILE frame
                    150:  */
                    151: 
                    152: /*
                    153:  * Conversion options one of these in ZF0
                    154:  */
                    155: 
                    156: #define ZF0_ZCBIN              1               /* Binary transfer - inhibit conversion */
                    157: #define ZF0_ZCNL               2               /* Convert NL to local end of line convention */
                    158: #define ZF0_ZCRESUM            3               /* Resume interrupted file transfer */
                    159: 
                    160: /*
                    161:  * Management include options, one of these ored in ZF1
                    162:  */
                    163: 
                    164: #define ZF1_ZMSKNOLOC  0x80    /* Skip file if not present at rx */
                    165: #define ZF1_ZMMASK             0x1f    /* Mask for the choices below */
                    166: #define ZF1_ZMNEWL             1               /* Transfer if source newer or longer */
                    167: #define ZF1_ZMCRC              2               /* Transfer if different file CRC or length */
                    168: #define ZF1_ZMAPND             3               /* Append contents to existing file (if any) */
                    169: #define ZF1_ZMCLOB             4               /* Replace existing file */
                    170: #define ZF1_ZMNEW              5               /* Transfer if source newer */
                    171: #define ZF1_ZMDIFF             6               /* Transfer if dates or lengths different */
                    172: #define ZF1_ZMPROT             7               /* Protect destination file */
                    173: #define ZF1_ZMCHNG             8               /* Change filename if destination exists */
                    174: 
                    175: /*
                    176:  * Transport options, one of these in ZF2
                    177:  */
                    178: 
                    179: #define ZF2_ZTNOR              0               /* no compression */
                    180: #define ZF2_ZTLZW              1               /* Lempel-Ziv compression */
                    181: #define ZF2_ZTRLE              3               /* Run Length encoding */
                    182: 
                    183: /*
                    184:  * Extended options for ZF3, bit encoded
                    185:  */
                    186: 
                    187: #define ZF3_ZCANVHDR   0x01    /* Variable headers OK */
                    188:                                                                /* Receiver window size override */
                    189: #define ZF3_ZRWOVR             0x04    /* byte position for receive window override/256 */
                    190: #define ZF3_ZXSPARS            0x40    /* encoding for sparse file operations */
                    191: 
                    192: /*
                    193:  * ZCOMMAND frame
                    194:  */
                    195: 
                    196: #define ZF0_ZCACK1             0x01    /* Acknowledge, then do command */
                    197: 
                    198: typedef struct {
                    199: 
1.1.1.2 ! root      200:        BYTE            rxd_header[ZMAXHLEN];                                                   /* last received header */
        !           201:        int                     rxd_header_len;                                                                 /* last received header size */
        !           202:        uint32_t        rxd_header_pos;                                                                 /* last received header position value */
1.1       root      203: 
                    204:        /*
                    205:         * receiver capability flags
                    206:         * extracted from the ZRINIT frame as received
                    207:         */
                    208: 
                    209:        BOOL can_full_duplex;
                    210:        BOOL can_overlap_io;
                    211:        BOOL can_break;
                    212:        BOOL can_fcs_32;
                    213:        BOOL want_fcs_16;
                    214:        BOOL escape_ctrl_chars; 
                    215:        BOOL escape_8th_bit;
                    216: 
                    217:        /*
                    218:         * file management options.
                    219:         * only one should be on
                    220:         */
                    221: 
                    222:        int management_newer;
                    223:        int management_clobber;
                    224:        int management_protect;
                    225: 
                    226:        /* from zmtx.c */
                    227: 
                    228:        BYTE tx_data_subpacket[8192];
                    229:        BYTE rx_data_subpacket[8192];                                                   /* zzap = 8192 */
                    230: 
                    231:        char            current_file_name[MAX_PATH+1];
1.1.1.2 ! root      232:        int64_t         current_file_size;
        !           233:        int64_t         current_file_pos;
1.1       root      234:        time_t          current_file_time;
                    235:        unsigned        current_file_num;
                    236:        unsigned        total_files;
1.1.1.2 ! root      237:        int64_t         total_bytes;
1.1       root      238:        unsigned        files_remaining;
1.1.1.2 ! root      239:        int64_t         bytes_remaining;
        !           240:        int64_t         transfer_start_pos;
1.1       root      241:        time_t          transfer_start_time;
                    242: 
1.1.1.2 ! root      243:        int             receive_32bit_data;
        !           244:        int             use_crc16;
        !           245:        int32_t ack_file_pos;                           /* file position used in acknowledgement of correctly */
        !           246:                                                                                /* received data subpackets */
1.1       root      247: 
                    248:        int last_sent;
                    249: 
                    250:        int n_cans;
                    251: 
                    252:        /* Stuff added by RRS */
                    253: 
                    254:        /* Status */
                    255:        BOOL            cancelled;
                    256:        BOOL            local_abort;
                    257:        BOOL            file_skipped;
                    258:        BOOL            no_streaming;
1.1.1.2 ! root      259:        BOOL            frame_in_transit;
1.1       root      260:        unsigned        recv_bufsize;   /* Receiver specified buffer size */
1.1.1.2 ! root      261:        int32_t         crc_request;
1.1       root      262:        unsigned        errors;
                    263:        unsigned        consecutive_errors;
                    264: 
                    265:        /* Configuration */
                    266:        BOOL            escape_telnet_iac;
                    267:        unsigned        init_timeout;
                    268:        unsigned        send_timeout;
                    269:        unsigned        recv_timeout;
                    270:        unsigned        crc_timeout;
                    271:        unsigned        max_errors;
                    272:        unsigned        block_size;
                    273:        unsigned        max_block_size;
1.1.1.2 ! root      274:        int64_t         max_file_size;          /* 0 = unlimited */
        !           275:        int                     *log_level;
1.1       root      276: 
                    277:        /* Callbacks */
1.1.1.2 ! root      278:        /* error C2520: conversion from unsigned __int64 to double not implemented, use signed __int64 */
1.1       root      279:        void*           cbdata;
                    280:        int                     (*lputs)(void*, int level, const char* str);
1.1.1.2 ! root      281:        int                     (*send_byte)(void*, BYTE ch, unsigned timeout /* seconds */);
        !           282:        int                     (*recv_byte)(void*, unsigned timeout /* seconds */);
        !           283:        void            (*progress)(void*, int64_t current_pos);
1.1       root      284:        BOOL            (*is_connected)(void*);
                    285:        BOOL            (*is_cancelled)(void*);
1.1.1.2 ! root      286:        BOOL            (*data_waiting)(void*, unsigned timeout /* seconds */);
        !           287:        BOOL            (*duplicate_filename)(void*, void *zm);
        !           288:        void            (*flush)(void*);
1.1       root      289: 
                    290: } zmodem_t;
                    291: 
                    292: void           zmodem_init(zmodem_t*, void* cbdata
                    293:                                                ,int    (*lputs)(void*, int level, const char* str)
1.1.1.2 ! root      294:                                                ,void   (*progress)(void*, int64_t current_pos)
1.1       root      295:                                                ,int    (*send_byte)(void*, BYTE ch, unsigned timeout)
                    296:                                                ,int    (*recv_byte)(void*, unsigned timeout)
                    297:                                                ,BOOL   (*is_connected)(void*)
                    298:                                                ,BOOL   (*is_cancelled)(void*)
                    299:                                                ,BOOL   (*data_waiting)(void*, unsigned timeout)
1.1.1.2 ! root      300:                                                ,void   (*flush)(void*)
1.1       root      301:                                                );
                    302: char*          zmodem_ver(char *buf);
                    303: const char* zmodem_source(void);
                    304: int                    zmodem_rx(zmodem_t* zm);
                    305: int                    zmodem_tx(zmodem_t* zm, BYTE ch);
1.1.1.2 ! root      306: int                    zmodem_send_zabort(zmodem_t*);
        !           307: int                    zmodem_send_ack(zmodem_t*, int32_t pos);
1.1       root      308: int                    zmodem_send_nak(zmodem_t*);
                    309: int                    zmodem_send_zskip(zmodem_t* zm);
                    310: int                    zmodem_send_zrinit(zmodem_t*);
1.1.1.2 ! root      311: int                    zmodem_send_pos_header(zmodem_t* zm, int type, int32_t pos, BOOL hex);
1.1       root      312: int                    zmodem_get_zrinit(zmodem_t*);
                    313: int                    zmodem_get_zfin(zmodem_t* zm);
1.1.1.2 ! root      314: BOOL           zmodem_get_crc(zmodem_t*, int32_t length, uint32_t* crc);
1.1       root      315: void           zmodem_parse_zrinit(zmodem_t*);
                    316: void           zmodem_parse_zfile_subpacket(zmodem_t* zm);
                    317: int                    zmodem_send_zfin(zmodem_t*);
1.1.1.2 ! root      318: BOOL           zmodem_send_file(zmodem_t*, char* name, FILE* fp, BOOL request_init, time_t* start, int64_t* bytes_sent);
        !           319: int                    zmodem_recv_files(zmodem_t* zm, const char* download_dir, int64_t* bytes_received);
1.1       root      320: int                    zmodem_recv_init(zmodem_t* zm);
1.1.1.2 ! root      321: unsigned       zmodem_recv_file_data(zmodem_t*, FILE*, int64_t offset);
1.1       root      322: int                    zmodem_recv_file_frame(zmodem_t* zm, FILE* fp);
                    323: int                    zmodem_recv_header_and_check(zmodem_t* zm);
                    324: #endif
                    325: 
                    326: 

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.