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 #include "y2storage/AppUtil.h"
00010
00011 namespace storage
00012 {
00013
00014 class AsciiFile;
00015 struct FstabChange;
00016
00017 struct FstabEntry
00018 {
00019 FstabEntry() { freq=passno=0; crypto=cryptt=loop=noauto=dmcrypt=false;
00020 encr=storage::ENC_NONE; mount_by=storage::MOUNTBY_DEVICE; }
00021 FstabEntry& operator=( const FstabChange& rhs );
00022 friend std::ostream& operator<< (std::ostream& s, const FstabEntry &v );
00023
00024 string device;
00025 string dentry;
00026 string mount;
00027 string fs;
00028 std::list<string> opts;
00029 int freq;
00030 int passno;
00031 bool loop;
00032 bool dmcrypt;
00033 bool noauto;
00034 bool crypto;
00035 bool cryptt;
00036 bool tmpcrypt;
00037 string loop_dev;
00038 string cr_opts;
00039 string cr_key;
00040 string cr_info;
00041 storage::EncryptType encr;
00042 storage::MountByType mount_by;
00043
00044 void calcDependent();
00045 };
00046
00047 inline std::ostream& operator<< (std::ostream& s, const FstabEntry &v )
00048 {
00049 s << "device:" << v.device
00050 << " dentry:" << v.dentry << " mount:" << v.mount
00051 << " fs:" << v.fs << " opts:" << mergeString( v.opts, "," )
00052 << " freq:" << v.freq << " passno:" << v.passno;
00053 if( v.noauto )
00054 s << " noauto";
00055 if( v.crypto )
00056 s << " crypto";
00057 if( v.cryptt )
00058 s << " cryptt";
00059 if( v.tmpcrypt )
00060 s << " tmpcrypt";
00061 if( v.loop )
00062 s << " loop";
00063 if( v.dmcrypt )
00064 s << " dmcrypt";
00065 if( !v.loop_dev.empty() )
00066 s << " loop_dev:" << v.loop_dev;
00067 if( !v.cr_key.empty() )
00068 s << " cr_key:" << v.cr_key;
00069 if( !v.cr_opts.empty() )
00070 s << " cr_opts:" << v.cr_opts;
00071 if( !v.cr_info.empty() )
00072 s << " cr_info:" << v.cr_info;
00073 if( v.encr != storage::ENC_NONE )
00074 s << " encr:" << v.encr;
00075 return( s );
00076 }
00077
00078 struct FstabChange
00079 {
00080 FstabChange() { freq=passno=0; encr=storage::ENC_NONE; tmpcrypt=false; }
00081 FstabChange( const FstabEntry& e ) { *this = e; }
00082 FstabChange& operator=( const FstabEntry& rhs )
00083 {
00084 device = rhs.device;
00085 dentry = rhs.dentry; mount = rhs.mount; fs = rhs.fs;
00086 opts = rhs.opts; freq = rhs.freq; passno = rhs.passno;
00087 loop_dev = rhs.loop_dev; encr = rhs.encr;
00088 tmpcrypt = rhs.tmpcrypt;
00089 return( *this );
00090 }
00091 friend std::ostream& operator<< (std::ostream& s, const FstabChange &v );
00092 string device;
00093 string dentry;
00094 string mount;
00095 string fs;
00096 std::list<string> opts;
00097 int freq;
00098 int passno;
00099 string loop_dev;
00100 storage::EncryptType encr;
00101 bool tmpcrypt;
00102 };
00103
00104 inline FstabEntry& FstabEntry::operator=( const FstabChange& rhs )
00105 {
00106 device = rhs.device;
00107 dentry = rhs.dentry; mount = rhs.mount; fs = rhs.fs;
00108 opts = rhs.opts; freq = rhs.freq; passno = rhs.passno;
00109 loop_dev = rhs.loop_dev; encr = rhs.encr;
00110 tmpcrypt = rhs.tmpcrypt;
00111 calcDependent();
00112 return( *this );
00113 }
00114
00115 inline std::ostream& operator<< (std::ostream& s, const FstabChange &v )
00116 {
00117 s << "device:" << v.device
00118 << " dentry:" << v.dentry << " mount:" << v.mount
00119 << " fs:" << v.fs << " opts:" << mergeString( v.opts, "," )
00120 << " freq:" << v.freq << " passno:" << v.passno;
00121 if( !v.loop_dev.empty() )
00122 s << " loop_dev:" << v.loop_dev;
00123 if( v.encr != storage::ENC_NONE )
00124 s << " encr:" << v.encr;
00125 if( v.tmpcrypt )
00126 s << " tmpcrypt";
00127 return( s );
00128 }
00129
00130 class EtcFstab
00131 {
00132 public:
00133 EtcFstab( const string& prefix = "", bool rootMounted=true );
00134 bool findDevice( const string& dev, FstabEntry& entry ) const;
00135 bool findDevice( const std::list<string>& dl, FstabEntry& entry ) const;
00136 bool findMount( const string& mount, FstabEntry& entry ) const;
00137 bool findUuidLabel( const string& uuid, const string& label,
00138 FstabEntry& entry ) const;
00139 bool findIdPath( const std::list<string>& id, const string& path,
00140 FstabEntry& entry ) const;
00141 void setDevice( const FstabEntry& entry, const string& device );
00142 int updateEntry( const string& dev, const string& mount,
00143 const string& fs, const string& opts="defaults" );
00144 int updateEntry( const FstabChange& entry );
00145 int addEntry( const FstabChange& entry );
00146 int removeEntry( const FstabEntry& entry );
00147 int changeRootPrefix( const string& prfix );
00148 void getFileBasedLoops( const string& prefix, std::list<FstabEntry>& l );
00149 void getEntries( std::list<FstabEntry>& l );
00150 string addText( bool doing, bool crypto, const string& mp );
00151 string updateText( bool doing, bool crypto, const string& mp );
00152 string removeText( bool doing, bool crypto, const string& mp );
00153 int flush();
00154 int findPrefix( const AsciiFile& tab, const string& mount );
00155
00156 protected:
00157 struct Entry
00158 {
00159 enum operation { NONE, ADD, REMOVE, UPDATE };
00160 Entry() { op=NONE; }
00161 operation op;
00162 FstabEntry nnew;
00163 FstabEntry old;
00164 };
00165
00166 void readFiles();
00167 AsciiFile* findFile( const FstabEntry& e, AsciiFile*& fstab,
00168 AsciiFile*& cryptotab, int& lineno );
00169 bool findCrtab( const FstabEntry& e, const AsciiFile& crtab,
00170 int& lineno );
00171 bool findCrtab( const string& device, const AsciiFile& crtab,
00172 int& lineno );
00173 void makeStringList( const FstabEntry& e, std::list<string>& ls );
00174 void makeCrtabStringList( const FstabEntry& e, std::list<string>& ls );
00175 string updateLine( const std::list<string>& ol,
00176 const std::list<string>& nl, const string& line );
00177 string createLine( const std::list<string>& ls, unsigned fields,
00178 unsigned* flen );
00179 string createTabLine( const FstabEntry& e );
00180 void makeCrStringList( const FstabEntry& e, std::list<string>& ls );
00181 string createCrtabLine( const FstabEntry& e );
00182
00183 static unsigned fstabFields[6];
00184 static unsigned cryptotabFields[6];
00185 static unsigned crypttabFields[6];
00186
00187 string prefix;
00188 std::list<Entry> co;
00189 };
00190
00191 }
00192
00193 #endif