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