| #ifndef ZMODEM_GLOBAL_H |
| #define ZMODEM_GLOBAL_H |
| |
| /* zglobal.h - prototypes etcetera for lrzsz |
| |
| Copyright (C) until 1998 Chuck Forsberg (OMEN Technology Inc) |
| Copyright (C) 1994 Matt Porter |
| Copyright (C) 1996, 1997 Uwe Ohse |
| |
| 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, 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 "config.h" |
| #include <sys/types.h> |
| |
| #ifdef __GNUC__ |
| #ifndef HAVE_ALLOCA |
| # define alloca __builtin_alloca |
| # define HAVE_ALLOCA 1 |
| #endif |
| #else |
| # if defined HAVE_ALLOCA_H || defined _LIBC |
| # include <alloca.h> |
| # else |
| # ifdef _AIX |
| #pragma alloca |
| # else |
| # ifndef alloca |
| # ifndef __GLIBC__ |
| char *alloca (); |
| # endif |
| # endif |
| # endif |
| # endif |
| #endif |
| |
| #ifndef __P |
| #if defined (__GNUC__) || (defined (__STDC__) && __STDC__) |
| #define __P(args) args |
| #else |
| #define __P(args) () |
| #endif /* GCC. */ |
| #endif /* Not __P. */ |
| |
| #ifdef __STDC__ |
| #include <stdarg.h> |
| #else |
| #include <varargs.h> |
| #endif |
| |
| #ifdef TIME_WITH_SYS_TIME |
| # include <sys/time.h> |
| # include <time.h> |
| # define INCLUDED_SYS_TIME |
| #else |
| # ifdef HAVE_SYS_TIME_H |
| # include <sys/time.h> |
| # define INCLUDED_SYS_TIME |
| # else |
| # include <time.h> |
| # endif |
| #endif |
| #ifdef SYS_TIME_WITHOUT_SYS_SELECT |
| # ifdef INCLUDED_SYS_TIME |
| # undef HAVE_SYS_SELECT_H |
| # endif |
| #endif |
| |
| |
| #ifdef HAVE_SYS_SELECT_H |
| # include <sys/select.h> |
| #endif |
| #ifdef __BEOS__ |
| /* BeOS 4.0: sys/select.h is almost completely #ifdefd out */ |
| #define HAVE_SOCKET_H |
| #ifdef HAVE_SOCKET_H |
| #include <socket.h> |
| #endif |
| #endif |
| |
| #if STDC_HEADERS |
| # include <string.h> |
| #else |
| # ifdef HAVE_STRINGS_H |
| # include <strings.h> |
| # endif |
| # ifndef HAVE_STRCHR |
| # define strchr index |
| # define strrchr rindex |
| # endif |
| char *strchr (), *strrchr (); |
| # ifndef HAVE_MEMCPY |
| # define memcpy(d, s, n) bcopy ((s), (d), (n)) |
| # define memmove(d, s, n) bcopy ((s), (d), (n)) |
| # endif |
| #endif |
| |
| #include <sys/stat.h> |
| |
| /* we need to decide whether readcheck is possible */ |
| #ifdef HAVE_FCNTL_H |
| # include <fcntl.h> |
| #endif |
| #ifdef HAVE_SYS_IOCTL_H |
| # include <sys/ioctl.h> |
| #endif |
| #ifdef HAVE_RDCHK |
| # define READCHECK |
| #else |
| # ifdef FIONREAD |
| # define READCHECK_FIONREAD |
| # define READCHECK |
| # else |
| # ifdef F_GETFL |
| # define READCHECK |
| # define READCHECK_READS |
| # define READCHECK_GETFL |
| # endif |
| # endif |
| #endif |
| |
| /* used to use #elif, but native braindead hpux 9.00 c compiler didn't |
| * understand it */ |
| #ifdef HAVE_TERMIOS_H |
| /* get rid of warnings on SCO ODT 3.2 */ |
| struct termios; |
| # include <termios.h> |
| # define USE_TERMIOS |
| #else |
| # if defined(HAVE_SYS_TERMIOS_H) |
| # include <sys/termios.h> |
| # define USE_TERMIOS |
| # else |
| # if defined(HAVE_TERMIO_H) |
| # include <termio.h> |
| # define USE_TERMIO |
| # else |
| # if defined(HAVE_SYS_TERMIO_H) |
| # include <sys/termio.h> |
| # define USE_TERMIO |
| # else |
| # if defined(HAVE_SGTTY_H) |
| # include <sgtty.h> |
| # define USE_SGTTY |
| # ifdef LLITOUT |
| extern long Locmode; /* Saved "local mode" for 4.x BSD "new driver" */ |
| extern long Locbit; /* Bit SUPPOSED to disable output translations */ |
| # endif |
| # else |
| # error neither termio.h nor sgtty.h found. Cannot continue. |
| # endif |
| # endif |
| # endif |
| # endif |
| #endif |
| |
| #ifdef USE_SGTTY |
| # ifdef TIOCSBRK |
| # define CANBREAK |
| # endif |
| #endif |
| #ifdef USE_TERMIO |
| # define CANBREAK |
| #endif |
| |
| |
| |
| /* Take care of NLS matters. */ |
| #if HAVE_LOCALE_H |
| # include <locale.h> |
| #endif |
| #if !HAVE_SETLOCALE |
| # define setlocale(Category, Locale) /* empty */ |
| #endif |
| |
| #if ENABLE_NLS |
| # include <libintl.h> |
| # define _(Text) gettext (Text) |
| #else |
| # define bindtextdomain(Domain, Directory) /* empty */ |
| # define textdomain(Domain) /* empty */ |
| # define _(Text) Text |
| #endif |
| |
| #ifndef ENABLE_SYSLOG |
| # undef HAVE_SYSLOG |
| #else |
| # ifdef HAVE_SYSLOG_H |
| # include <syslog.h> |
| # else |
| # if defined(HAVE_SYS_SYSLOG_H) |
| # include <sys/syslog.h> |
| # else |
| # undef HAVE_SYSLOG |
| # endif |
| # endif |
| #endif |
| #ifndef ENABLE_SYSLOG |
| # define openlog(name,pid,facility) /* void it */ |
| # define setlogmask(x) /* void it */ |
| #else |
| extern int enable_syslog; |
| #endif |
| |
| #if defined HAVE_UNISTD_H |
| # include <unistd.h> |
| #endif |
| /* The following is from pathmax.h. */ |
| /* Non-POSIX BSD systems might have gcc's limits.h, which doesn't define |
| PATH_MAX but might cause redefinition warnings when sys/param.h is |
| later included (as on MORE/BSD 4.3). */ |
| #if defined(_POSIX_VERSION) || (defined(HAVE_LIMITS_H) && !defined(__GNUC__)) |
| # include <limits.h> |
| #endif |
| |
| #ifndef _POSIX_PATH_MAX |
| # define _POSIX_PATH_MAX 255 |
| #endif |
| |
| #if !defined(PATH_MAX) && defined(_PC_PATH_MAX) |
| # define PATH_MAX (pathconf ("/", _PC_PATH_MAX) < 1 ? 1024 : pathconf ("/", _PC_PATH_MAX)) |
| #endif |
| |
| /* Don't include sys/param.h if it already has been. */ |
| #if defined(HAVE_SYS_PARAM_H) && !defined(PATH_MAX) && !defined(MAXPATHLEN) |
| # include <sys/param.h> |
| #endif |
| |
| #if !defined(PATH_MAX) && defined(MAXPATHLEN) |
| # define PATH_MAX MAXPATHLEN |
| #endif |
| |
| #if !defined(LONG_MAX) && defined(HAVE_LIMITS_H) |
| # include <limits.h> |
| #endif |
| |
| #ifndef PATH_MAX |
| # define PATH_MAX _POSIX_PATH_MAX |
| #endif |
| |
| #ifdef __GNUC__ |
| |
| #if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ > 5) |
| # define LRZSZ_ATTRIB_SECTION(x) __attribute__((section(#x))) |
| #endif |
| |
| #if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ > 4) |
| # define LRZSZ_ATTRIB_CONST __attribute__((__const__)) |
| #endif |
| |
| /* gcc.info sagt, noreturn wäre ab 2.5 verfügbar. HPUX-gcc 2.5.8 |
| * kann es noch nicht - what's this? |
| */ |
| #if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ > 5) |
| # define LRZSZ_ATTRIB_NORET __attribute__((__noreturn__)) |
| #endif |
| |
| #if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ > 5) |
| # define LRZSZ_ATTRIB_PRINTF(formatnr,firstargnr) \ |
| __attribute__((__format__ (printf,formatnr,firstargnr))) |
| #endif |
| |
| #if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ > 6) |
| #define LRZSZ_ATTRIB_UNUSED __attribute__((__unused__)) |
| #endif |
| |
| #if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 7) |
| # define LRZSZ_ATTRIB_REGPARM(n) \ |
| __attribute__((__regparm__ (n))) |
| #endif |
| #endif /* __GNUC__ */ |
| #ifndef LRZSZ_ATTRIB_REGPARM |
| #define LRZSZ_ATTRIB_REGPARM(n) |
| #endif |
| #ifndef LRZSZ_ATTRIB_UNUSED |
| #define LRZSZ_ATTRIB_UNUSED |
| #endif |
| #ifndef LRZSZ_ATTRIB_NORET |
| #define LRZSZ_ATTRIB_NORET |
| #endif |
| #ifndef LRZSZ_ATTRIB_CONST |
| #define LRZSZ_ATTRIB_CONST |
| #endif |
| #ifndef LRZSZ_ATTRIB_PRINTF |
| #define LRZSZ_ATTRIB_PRINTF(x,y) |
| #endif |
| #ifndef LRZSZ_ATTRIB_SECTION |
| #define LRZSZ_ATTRIB_SECTION(n) |
| #endif |
| #undef LRZSZ_ATTRIB_SECTION |
| #define LRZSZ_ATTRIB_SECTION(x) |
| #undef LRZSZ_ATTRIB_REGPARM |
| #define LRZSZ_ATTRIB_REGPARM(x) |
| |
| |
| #define OK 0 |
| #define FALSE 0 |
| #define TRUE 1 |
| #define ERROR (-1) |
| |
| /* Ward Christensen / CP/M parameters - Don't change these! */ |
| #define ENQ 005 |
| #define CAN ('X'&037) |
| #define XOFF ('s'&037) |
| #define XON ('q'&037) |
| #define SOH 1 |
| #define STX 2 |
| #define EOT 4 |
| #define ACK 6 |
| #define NAK 025 |
| #define CPMEOF 032 |
| #define WANTCRC 0103 /* send C not NAK to get crc not checksum */ |
| #define WANTG 0107 /* Send G not NAK to get nonstop batch xmsn */ |
| #define TIMEOUT (-2) |
| #define RCDO (-3) |
| #define WCEOT (-10) |
| |
| #define RETRYMAX 10 |
| |
| #define UNIXFILE 0xF000 /* The S_IFMT file mask bit for stat */ |
| |
| #define DEFBYTL 2000000000L /* default rx file size */ |
| |
| enum zm_type_enum { |
| ZM_XMODEM, |
| ZM_YMODEM, |
| ZM_ZMODEM |
| }; |
| |
| struct zm_fileinfo { |
| char *fname; |
| time_t modtime; |
| mode_t mode; |
| size_t bytes_total; |
| size_t bytes_sent; |
| size_t bytes_received; |
| size_t bytes_skipped; /* crash recovery */ |
| int eof_seen; |
| }; |
| |
| #define R_BYTESLEFT(x) ((x)->bytes_total-(x)->bytes_received) |
| |
| extern enum zm_type_enum protocol; |
| |
| extern const char *program_name; /* the name by which we were called */ |
| extern int Verbose; |
| extern int errors; |
| extern int no_timeout; |
| extern int Zctlesc; /* Encode control characters */ |
| extern int under_rsh; |
| |
| RETSIGTYPE bibi __P ((int n)); |
| |
| #define sendline(c) putchar((c) & 0377) |
| #define xsendline(c) putchar(c) |
| |
| /* zreadline.c */ |
| extern char *readline_ptr; /* pointer for removing chars from linbuf */ |
| extern int readline_left; /* number of buffered chars left to read */ |
| #define READLINE_PF(timeout) \ |
| (--readline_left >= 0? (*readline_ptr++ & 0377) : readline_internal(timeout)) |
| |
| int readline_internal __P ((unsigned int timeout)); |
| void readline_purge __P ((void)); |
| void readline_setup __P ((int fd, size_t readnum, |
| size_t buffer_size)) LRZSZ_ATTRIB_SECTION(lrzsz_rare); |
| |
| |
| /* rbsb.c */ |
| extern int Fromcu; |
| extern int Twostop; |
| #ifdef READCHECK_READS |
| extern unsigned char checked; |
| #endif |
| extern int iofd; |
| extern unsigned Baudrate; |
| |
| void zperr __P ((const char *fmt, ...)); |
| void zpfatal __P ((const char *fmt, ...)); |
| void vfile __P ((const char *format, ...)); |
| #define vchar(x) putc(x,stderr) |
| #define vstring(x) fputs(x,stderr) |
| |
| #ifdef __GNUC__ |
| #if __GNUC__ > 1 |
| #define vstringf(format,args...) fprintf(stderr,format, ##args) |
| #endif |
| #endif |
| #ifndef vstringf |
| void vstringf __P ((const char *format, ...)); |
| #endif |
| #define VPRINTF(level,format_args) do {if ((Verbose)>=(level)) \ |
| vstringf format_args ; } while(0) |
| |
| /* rbsb.c */ |
| int from_cu __P ((void)) LRZSZ_ATTRIB_SECTION(lrzsz_rare); |
| int rdchk __P ((int fd)); |
| int io_mode __P ((int fd, int n)) LRZSZ_ATTRIB_SECTION(lrzsz_rare); |
| void sendbrk __P ((int fd)); |
| #define flushmo() fflush(stdout) |
| void purgeline __P ((int fd)); |
| void canit __P ((int fd)); |
| |
| |
| /* crctab.c */ |
| extern unsigned short crctab[256]; |
| #define updcrc(cp, crc) ( crctab[((crc >> 8) & 255)] ^ (crc << 8) ^ cp) |
| extern long cr3tab[]; |
| #define UPDC32(b, c) (cr3tab[((int)c ^ b) & 0xff] ^ ((c >> 8) & 0x00FFFFFF)) |
| |
| /* zm.c */ |
| #include "zmodem.h" |
| extern unsigned int Rxtimeout; /* Tenths of seconds to wait for something */ |
| extern int bytes_per_error; /* generate one error around every x bytes */ |
| |
| /* Globals used by ZMODEM functions */ |
| extern int Rxframeind; /* ZBIN ZBIN32, or ZHEX type of frame received */ |
| extern int Rxtype; /* Type of header received */ |
| extern int Zrwindow; /* RX window size (controls garbage count) */ |
| /* extern int Rxcount; */ /* Count of data bytes received */ |
| extern char Rxhdr[4]; /* Received header */ |
| extern char Txhdr[4]; /* Transmitted header */ |
| extern long Txpos; /* Transmitted file position */ |
| extern int Txfcs32; /* TURE means send binary frames with 32 bit FCS */ |
| extern int Crc32t; /* Display flag indicating 32 bit CRC being sent */ |
| extern int Crc32; /* Display flag indicating 32 bit CRC being received */ |
| extern int Znulls; /* Number of nulls to send at beginning of ZDATA hdr */ |
| extern char Attn[ZATTNLEN+1]; /* Attention string rx sends to tx on err */ |
| |
| extern void zsendline __P ((int c)); |
| extern void zsendline_init __P ((void)) LRZSZ_ATTRIB_SECTION(lrzsz_rare); |
| void zsbhdr __P ((int type, char *hdr)); |
| void zshhdr __P ((int type, char *hdr)); |
| void zsdata __P ((const char *buf, size_t length, int frameend)); |
| void zsda32 __P ((const char *buf, size_t length, int frameend)); |
| int zrdata __P ((char *buf, int length, size_t *received)); |
| int zgethdr __P ((char *hdr, int eflag, size_t *)); |
| void stohdr __P ((size_t pos)) LRZSZ_ATTRIB_REGPARM(1); |
| long rclhdr __P ((char *hdr)) LRZSZ_ATTRIB_REGPARM(1); |
| |
| int tcp_server __P ((char *buf)) LRZSZ_ATTRIB_SECTION(lrzsz_rare); |
| int tcp_connect __P ((char *buf)) LRZSZ_ATTRIB_SECTION(lrzsz_rare); |
| int tcp_accept __P ((int d)) LRZSZ_ATTRIB_SECTION(lrzsz_rare); |
| |
| |
| const char * protname __P ((void)) LRZSZ_ATTRIB_SECTION(lrzsz_rare); |
| void lsyslog __P ((int, const char *,...)); |
| |
| |
| |
| |
| #endif |