23#include <zypp-media/Mount>
24#include <zypp/base/ExternalDataSource.h>
25#include <zypp/base/Logger.h>
26#include <zypp-media/MediaException>
28#include <zypp/PathInfo.h>
43 if ( ! obj.
opts.empty() )
63 const std::string & target,
64 const std::string & filesystem,
65 const std::string & options,
68 const char *
const argv[] = {
71 "-o", options.c_str(),
80 for ( std::string output = prog.receiveLine(); output.length(); output = prog.receiveLine() ) {
81 output[output.size()-1] =
'\0';
82 value = std::move( output );
83 DBG <<
"stdout: " << value << endl;
85 if ( value.find(
"is already mounted on" ) != std::string::npos ) {
86 err =
"Media already mounted";
88 else if ( value.find(
"ermission denied" ) != std::string::npos ) {
89 err =
"Permission denied";
91 else if ( value.find(
"wrong fs type" ) != std::string::npos ) {
92 err =
"Invalid filesystem on media";
94 else if ( value.find(
"No medium found" ) != std::string::npos ) {
95 err =
"No medium found";
97 else if ( value.find(
"Not a directory" ) != std::string::npos ) {
99 err =
"NFS path is not a directory";
102 err =
"Unable to find directory on the media";
106 int exitCode = prog.close();
108 if ( exitCode != 0 ) {
109 if ( err.empty() ) err =
"Mounting media failed";
110 WAR <<
"mount " << source <<
" " << target <<
": " << exitCode <<
": " << err << endl;
114 MIL <<
"mounted " << source <<
" " << target << endl;
119 const char *
const argv[] = {
128 bool doRetry =
false;
129 unsigned numRetry = 2;
133 WAR <<
"umount " << path <<
": " << exitCode <<
": " << err <<
" - retrying in 1 sec." << endl;
139 WAR <<
"umount " << path <<
": " << exitCode <<
": " << err <<
" - giving up" << endl;
145 for ( std::string output = prog.receiveLine(); output.length(); output = prog.receiveLine() ) {
147 DBG <<
"stdout: " << output << endl;
149 if ( output.find (
" is busy" ) != std::string::npos ) {
150 err =
"Device is busy";
154 exitCode = prog.close();
156 }
while( exitCode != 0 && doRetry );
158 if ( exitCode != 0 ) {
159 if ( err.empty() ) err =
"Unmounting media failed";
160 WAR <<
"umount " << path <<
": " << exitCode <<
": " << err << endl;
164 MIL <<
"unmounted " << path << endl;
171 MountEntries entries;
172 std::vector<std::string> mtabs;
173 bool verbose =
false;
177 mtabs.push_back(
"/proc/mounts");
185 mtabs.push_back(
"/etc/mtab");
189 mtabs.push_back(mtab);
192 std::vector<std::string>::const_iterator t;
193 for( t=mtabs.begin(); t != mtabs.end(); ++t)
197 DBG <<
"Reading mount table from '" << *t <<
"'" << std::endl;
199 FILE *fp = setmntent(t->c_str(),
"re");
202 char buf[PATH_MAX * 4];
205 memset(buf, 0,
sizeof(buf));
206 memset(&ent, 0,
sizeof(ent));
208 while( getmntent_r(fp, &ent, buf,
sizeof(buf)) != NULL)
210 if( ent.mnt_fsname && *ent.mnt_fsname &&
211 ent.mnt_dir && *ent.mnt_dir &&
212 ent.mnt_type && *ent.mnt_type &&
213 ent.mnt_opts && *ent.mnt_opts)
216 ent.mnt_fsname, ent.mnt_dir,
217 ent.mnt_type, ent.mnt_opts,
218 ent.mnt_freq, ent.mnt_passno
226 if ( entry.
src.size() > 1
227 && entry.
src[entry.
src.size()-1] ==
'/' )
229 entry.
src.erase( entry.
src.size()-1 );
231 entries.push_back(entry);
233 memset(buf, 0,
sizeof(buf));
234 memset(&ent, 0,
sizeof(ent));
241 WAR <<
"Unable to read any entry from the mount table '" << *t <<
"'"
255 WAR <<
"Failed to read the mount table '" << *t <<
"': "
269 WAR <<
"Failed to retrieve modification time of '/etc/mtab'"
Execute a program and give access to its io An object of this class encapsulates the execution of an ...
Wrapper class for stat/lstat.
String related utilities and Regular expression matching.
bool hasPrefix(const C_Str &str_r, const C_Str &prefix_r)
Return whether str_r has prefix prefix_r.
Easy-to use interface to the ZYPP dependency resolver.
A "struct mntent" like mount entry structure, but using std::strings.
std::string dir
file system path prefix
std::string src
name of mounted file system
bool isBlockDevice() const
Returns true if the src part points to a block device in /dev.
std::string type
filesystem / mount type
std::string opts
mount options
#define ZYPP_THROW(EXCPT)
Drops a logline and throws the Exception.