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