/* @(#)table.c 1.16 02/05/09 Copyright 1994 J. Schilling */
#ifndef lint
static char sccsid[] =
"@(#)table.c 1.16 02/05/09 Copyright 1994 J. Schilling";
#endif
/*
* Conversion tables for efficient conversion
* of different file type representations
*
* Copyright (c) 1994 J. Schilling
*/
/*
* 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; see the file COPYING. If not, write to
* the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
*/
#include <mconfig.h>
#include "star.h"
#include "table.h"
#include <statdefs.h>
#ifndef S_IFIFO /* If system knows no fifo's */
#define S_IFIFO S_IFREG /* Map fifo's to regular files */
#endif
#ifndef S_IFCHR /* If system knows no character special */
#define S_IFCHR S_IFREG /* Map character spec. to regular files */
#endif
#ifndef S_IFMPC /* If system knows no multiplexed c */
#define S_IFMPC S_IFREG /* Map multiplexed c to regular files */
#endif
#ifndef S_IFNAM /* If system knows no named files */
#define S_IFNAM S_IFREG /* Map named files to regular files */
#endif
#ifndef S_IFBLK /* If system knows no block special */
#define S_IFBLK S_IFREG /* Map block spec. to regular files */
#endif
#ifndef S_IFMPB /* If system knows no multiplexed b */
#define S_IFMPB S_IFREG /* Map multiplexed b to regular files */
#endif
#ifndef S_IFCNT /* If system knows no contiguous files */
#define S_IFCNT S_IFREG /* Map contiguous file to regular files */
#endif
#ifndef S_IFLNK /* If system knows no symbolic links */
#define S_IFLNK S_IFREG /* Map symbolic links to regular files */
#endif
#ifndef S_IFSOCK /* If system knows no fifo's */
#define S_IFSOCK S_IFREG /* Map fifo's to regular files */
#endif
#ifndef S_IFDOOR /* If system knows no door's */
#define S_IFDOOR S_IFREG /* Map door's to regular files */
#endif
#ifndef S_IFWHT /* If system knows no whiteout's */
#define S_IFWHT S_IFREG /* Map whiteout's to regular files */
#endif
#ifndef S_IFEVC /* If system knows no eventcount's */
#define S_IFEVC S_IFREG /* Map eventcount's to regular files */
#endif
#define S_IFBAD S_IFMT /* XXX Have to use another val if someone */
/* XXX starts to use S_IFMT for a */
/* XXX useful file type */
#define XT_NAM XT_BAD /* XXX JS has not seen it yet */
/* XXX if we use it, we have to change */
/* XXX table.h and some of the tables below */
/*
* UNIX File type to XT_ table
*
* Maps the 16 UNIX (S_XXX >> 12) filetypes to star's internal XT_ types.
* Note that this only works if all S_XXX defines are the same on all
* UNIX versions. Fortunately, this is currently the case and there is no
* big chance that somebody will do it differently.
*
* XXX If really somebody creates a different OS we will need to change this
* XXX table and the associated macros or make this table dynamically
* XXX created at startup of star.
*
* UNIX file types (see table.h):
* 0 Unallocated 1 FIFO 2 Chr special 3 MPX chr
* 4 Directory 5 NAM special 6 BLK special 7 MPX blk
* 8 Regular File 9 Contig File 10 Symlink 11 Sol Shadow ino
* 12 Socket 13 DOOR special 14 Whiteout 15 UNOS event count
*
* No bound checking in hope that S_IFMT will never hold more than 4 bits.
*/
char iftoxt_tab[] = {
/* 0 */ XT_NONE, XT_FIFO, XT_CHR, XT_MPC,
/* 4 */ XT_DIR, XT_NAM, XT_BLK, XT_MPB,
/* 8 */ XT_FILE, XT_CONT, XT_SLINK, XT_BAD,
/*12 */ XT_SOCK, XT_DOOR, XT_WHT, XT_BAD,
};
/*
* Ustar File type to XT_ table
*
* Maps the ustar 0..7 filetypes to star's internal XT_ types.
* Bound checking is done via ustoxt().
*/
char ustoxt_tab[] = {
/* 0 */ XT_FILE, XT_LINK, XT_SLINK, XT_CHR,
/* 4 */ XT_BLK, XT_DIR, XT_FIFO, XT_CONT,
/* 8 */ XT_BAD, XT_BAD,
};
/*
* Vendor unique File type to XT_ table
*
* Maps the filetypes 'A'..'Z' to star's internal XT_ types.
* Fortunately, the different vendor unique extensions are disjunct.
* External code does bound checking.
*/
char vttoxt_tab[] = {
/* A */ XT_NONE, XT_NONE, XT_NONE, XT_DUMPDIR,
/* E */ XT_NONE, XT_NONE, XT_NONE, XT_NONE,
/* I */ XT_META, XT_NONE, XT_LONGLINK, XT_LONGNAME,
/* M */ XT_MULTIVOL, XT_NAMES, XT_NONE, XT_NONE,
/* Q */ XT_NONE, XT_NONE, XT_SPARSE, XT_NONE,
/* U */ XT_NONE, XT_VOLHDR, XT_NONE, XT_NONE,
/* Y */ XT_NONE, XT_NONE,
};
/*
* XT_* codes used (see table.h):
* 0..16 Real file types and hard links
* 20..26 Speudo file types (POSIX 'A' .. 'Z'
* 31 XT_BAD (illegal file type)
*/
/*
* XT_ to UNIX File type table
*
* XT_SPARSE and XT_META are just other (tar specific) views of regular files.
*/
int xttoif_tab[] = {
/* 0 */ 0, S_IFREG, S_IFCNT, S_IFREG,
/* 4 */ S_IFLNK, S_IFDIR, S_IFCHR, S_IFBLK,
/* 8 */ S_IFIFO, S_IFSOCK, S_IFMPC, S_IFMPB,
/*12 */ S_IFNAM, S_IFNAM, S_IFDOOR, S_IFEVC,
/*16 */ S_IFWHT, S_IFBAD, S_IFBAD, S_IFBAD,
/*20 */ S_IFDIR, S_IFBAD, S_IFBAD, S_IFBAD,
/*24 */ S_IFBAD, S_IFREG, S_IFBAD, S_IFREG,
/*28 */ S_IFBAD, S_IFBAD, S_IFBAD, S_IFBAD,
};
/*
* XT_ to Star-1985 File type table
*/
char xttost_tab[] = {
/* 0 */ 0, F_FILE, F_FILE, F_FILE,
/* 4 */ F_SLINK, F_DIR, F_SPEC, F_SPEC,
/* 8 */ F_SPEC, F_SPEC, F_SPEC, F_SPEC,
/*12 */ F_SPEC, F_SPEC, F_SPEC, F_SPEC,
/*16 */ F_SPEC, F_SPEC, F_SPEC, F_SPEC,
/*20 */ F_DIR, F_FILE, F_FILE, F_FILE,
/*24 */ F_FILE, F_FILE, F_SPEC, F_FILE,
/*28 */ F_SPEC, F_SPEC, F_SPEC, F_SPEC,
};
/*
* XT_ Old tar supported File type table
*/
char xttar_tab[] = {
/* 0 */ 0, 1, 1, 1,
/* 4 */ 1, 1, 0, 0,
/* 8 */ 0, 0, 0, 0,
/*12 */ 0, 0, 0, 0,
/*16 */ 0, 0, 0, 0,
/*20 */ 0, 0, 0, 0,
/*24 */ 0, 0, 0, 0,
/*28 */ 0, 0, 0, 0,
};
/*
* XT_ Star-1985 supported File type table
*/
char xtstar_tab[] = {
/* 0 */ 0, 1, 1, 1,
/* 4 */ 1, 1, 1, 1,
/* 8 */ 1, 1, 1, 1,
/*12 */ 1, 1, 1, 0,
/*16 */ 0, 0, 0, 0,
/*20 */ 0, 0, 0, 0,
/*24 */ 0, 1, 0, 1,
/*28 */ 0, 0, 0, 0,
};
/*
* XT_ Ustar-1988 supported File type table
*/
char xtustar_tab[] = {
/* 0 */ 0, 1, 1, 1,
/* 4 */ 1, 1, 1, 1,
/* 8 */ 1, 0, 0, 0,
/*12 */ 0, 0, 0, 0,
/*16 */ 0, 0, 0, 0,
/*20 */ 0, 0, 0, 0,
/*24 */ 0, 0, 0, 0,
/*28 */ 0, 0, 0, 0,
};
/*
* XT_ Extended PAX-2001 'exustar' supported File type table
*/
char xtexustar_tab[] = {
/* 0 */ 0, 1, 1, 1,
/* 4 */ 1, 1, 1, 1,
/* 8 */ 1, 1, 0, 0,
/*12 */ 0, 0, 1, 0,
/*16 */ 0, 0, 0, 0,
/*20 */ 0, 0, 0, 0,
/*24 */ 0, 1, 0, 1,
/*28 */ 0, 0, 0, 0,
};
/*
* XT_ to Ustar (including Vendor Unique extensions) File type table
*
* sockets cannot be handled in ansi tar, they are handled as regular files :-(
*/
char xttous_tab[] = {
/* 0 */ 0, REGTYPE, CONTTYPE, LNKTYPE,
/* 4 */ SYMTYPE, DIRTYPE, CHRTYPE, BLKTYPE,
/* 8 */ FIFOTYPE,REGTYPE/* socket */, 0/* bad */, 0/* bad */,
/*12 */ 0, 0, 0, 0,
/*16 */ 0, 0, 0, 0,
/*20 */ LF_DUMPDIR, LF_LONGLINK, LF_LONGNAME, LF_MULTIVOL,
/*24 */ LF_NAMES, LF_SPARSE, LF_VOLHDR, LF_META,
/*28 */ 0, 0, 0, 0,
};
/*
* XT_ to String table
*/
char *xttostr_tab[] = {
#define XT_DEBUG
#ifdef XT_DEBUG
/* 0 */ "U", "-", "C", "H",
#else
/* 0 */ "-", "-", "-", "-",
#endif
/* 4 */ "l", "d", "c", "b",
/* 8 */ "p", "s", "~", "~",
/*12 */ "~", "~", "D", "~",
/*16 */ "%", "~", "~", "~",
/*20 */ "D", "K", "L", "M",
#ifdef XT_DEBUG
/*24 */ "N", "S", "V", "m",
#else
/*24 */ "N", "-", "V", "-",
#endif
/*28 */ "~", "~", "~", "~",
};
/*
* XT_ to named file type text
*/
char *xttoname_tab[] = {
/* 0 */ "unallocated", "regular", "contiguous", "hardlink",
/* 4 */ "symlink", "directory", "character special", "block special",
/* 8 */ "fifo", "socket", "mpx character special","mpx block special",
/*12 */ "XENIX nsem", "XENIX nshd", "door", "eventcount",
/*16 */ "whiteout", "reserved", "reserved", "reserved",
/*20 */ "dumpdir", "longlink", "longname", "multivol continuation",
/*24 */ "names", "sparse", "volheader", "meta",
/*28 */ "reserved", "reserved", "reserved", "unknown/bad",
};
syntax highlighted by Code2HTML, v. 0.9.1