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; 
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

Generated on Wed Apr 30 15:02:08 2008 for yast2-storage by  doxygen 1.4.6