#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 #ifdef __GNUC__ # define alloca __builtin_alloca # define HAVE_ALLOCA 1 #else # if defined HAVE_ALLOCA_H || defined _LIBC # include # 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 #else #include #endif #ifdef TIME_WITH_SYS_TIME # include # include # define INCLUDED_SYS_TIME #else # ifdef HAVE_SYS_TIME_H # include # define INCLUDED_SYS_TIME # else # include # 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 #endif #ifdef __BEOS__ /* BeOS 4.0: sys/select.h is almost completely #ifdefd out */ #define HAVE_SOCKET_H #ifdef HAVE_SOCKET_H #include #endif #endif #if STDC_HEADERS # include #else # ifdef HAVE_STRINGS_H # include # 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 /* we need to decide whether readcheck is possible */ #ifdef HAVE_FCNTL_H # include #endif #ifdef HAVE_SYS_IOCTL_H # include #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 # define USE_TERMIOS #else # if defined(HAVE_SYS_TERMIOS_H) # include # define USE_TERMIOS # else # if defined(HAVE_TERMIO_H) # include # define USE_TERMIO # else # if defined(HAVE_SYS_TERMIO_H) # include # define USE_TERMIO # else # if defined(HAVE_SGTTY_H) # include # 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 #endif #if !HAVE_SETLOCALE # define setlocale(Category, Locale) /* empty */ #endif #if ENABLE_NLS # include # 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 # else # if defined(HAVE_SYS_SYSLOG_H) # include # 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 #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 #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 #endif #if !defined(PATH_MAX) && defined(MAXPATHLEN) # define PATH_MAX MAXPATHLEN #endif #if !defined(LONG_MAX) && defined(HAVE_LIMITS_H) # include #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