]> git.decadent.org.uk Git - dak.git/blobdiff - tools/dsync-0.0/libdsync/filelist.h
Added another tool used in dak (and placed nowhere else), dsync
[dak.git] / tools / dsync-0.0 / libdsync / filelist.h
diff --git a/tools/dsync-0.0/libdsync/filelist.h b/tools/dsync-0.0/libdsync/filelist.h
new file mode 100644 (file)
index 0000000..430d089
--- /dev/null
@@ -0,0 +1,224 @@
+// -*- mode: cpp; mode: fold -*-
+// Description                                                         /*{{{*/
+// $Id: filelist.h,v 1.10 1999/12/26 06:59:00 jgg Exp $
+/* ######################################################################
+   
+   File List structures
+   
+   These structures represent the uncompacted binary records from the
+   file list file. Functions are provided to compact and decompact these
+   structures for reading and writing.
+
+   The dsFList class can be instantiated to get get a general 'all records'
+   storage. It also has a member to read the next record from the IO and
+   to print out a record summary.
+   
+   Be sure to read filelist.sgml which contains the precise meaning of 
+   the feilds and the compaction technique used.
+
+   ##################################################################### */
+                                                                       /*}}}*/
+#ifndef DSYNC_FILELIST
+#define DSYNC_FILELIST
+
+#ifdef __GNUG__
+#pragma interface "dsync/filelist.h"
+#endif 
+
+#include <string>
+using namespace std;
+
+class dsFList
+{
+   public:
+      
+   class IO;
+
+   struct Header
+   {
+      unsigned long Tag;
+      unsigned long Signature;
+      unsigned long MajorVersion;
+      unsigned long MinorVersion;
+      unsigned long Epoch;
+      
+      unsigned long FlagCount;
+      unsigned long Flags[15];
+
+      bool Read(IO &IO);
+      bool Write(IO &IO);
+      
+      Header();
+   };
+   
+   struct DirEntity
+   {
+      unsigned long Tag;
+      signed long ModTime;
+      unsigned long Permissions;
+      unsigned long User;
+      unsigned long Group;
+      string Name;
+
+      enum EntFlags {FlPerm = (1<<0), FlOwner = (1<<1)};
+      
+      /* You know what? egcs-2.91.60 will not call the destructor for Name
+         if this in not here. I can't reproduce this in a simpler context
+         either. - Jgg [time passes] serious egcs bug, it was mislinking
+         the string classes :< */
+      ~DirEntity() {};
+   };
+   
+   struct Directory : public DirEntity
+   {      
+      bool Read(IO &IO);
+      bool Write(IO &IO);
+   };
+   
+   struct NormalFile : public DirEntity
+   {
+      unsigned long Size;
+      unsigned char MD5[16];
+      
+      enum Flags {FlMD5 = (1<<2)};
+      
+      bool Read(IO &IO);
+      bool Write(IO &IO);      
+   };
+   
+   struct Symlink : public DirEntity
+   {
+      unsigned long Compress;
+      string To;
+      
+      bool Read(IO &IO);
+      bool Write(IO &IO);
+   };
+   
+   struct DeviceSpecial : public DirEntity
+   {
+      unsigned long Dev;
+      
+      bool Read(IO &IO);
+      bool Write(IO &IO);
+   };
+   
+   struct Filter
+   {
+      unsigned long Tag;
+      unsigned long Type;
+      string Pattern;
+      
+      enum Types {Include=1, Exclude=2};
+      
+      bool Read(IO &IO);
+      bool Write(IO &IO);
+   };
+   
+   struct UidGidMap
+   {
+      unsigned long Tag;
+      unsigned long FileID;
+      unsigned long RealID;
+      string Name;
+      
+      enum Flags {FlRealID = (1<<0)};
+      
+      bool Read(IO &IO);
+      bool Write(IO &IO);
+   };
+   
+   struct HardLink : public NormalFile
+   {
+      unsigned long Serial;
+      
+      bool Read(IO &IO);
+      bool Write(IO &IO);
+   };
+   
+   struct Trailer
+   {
+      unsigned long Tag;   
+      unsigned long Signature;
+      
+      bool Read(IO &IO);
+      bool Write(IO &IO);
+      Trailer();
+   };
+   
+   struct RSyncChecksum
+   {
+      unsigned long Tag;
+      unsigned long BlockSize;
+      unsigned long FileSize;
+
+      // Array of 160 bit values (20 bytes) stored in Network byte order
+      unsigned char *Sums;
+      
+      bool Read(IO &IO);
+      bool Write(IO &IO);
+      RSyncChecksum();
+      ~RSyncChecksum();
+   };
+  
+   struct AggregateFile
+   {
+      unsigned long Tag;
+      string File;
+      
+      bool Read(IO &IO);
+      bool Write(IO &IO);
+   };
+  
+   
+   enum Types {tHeader=0, tDirMarker=1, tDirStart=2, tDirEnd=3, tNormalFile=4,
+      tSymlink=5, tDeviceSpecial=6, tDirectory=7, tFilter=8, 
+      tUidMap=9, tGidMap=10, tHardLink=11, tTrailer=12, tRSyncChecksum=13,
+      tAggregateFile=14, tRSyncEnd=15};
+
+   unsigned long Tag;
+   Header Head;
+   Directory Dir;
+   NormalFile NFile;
+   Symlink SLink;
+   DeviceSpecial DevSpecial; 
+   Filter Filt;
+   UidGidMap UMap;
+   HardLink HLink;
+   Trailer Trail;
+   DirEntity *Entity;
+   NormalFile *File;
+   RSyncChecksum RChk;
+   AggregateFile AgFile;
+      
+   bool Step(IO &IO);
+   bool Print(ostream &out);
+};
+
+class dsFList::IO
+{
+   public:
+
+   string LastSymlink;
+   dsFList::Header Header;
+   bool NoStrings;
+   
+   virtual bool Read(void *Buf,unsigned long Len) = 0;
+   virtual bool Write(const void *Buf,unsigned long Len) = 0;
+   virtual bool Seek(unsigned long Bytes) = 0;
+   virtual unsigned long Tell() = 0;
+   
+   bool ReadNum(unsigned long &Number);
+   bool WriteNum(unsigned long Number);
+   bool ReadInt(unsigned long &Number,unsigned char Count);
+   bool WriteInt(unsigned long Number,unsigned char Count);
+   bool ReadInt(signed long &Number,unsigned char Count);
+   bool WriteInt(signed long Number,unsigned char Count);
+   bool ReadString(string &Foo);
+   bool WriteString(string const &Foo);
+   
+   IO();
+   virtual ~IO() {};
+};
+
+#endif