00001 #ifndef ETC_FSTAB_H
00002 #define ETC_FSTAB_H
00003
00004 #include <string>
00005 #include <list>
00006 #include <map>
00007
00008 #include "y2storage/StorageInterface.h"
00009
00010 class AsciiFile;
00011 struct FstabChange;
00012
00013 struct FstabEntry
00014 {
00015 FstabEntry() { freq=passno=0; crypto=loop=noauto=false;
00016 encr=storage::ENC_NONE; mount_by=storage::MOUNTBY_DEVICE; }
00017 FstabEntry& operator=( const FstabChange& rhs );
00018 friend std::ostream& operator<< (std::ostream& s, const FstabEntry &v );
00019
00020 string device;
00021 string dentry;
00022 string mount;
00023 string fs;
00024 std::list<string> opts;
00025 int freq;
00026 int passno;
00027 bool loop;
00028 bool noauto;
00029 bool crypto;
00030 string loop_dev;
00031 storage::EncryptType encr;
00032 storage::MountByType mount_by;
00033
00034 void calcDependent();
00035 };
00036
00037 inline std::ostream& operator<< (std::ostream& s, const FstabEntry &v )
00038 {
00039 s << "device:" << v.device
00040 << " dentry:" << v.dentry << " mount:" << v.mount
00041 << " fs:" << v.fs << " opts:" << mergeString( v.opts, "," )
00042 << " freq:" << v.freq << " passno:" << v.passno;
00043 if( v.noauto )
00044 s << " noauto";
00045 if( v.crypto )
00046 s << " crypto";
00047 if( v.loop )
00048 s << " loop";
00049 if( !v.loop_dev.empty() )
00050 s << " loop_dev:" << v.loop_dev;
00051 if( v.encr != storage::ENC_NONE )
00052 s << " encr:" << v.encr;
00053 return( s );
00054 }
00055
00056 struct FstabChange
00057 {
00058 FstabChange() { freq=passno=0; encr=storage::ENC_NONE; }
00059 FstabChange( const FstabEntry& e ) { *this = e; }
00060 FstabChange& operator=( const FstabEntry& rhs )
00061 {
00062 device = rhs.device;
00063 dentry = rhs.dentry; mount = rhs.mount; fs = rhs.fs;
00064 opts = rhs.opts; freq = rhs.freq; passno = rhs.passno;
00065 loop_dev = rhs.loop_dev; encr = rhs.encr;
00066 return( *this );
00067 }
00068 friend std::ostream& operator<< (std::ostream& s, const FstabChange &v );
00069 string device;
00070 string dentry;
00071 string mount;
00072 string fs;
00073 std::list<string> opts;
00074 int freq;
00075 int passno;
00076 string loop_dev;
00077 storage::EncryptType encr;
00078 };
00079
00080 inline FstabEntry& FstabEntry::operator=( const FstabChange& rhs )
00081 {
00082 device = rhs.device;
00083 dentry = rhs.dentry; mount = rhs.mount; fs = rhs.fs;
00084 opts = rhs.opts; freq = rhs.freq; passno = rhs.passno;
00085 loop_dev = rhs.loop_dev; encr = rhs.encr;
00086 calcDependent();
00087 return( *this );
00088 }
00089
00090 inline std::ostream& operator<< (std::ostream& s, const FstabChange &v )
00091 {
00092 s << "device:" << v.device
00093 << " dentry:" << v.dentry << " mount:" << v.mount
00094 << " fs:" << v.fs << " opts:" << mergeString( v.opts, "," )
00095 << " freq:" << v.freq << " passno:" << v.passno;
00096 if( !v.loop_dev.empty() )
00097 s << " loop_dev:" << v.loop_dev;
00098 if( v.encr != storage::ENC_NONE )
00099 s << " encr:" << v.encr;
00100 return( s );
00101 }
00102
00103 class EtcFstab
00104 {
00105 public:
00106 EtcFstab( const string& prefix = "", bool rootMounted=true );
00107 bool findDevice( const string& dev, FstabEntry& entry ) const;
00108 bool findDevice( const std::list<string>& dl, FstabEntry& entry ) const;
00109 bool findMount( const string& mount, FstabEntry& entry ) const;
00110 bool findUuidLabel( const string& uuid, const string& label,
00111 FstabEntry& entry ) const;
00112 void setDevice( const FstabEntry& entry, const string& device );
00113 int updateEntry( const string& dev, const string& mount,
00114 const string& fs, const string& opts="defaults" );
00115 int updateEntry( const FstabChange& entry );
00116 int addEntry( const FstabChange& entry );
00117 int removeEntry( const FstabEntry& entry );
00118 int changeRootPrefix( const string& prfix );
00119 void getFileBasedLoops( const string& prefix, std::list<FstabEntry>& l );
00120 void getEntries( std::list<FstabEntry>& l );
00121 string addText( bool doing, bool crypto, const string& mp );
00122 string updateText( bool doing, bool crypto, const string& mp );
00123 string removeText( bool doing, bool crypto, const string& mp );
00124 int flush();
00125
00126 protected:
00127 struct Entry
00128 {
00129 enum operation { NONE, ADD, REMOVE, UPDATE };
00130 Entry() { op=NONE; }
00131 operation op;
00132 FstabEntry nnew;
00133 FstabEntry old;
00134 };
00135
00136 void readFiles();
00137 AsciiFile* findFile( const FstabEntry& e, AsciiFile*& fstab,
00138 AsciiFile*& cryptotab, int& lineno );
00139 void makeStringList( const FstabEntry& e, std::list<string>& ls );
00140 string createTabLine( const FstabEntry& e );
00141
00142 static unsigned fstabFields[6];
00143 static unsigned cryptotabFields[6];
00144
00145 string prefix;
00146 std::list<Entry> co;
00147 };
00149
00150 #endif