This commit was generated by cvs2svn to compensate for changes in r120,
[util-vserver.git] / src / vutil.h
diff --git a/src/vutil.h b/src/vutil.h
new file mode 100644 (file)
index 0000000..c567267
--- /dev/null
@@ -0,0 +1,134 @@
+// $Id: vutil.h,v 1.1 2003/09/29 22:01:57 ensc Exp $
+
+// Copyright (C) 2003 Enrico Scholz <enrico.scholz@informatik.tu-chemnitz.de>
+// based on vutil.h by Jacques Gelinas
+//  
+// 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.
+
+#pragma interface
+#ifndef VUTIL_H
+#define VUTIL_H
+
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <sys/wait.h>
+#include <string>
+#include <set>
+#include <algorithm>
+#include <iostream>
+#include <list>
+
+using namespace std;
+
+extern int debug;
+extern bool testmode;
+
+// Patch to help compile this utility on unpatched kernel source
+#ifndef EXT2_IMMUTABLE_FILE_FL
+       #define EXT2_IMMUTABLE_FILE_FL  0x00000010
+       #define EXT2_IMMUTABLE_LINK_FL  0x00008000
+#endif
+
+
+FILE *vutil_execdistcmd (const char *, const string &, const char *);
+extern const char K_DUMPFILES[];
+extern const char K_UNIFILES[];
+extern const char K_PKGVERSION[];
+
+class PACKAGE{
+public:
+       string name;
+       string version; // version + release
+       PACKAGE(string &_name, string &_version)
+               : name (_name), version(_version)
+       {
+       }
+       PACKAGE(const char *_name, const char *_version)
+               : name (_name), version(_version)
+       {
+       }
+       PACKAGE(const string &line)
+       {
+               *this = line;
+       }
+       PACKAGE & operator = (const string &_line)
+       {
+               string line (_line);
+               string::iterator pos = find (line.begin(),line.end(),'=');
+               if (pos != line.end()){
+                       name = string(line.begin(),pos);
+                       version = string(pos + 1,line.end());
+               }
+               return *this;
+       }
+       PACKAGE (const PACKAGE &pkg)
+       {
+               name = pkg.name;
+               version = pkg.version;
+       }
+       bool operator == (const PACKAGE &v) const
+       {
+               return name == v.name && version == v.version;
+       }
+       bool operator < (const PACKAGE &v) const
+       {
+               bool ret = false;
+               if (name < v.name){
+                       ret = true;
+               }else if (name == v.name && version < v.version){
+                       ret = true;
+               }
+               return ret;
+       }
+       // Load the file member of the package, but exclude configuration file
+       void loadfiles(const string &ref, set<string> &files)
+       {
+               if (debug > 2) cout << "Loading files for package " << name << endl;
+               string namever = name + '-' + version;
+               FILE *fin = vutil_execdistcmd (K_UNIFILES,ref,namever.c_str());
+               if (fin != NULL){
+                       char tmp[1000];
+                       while (fgets(tmp,sizeof(tmp)-1,fin)!=NULL){
+                               int last = strlen(tmp)-1;
+                               if (last >= 0 && tmp[last] == '\n') tmp[last] = '\0';
+                               files.insert (tmp);
+                       }
+               }
+               if (debug > 2) cout << "Done\n";
+       }
+       #if 0
+       bool locate(const string &path)
+       {
+               return find (files.begin(),files.end(),path) != files.end();
+       }
+       #endif
+};
+
+// Check if two package have the same name (but potentially different version)
+class same_name{
+       const PACKAGE &pkg;
+public:
+       same_name(const PACKAGE &_pkg) : pkg(_pkg) {}
+       bool operator()(const PACKAGE &p)
+       {
+               return pkg.name == p.name;
+       }
+};
+
+
+#include "vutil.p"
+
+#endif
+