diff options
author | toma <toma@283d02a7-25f6-0310-bc7c-ecb5cbfe19da> | 2009-11-25 17:56:58 +0000 |
---|---|---|
committer | toma <toma@283d02a7-25f6-0310-bc7c-ecb5cbfe19da> | 2009-11-25 17:56:58 +0000 |
commit | 37333bf25ad9a4c538250f5af2f9f1d666362883 (patch) | |
tree | c45e8df5b9efbffe07eb3d9340df7811c7e16943 /kdat/TarParser.h | |
download | tdeadmin-37333bf25ad9a4c538250f5af2f9f1d666362883.tar.gz tdeadmin-37333bf25ad9a4c538250f5af2f9f1d666362883.zip |
Copy the KDE 3.5 branch to branches/trinity for new KDE 3.5 features.
BUG:215923
git-svn-id: svn://anonsvn.kde.org/home/kde/branches/trinity/kdeadmin@1054174 283d02a7-25f6-0310-bc7c-ecb5cbfe19da
Diffstat (limited to 'kdat/TarParser.h')
-rw-r--r-- | kdat/TarParser.h | 207 |
1 files changed, 207 insertions, 0 deletions
diff --git a/kdat/TarParser.h b/kdat/TarParser.h new file mode 100644 index 0000000..b43fd35 --- /dev/null +++ b/kdat/TarParser.h @@ -0,0 +1,207 @@ +// KDat - a tar-based DAT archiver +// Copyright (C) 1998-2000 Sean Vyain, svyain@mail.tds.net +// Copyright (C) 2001-2002 Lawrence Widman, kdat@cardiothink.com +// +// 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 of the License, 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + +#ifndef _TarParser_h_ +#define _TarParser_h_ + +#include <qobject.h> + +/* Standard Archive Format - Standard TAR - USTAR. */ + +/* Header block on tape. + + We use traditional DP naming conventions here. A "block" is a big chunk + of stuff that we do I/O on. A "record" is a piece of info that we care + about. Typically many "record"s fit into a "block". */ + +#define RECORDSIZE 512 +#define NAMSIZ 100 +#define TUNMLEN 32 +#define TGNMLEN 32 +#define SPARSE_EXT_HDR 21 +#define SPARSE_IN_HDR 4 + +struct sparse +{ + char offset[12]; + char numbytes[12]; +}; + +union record +{ + char charptr[RECORDSIZE]; + + struct header + { + char arch_name[NAMSIZ]; + char mode[8]; + char uid[8]; + char gid[8]; + char size[12]; + char mtime[12]; + char chksum[8]; + char linkflag; + char arch_linkname[NAMSIZ]; + char magic[8]; + char uname[TUNMLEN]; + char gname[TGNMLEN]; + char devmajor[8]; + char devminor[8]; + + /* The following fields were added for GNU and are not standard. */ + + char atime[12]; + char ctime[12]; + char offset[12]; + char longnames[4]; + /* Some compilers would insert the pad themselves, so pad was + once autoconfigured. It is simpler to always insert it! */ + char pad; + struct sparse sp[SPARSE_IN_HDR]; + char isextended; + char realsize[12]; /* true size of the sparse file */ +#if 0 + char ending_blanks[12]; /* number of nulls at the end of the file, + if any */ +#endif + } + header; + + struct extended_header + { + struct sparse sp[21]; + char isextended; + } + ext_hdr; +}; + +/* The checksum field is filled with this while the checksum is computed. */ +#define CHKBLANKS " " /* 8 blanks, no null */ + +/* The magic field is filled with this value if uname and gname are valid, + marking the archive as being in standard POSIX format (though GNU tar + itself is not POSIX conforming). */ +#define TMAGIC "ustar " /* 7 chars and a null */ + +/* The magic field is filled with this if this is a GNU format dump entry. + But I suspect this is not true anymore. */ +#define GNUMAGIC "GNUtar " /* 7 chars and a null */ + +/* The linkflag defines the type of file. */ +#define LF_OLDNORMAL '\0' /* normal disk file, Unix compat */ +#define LF_NORMAL '0' /* normal disk file */ +#define LF_LINK '1' /* link to previously dumped file */ +#define LF_SYMLINK '2' /* symbolic link */ +#define LF_CHR '3' /* character special file */ +#define LF_BLK '4' /* block special file */ +#define LF_DIR '5' /* directory */ +#define LF_FIFO '6' /* FIFO special file */ +#define LF_CONTIG '7' /* contiguous file */ +/* Further link types may be defined later. */ + +/* Note that the standards committee allows only capital A through + capital Z for user-defined expansion. This means that defining + something as, say '8' is a *bad* idea. */ + +/* This is a dir entry that contains the names of files that were in the + dir at the time the dump was made. */ +#define LF_DUMPDIR 'D' + +/* Identifies the NEXT file on the tape as having a long linkname. */ +#define LF_LONGLINK 'K' + +/* Identifies the NEXT file on the tape as having a long name. */ +#define LF_LONGNAME 'L' + +/* This is the continuation of a file that began on another volume. */ +#define LF_MULTIVOL 'M' + +/* For storing filenames that didn't fit in 100 characters. */ +#define LF_NAMES 'N' + +/* This is for sparse files. */ +#define LF_SPARSE 'S' + +/* This file is a tape/volume header. Ignore it on extraction. */ +#define LF_VOLHDR 'V' + +#if 0 +/* The following two blocks of #define's are unused in GNU tar. */ + +/* Bits used in the mode field - values in octal */ +#define TSUID 04000 /* set UID on execution */ +#define TSGID 02000 /* set GID on execution */ +#define TSVTX 01000 /* save text (sticky bit) */ + +/* File permissions */ +#define TUREAD 00400 /* read by owner */ +#define TUWRITE 00200 /* write by owner */ +#define TUEXEC 00100 /* execute/search by owner */ +#define TGREAD 00040 /* read by group */ +#define TGWRITE 00020 /* write by group */ +#define TGEXEC 00010 /* execute/search by group */ +#define TOREAD 00004 /* read by other */ +#define TOWRITE 00002 /* write by other */ +#define TOEXEC 00001 /* execute/search by other */ + +#endif + +/* End of Standard Archive Format description. */ + +/** + * @short A parser for GNU tar archives. + */ +class TarParser : public QObject { + Q_OBJECT + char _buf[512]; + int _bufIdx; + int _blocksToSkip; + int _record; + bool _longname; + bool _extended; + char _archname[8192]; + int _archnameIdx; + + int parseOctal( const char* data, int length ); + void parseTarBlock(); +public: + /** + * Create a new GNU tar archive parser. + */ + TarParser(); +public slots: + /** + * This slot receives raw data that represents a GNU tar archive. + * + * @param data An array of data bytes. + * @param length The length of the data array. + */ + void slotData( const char * data, int length ); +signals: + /** + * This signal is emitted whenever a file entry is parsed from the archive. + * + * @param name The name of the the file. + * @param size The size of the file, in bytes. + * @param mtime The last modification time for the file. + * @param record The tar record that this file begins on. + */ + void sigEntry( const QString & name, int size, int mtime, int record ); +}; + +#endif |