/* afio.h defines for afio. */
#ifdef HAVE_PARAM_H
#include <sys/param.h>
#endif
#ifdef SYSTIME
#include <sys/time.h>
#else /* SYSTIME */
#include <time.h>
#endif /* SYSTIME */
#ifdef CTC3B2
#include <sys/vtoc.h>
#include <sys/ct.h>
#endif /* CTC3B2 */
#ifdef MYTEMPNAM
#include <sys/file.h>
#endif
#ifdef USESHMEM
#include <sys/ipc.h>
#include <sys/shm.h>
#define NUMSHKEYS 20
#define SHMEMSIZE 262144 /* 2^18 (dev3b1) */
#endif
/* done writing to the archive */
#define FALSE 0
#define TRUE 1
#define NOTDONE 0
#define DONE 1
#define NODIE 0
#define DIE 1
/* Note for porters: see the PORTING file if your compiler
does not support unsigned long long.
*/
typedef unsigned long long ulonglong;
/* KH */
#define MEMFD 10000
#define ZIPFD 10001
extern int zipfdfd;
/* flags for the st_rdev field of regular files */
/* file is not compressed, ignore any .z extension */
#define RDEV_NOTCOMPR 1
/* file is a control file */
#define RDEV_ISCONTROL 2
/*
An archive entry is a control file if it is a regular file and
if the ISCONTROL flag is set. The filename is not important.
*/
#define ISCONTROL(sb) ((((sb)->sb_mode & S_IFMT) == S_IFREG)&&((sb)->sb_rdev & RDEV_ISCONTROL))
/* pseudo filename for control files */
#define CONTROLNAME "CONTROL_FILE"
/* label value if no label given */
#define NOLABEL "no_label"
/*
* Address link information base.
*/
#define linkhash(ino) \
(linkbase + ((ino) & 0xffff) % nel(linkbase))
/*
* Mininum value.
*/
#define min(one, two) \
(one < two ? one : two)
/*
* Number of array elements.
*/
#define nel(a) \
(sizeof(a) / sizeof(*(a)))
/*
* Remove a file or directory.
*/
#define afremove(name, asb) \
(((asb)->sb_mode & S_IFMT) == S_IFDIR ? rmdir(name) : unlink(name))
/*
* Swap bytes.
*/
#define swab(n) \
((((unsigned short)(n) >> 8) & 0xff) | (((unsigned short)(n) << 8) & 0xff00))
/*
* Cast and reduce to unsigned short.
*/
#define ush(n) \
(((unsigned short) (n)) & 0177777)
#define ulo(n) \
(((unsigned long) (n)) & 0xFFFFFFFFL)
#define ull(n) \
(((unsigned long long) (n)) & 0xFFFFFFFFFFFFFFFFLL)
/* 1234567890123456 */
/*
* Definitions.
*/
#define reg register /* Convenience */
#define uint unsigned int /* Not always in types.h */
#define ushort unsigned short /* Not always in types.h */
#define BLOCK 5120 /* Default archive block size */
#define FSBUF (8*1024) /* Filesystem buffer size */
#define H_COUNT 10 /* Number of items in ASCII header */
/* binary format */
#define M_BINARY 070707 /* Binary magic number */
#define M_STRLEN 6 /* ASCII magic number length */
/* (old) ASCII format */
#define H_STRLEN 70 /* old ASCII header string length */
#define M_ASCII "070707" /* old ASCII magic number */
#define H_PRINT "%06o%06o%06o%06o%06o%06o%06o%011lo%06o%011lo"
/* H_SCAN is obsolete, replaced by PH_SCAN to be more portable. */
#define H_SCAN "%6ho%6ho%6ho%6ho%6ho%6ho%6ho%11lo%6o%11lo"
#define PH_SCAN "%6lo%6lo%6lo%6lo%6lo%6lo%6lo%11lo%6o%11lo"
/*
Below is a handy piece of ASCII art which can be used to decode old
ASCII format headers.
|23456|23456|23456|23456|23456|23456|23456|23456|23456789ab|23456|23456789ab|-
| hdr| dev| ino| mode| uid| gid|nlink| rdev| mtime|nmlen| size|n
*/
/* extended ASCII format */
#define H_STRLEN2 75 /* extended ASCII header string length */
#define M_ASCII2 "070717" /* extended ASCII magic number */
#define H_PRINT2 "%06o%011lo%06o%06o%06o%06o%06o%011lo%06o%011lo"
#define PH_SCAN2 "%6lo%11lo%6lo%6lo%6lo%6lo%6lo%11lo%6o%11lo"
/*
Below is a handy piece of ASCII art which can be used to decode large
ASCII format headers.
|23456|2345678|234567890123456m|23456|2345678|2345678|2345678|2345678|234567890123456n|234|234|234s|234567890123456:|-
| hdr| dev| inoM| mod| uid| gid| nlink| rdev| mtimeN|nml|flg|xszS| size:|n
*/
/* large ASCII format */
#define H_STRLEN3 110 /* large ASCII string length */
#define M_ASCII3 "070727" /* large ASCII magic number */
#define H_COUNT3 12
#define H_PRINT3 "%08lX%016llXm%06lo%08lX%08lX%08lX%08lX%016llXn%04X%04X%04Xs%016llX:"
#define PH_SCAN3 "%8lX%16llXm%6lo%8lX%8lX%8lX%8llX%16llXn%4X%4X%4Xs%16llX:"
typedef struct {
long unsigned int PSt_dev;
long unsigned int PSt_ino;
long unsigned int PSt_mode;
long unsigned int PSt_uid;
long unsigned int PSt_gid;
long unsigned int PSt_nlink;
long unsigned int PSt_rdev;
long unsigned int PSt_mtime;
long unsigned int PSt_size;
} PStat;
typedef struct {
long unsigned int PSt_dev;
unsigned long long PSt_ino;
long unsigned int PSt_mode;
long unsigned int PSt_uid;
long unsigned int PSt_gid;
long unsigned int PSt_nlink;
unsigned long long PSt_rdev;
unsigned long long PSt_mtime;
unsigned long long PSt_size;
} PHStat;
#define NULLDEV -1 /* Null device code */
#define NULLINO 0 /* Null inode number */
#define PATHELEM 256 /* Pathname element count limit */
#define PATHSIZE 1024 /* Pathname length limit */
#define S_IFSHF 12 /* File type shift (shb in stat.h) */
#define S_IPERM 07777 /* File permission bits (shb in stat.h) */
#define S_IPEXE 07000 /* Special execution bits (shb in stat.h) */
#define S_IPOPN 0777 /* Open access bits (shb in stat.h) */
#define STDIN 0 /* Standard input file descriptor */
#define STDOUT 1 /* Standard output file descriptor */
#define TTY "/dev/tty" /* For volume-change queries */
/* the three flags below are used in the match.c code, they allow us
to store 3 types of patterns in a single `all patterns' linked
list. (the use of a single list is for historical reasons, it is
not the most ovbious design for the current needs)
*/
#define PATTYPE_MATCH 0
#define PATTYPE_NOMATCH 1
#define PATTYPE_EXT 2
#ifndef PRG_COMPRESS
#define PRG_COMPRESS "compress"
#endif
/*
* Some versions of the portable "C" compiler (PCC) can't handle
* pointers to functions returning void.
*/
#ifdef VOIDFIX
#define VOIDFN void /* Expect "void (*fnptr)()" to work */
#else /* VOIDFIX */
#define VOIDFN int /* Avoid PCC "void (*fnptr)()" bug */
#endif /* VOIDFIX */
/*
* Trailer pathnames. All must be of the same length.
*/
#define TRAILER "TRAILER!!!" /* Archive trailer (cpio compatible) */
#define TRAILZ 11 /* Trailer pathname length (including null) */
/*
* Open modes; there is no <fcntl.h> with v7 UNIX.
*/
#ifdef HAVEFCNTL
#include <fcntl.h>
#else
#define O_RDONLY 0 /* Read-only */
#define O_WRONLY 1 /* Write-only */
#define O_RDWR 2 /* Read/write */
#endif
/*
* V7 and BSD UNIX use old-fashioned names for a couple of
* string functions.
*/
#ifdef INDEX
#define strchr index /* Forward character search */
#define strrchr rindex /* Reverse character search */
#endif /* INDEX */
/*
* Some compilers can't handle void casts.
*/
#ifdef NOVOID
#define VOID /* Omit void casts */
#else /* NOVOID */
#define VOID (void) /* Quiet lint about ignored return values */
#endif /* NOVOID */
/*
* Adb is more palatable when static functions and variables are
* declared as globals. Lint gives more useful information when
* statics are truly static.
*/
#ifdef lint
#define STATIC static /* Declare static variables for lint */
#else /* lint */
#define STATIC /* Make static variables global for adb */
#endif /* lint */
/*
* Simple types.
*/
typedef struct group Group; /* Structure for getgrgid(3) */
typedef struct passwd Passwd; /* Structure for getpwuid(3) */
typedef struct tm Time; /* Structure for localtime(3) */
#ifdef S_IFLNK
/*
* File status with symbolic links. Kludged to hold symbolic
* link pathname within structure.
*/
typedef struct
{
struct stat sb_stat;
char sb_link[PATHSIZE];
ino_t ino_orig; /* used in -o mode to support -ovv */
} Stat;
#define STAT(name, asb) stat(name, &(asb)->sb_stat)
#define FSTAT(fd, asb) fstat(fd, &(asb)->sb_stat)
#define LSTAT(name, asb) lstat(name, &(asb)->sb_stat)
#define sb_dev sb_stat.st_dev
#define sb_ino sb_stat.st_ino
#define sb_mode sb_stat.st_mode
#define sb_nlink sb_stat.st_nlink
#define sb_uid sb_stat.st_uid
#define sb_gid sb_stat.st_gid
#define sb_rdev sb_stat.st_rdev
#define sb_size sb_stat.st_size
#define sb_atime sb_stat.st_atime
#define sb_mtime sb_stat.st_mtime
#define sb_ctime sb_stat.st_ctime
#define sb_blksize sb_stat.st_blksize
#define sb_blocks sb_stat.st_blocks
#else /* !S_IFLNK */
/*
* File status without symbolic links.
*/
typedef struct stat Stat;
#define STAT(name, asb) stat(name, asb)
#define FSTAT(fd, asb) fstat(fd, asb)
#define LSTAT(name, asb) stat(name, asb)
#define sb_dev st_dev
#define sb_ino st_ino
#define sb_mode st_mode
#define sb_nlink st_nlink
#define sb_uid st_uid
#define sb_gid st_gid
#define sb_rdev st_rdev
#define sb_size st_size
#define sb_atime st_atime
#define sb_mtime st_mtime
#define sb_ctime st_ctime
#endif /* !S_IFLNK */
/*
* Binary archive header (obsolete).
*/
typedef struct
{
short b_dev; /* Device code */
ushort b_ino; /* Inode number */
ushort b_mode; /* Type and permissions */
ushort b_uid; /* Owner */
ushort b_gid; /* Group */
short b_nlink; /* Number of links */
short b_rdev; /* Real device */
ushort b_mtime[2]; /* Modification time (hi/lo) */
ushort b_name; /* Length of pathname (with null) */
ushort b_size[2]; /* Length of data */
} Binary;
/*
* Child process structure.
*/
typedef struct child
{
struct child *c_forw; /* Forward link */
int c_pid; /* Process ID */
int c_flags; /* Flags (CF_) */
int c_status; /* Exit status */
} Child;
/*
* Child process flags (c_flags).
*/
#define CF_EXIT (1<<0) /* Exited */
/*
* Hard link sources. One or more are chained from each link
* structure.
*/
typedef struct name
{
struct name *p_forw; /* Forward chain (terminated) */
struct name *p_back; /* Backward chain (circular) */
char *p_name; /* Pathname to link from */
} Path;
/*
* File linking information. One entry exists for each unique
* file with with outstanding hard links.
*/
typedef struct link
{
struct link *l_forw; /* Forward chain (terminated) */
struct link *l_back; /* Backward chain (terminated) */
dev_t l_dev; /* Device */
ino_t l_ino; /* Inode */
ino_t l_ino_ar; /* Inode nr we will put in the archive */
ushort l_nlink; /* Unresolved link count */
time_t l_mtime; /* Modification time */
ushort l_mode; /* mode */
off_t l_size; /* Length */
Path *l_path; /* Pathname(s) to link from */
} Link;
/*
* Directory information. One entry exists for each directory
* in order to update it with the correct timestamps.
*/
typedef struct dir
{
struct dir *d_forw; /* Forward chain (terminated) */
time_t d_mtime; /* Modification time */
char *d_name; /* Pathname of directory */
} Dir;
/*
* Internal functions.
*/
VOIDFN copyin (char **);
VOIDFN copyout (char **);
void compressfile (int *, char *, Stat *, int *);
int dirchg (char *, char *);
int dirmake (char *, Stat *);
int dirneed (char *);
void fatal (char *,char *);
void goodbye (int);
VOIDFN in (char **);
void inalloc (uint);
int inascii (char *, char *, Stat *);
int inascii2 (char *, char *, Stat *);
int inascii3 (char *, char *, Stat *);
int inavail (char **, uint*);
int inbinary (char *, char *, Stat *);
int indata (int, off_t, char*);
int inentry (char *, Stat *);
int infill (void);
int inhead (char *, Stat *);
int inread (char *, uint);
int inskip (off_t);
int inswab (char *, char *, Stat *);
int lineget (FILE *, char *, int);
void linkalso (Link *, char * );
Link *linkfrom (Stat *, int);
void linkleft (void);
Link *linkto (char *, Stat *);
#ifndef MEMCPY
char *memcpy (char *, char *, uint);
#endif
char *memget (uint);
char *memstr (char *);
#ifndef MKDIR
int mkdir (char *, ushort);
#endif
void nameadd (char *, int);
int namecmp (char *, Stat *);
int namecmp_ext (char *);
int nameopt (char *);
void next (int, char *);
void nextask (char *, char *, int);
void nextclos (void );
int nextopen (int);
int openin (char *, char *, Stat *, int *);
int openotty (char *, Stat *, Link *, int, int);
int openqtty (void);
int options (int, char **, char *);
VOIDFN out (char **);
void outalloc (uint);
uint outavail (char **);
int outdata (int, char*, off_t);
void outdatazip (int, char*, off_t); /* added KH */
void waitforgzip(void); /* added KH */
void outdatamem (char *, off_t); /* added KH */
void memreset(void); /* added KH */
int memread(char *buf,int count); /* added KH */
void memfree(void); /* added KH */
int nameaddfile(char *, int); /* added KH */
void outeof (char *, uint);
void outflush (int);
void outhead (char *, Stat *);
void outhead2 (char *, Stat *);
void outhead3 (char *, Stat *);
void outpad (off_t);
void outwait (void);
void outwrite (char *,uint);
VOIDFN pass (char **);
void passdata (char *, int, char*, int);
int passitem (char *, Stat *,int, char**);
int pipechld (int, int *);
int pipeopen (int );
void pipewait (void);
void prsize (FILE *, ulonglong);
VOIDFN readcheck (char **);
#ifndef MKDIR
int rmdir (char *);
#endif
#if !defined (linux) && !defined(__FreeBSD__) && !defined(sun)
VOIDFN (*signal ())();
#endif
int fswrite (int, char*, uint);
char *syserr (void);
VOIDFN toc (char **);
void tocentry (char *, Stat *);
void tocmode (mode_t);
void usage (void);
void verify (int);
int warn (char *, char *);
int warn_nocount (char*, char *);
int warnarch (char *, off_t);
int writedisk (int);
int xfork (char *, int);
void xpause (void);
int xwait (int, char *, int);
void mail(char *who,int vol,char *archive);
int writeall(int, const char*, unsigned int);
int incheckentry(char *, Stat *);
int incheckdata (int fd, off_t size, char *name, Stat *asb, int comp);
Link * linkinode16 (dev_t dev, ino_t ino);
int opencontrolscript (char *name);
int openincheck(char *, Stat *, int *,int);
void mayberewind(void);
extern void add_arg(char *arg);
extern char *compress_arg_list[];
extern short lflag;
extern short hflag;
extern int gzipfactor;
extern off_t maxmem;
extern long compthreshold;
extern int ignoreslash;
extern short Zflag;
extern int arfd;
extern int extcasesens;
extern int forceZflag;
extern char *compressprog;
extern int compressargs;
extern int rewindfd;
extern char *ignorewarnings;
extern int readcompexts(char*);
ulonglong optsize (char *);
void update_aruntil(void);
extern ulonglong maxsizetocompress;
syntax highlighted by Code2HTML, v. 0.9.1