EtcFstab.h

Go to the documentation of this file.
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

Generated on Fri May 18 11:48:28 2007 for yast2-storage by  doxygen 1.4.6