00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
#include <config.h>
00024
#include <stdlib.h>
00025
00026
#include <qfile.h>
00027
00028
#include "kstandarddirs.h"
00029
00030
#include "kmountpoint.h"
00031
00032
#ifdef HAVE_VOLMGT
00033
#include <volmgt.h>
00034
#endif
00035
#ifdef HAVE_SYS_MNTTAB_H
00036
#include <sys/mnttab.h>
00037
#endif
00038
#ifdef HAVE_MNTENT_H
00039
#include <mntent.h>
00040
#elif HAVE_SYS_MNTENT_H
00041
#include <sys/mntent.h>
00042
#endif
00043
00044
00045
#ifdef HAVE_SYS_MOUNT_H
00046
#ifdef HAVE_SYS_TYPES_H
00047
#include <sys/types.h>
00048
#endif
00049
#ifdef HAVE_SYS_PARAM_H
00050
#include <sys/param.h>
00051
#endif
00052
#include <sys/mount.h>
00053
#endif
00054
00055
#ifdef HAVE_FSTAB_H
00056
#include <fstab.h>
00057
#endif
00058
#if defined(_AIX)
00059
#include <sys/mntctl.h>
00060
#include <sys/vmount.h>
00061
#include <sys/vfs.h>
00062
00063
#ifndef mntctl
00064
extern "C" {
00065
int mntctl(
int command,
int size,
void* buffer);
00066 }
00067
#endif
00068
extern "C" struct vfs_ent *getvfsbytype(
int vfsType);
00069
extern "C" void endvfsent( );
00070
#endif
00071
00072
00073
#ifndef HAVE_GETMNTINFO
00074
# ifdef _PATH_MOUNTED
00075
00076
# undef MNTTAB
00077
# define MNTTAB _PATH_MOUNTED
00078
# else
00079
# ifndef MNTTAB
00080
# ifdef MTAB_FILE
00081
# define MNTTAB MTAB_FILE
00082
# else
00083
# define MNTTAB "/etc/mnttab"
00084
# endif
00085
# endif
00086
# endif
00087
#endif
00088
00089
00090
00091
#ifdef _OS_SOLARIS_
00092
#define FSTAB "/etc/vfstab"
00093
#else
00094
#define FSTAB "/etc/fstab"
00095
#endif
00096
00097
00098
00099 KMountPoint::KMountPoint()
00100 {
00101 }
00102
00103 KMountPoint::~KMountPoint()
00104 {
00105 }
00106
00107
#ifdef HAVE_SETMNTENT
00108
#define SETMNTENT setmntent
00109
#define ENDMNTENT endmntent
00110
#define STRUCT_MNTENT struct mntent *
00111
#define STRUCT_SETMNTENT FILE *
00112
#define GETMNTENT(file, var) ((var = getmntent(file)) != 0)
00113
#define MOUNTPOINT(var) var->mnt_dir
00114
#define MOUNTTYPE(var) var->mnt_type
00115
#define MOUNTOPTIONS(var) var->mnt_opts
00116
#define FSNAME(var) var->mnt_fsname
00117
#else
00118
#define SETMNTENT fopen
00119
#define ENDMNTENT fclose
00120
#define STRUCT_MNTENT struct mnttab
00121
#define STRUCT_SETMNTENT FILE *
00122
#define GETMNTENT(file, var) (getmntent(file, &var) == 0)
00123
#define MOUNTPOINT(var) var.mnt_mountp
00124
#define MOUNTTYPE(var) var.mnt_fstype
00125
#define MOUNTOPTIONS(var) var.mnt_mntopts
00126
#define FSNAME(var) var.mnt_special
00127
#endif
00128
00129 KMountPoint::List KMountPoint::possibleMountPoints(
int infoNeeded)
00130 {
00131
KMountPoint::List result;
00132
00133
00134
00135
00136
00137
00138
00139
00140
00141
00142
00143
00144
00145
00146
00147
00148
00149
00150
00151
00152
00153
00154
00155
00156
00157
00158
00159
00160
00161
00162
00163
00164
QFile f(FSTAB);
00165
if ( !f.open(IO_ReadOnly) )
00166
return result;
00167
00168
QTextStream t (&f);
00169
QString s;
00170
00171
while (! t.eof())
00172 {
00173 s=t.readLine().simplifyWhiteSpace();
00174
if ( s.isEmpty() || (s[0] ==
'#'))
00175
continue;
00176
if( s.startsWith(
"none") && s.contains(
"supermount"))
00177 {
00178
QStringList item = QStringList::split(
' ', s);
00179
if ( item.count() > 2 && item[1] != QString::fromLatin1(
"/proc")
00180 && item[0] == QString::fromLatin1(
"none")
00181 && item[0] != QString::fromLatin1(
"-") )
00182 {
00183
KMountPoint *mp =
new KMountPoint();
00184
QString deviceStr = item[3];
00185
QStringList lstCommat = QStringList::split(
',',deviceStr );
00186 deviceStr = lstCommat[0];
00187
if( s.contains(
"supermount"))
00188 {
00189
for ( QStringList::Iterator it = lstCommat.begin(); it != lstCommat.end(); ++it )
00190 {
00191
if( (*it).contains(
"dev="))
00192 {
00193
QString tmp = *it;
00194 tmp = tmp.remove(
"dev=");
00195 mp->
m_mountedFrom = tmp;
00196
break;
00197 }
00198 }
00199 }
00200 mp->
m_mountPoint = item[1];
00201 mp->
m_mountType = item[2];
00202
QString options = item[3];
00203
if (infoNeeded & NeedMountOptions)
00204 {
00205 mp->
m_mountOptions = QStringList::split(
',', options);
00206 }
00207
00208
if (infoNeeded & NeedRealDeviceName)
00209 {
00210
if (mp->
m_mountedFrom.startsWith(
"/"))
00211 mp->
m_device = KStandardDirs::realPath(mp->
m_mountedFrom);
00212 }
00213
00214 result.append(mp);
00215 }
00216 }
00217
else
00218 {
00219
00220
QStringList item = QStringList::split(
' ', s);
00221
00222
#ifdef _OS_SOLARIS_
00223
if (item.count() < 5)
00224
continue;
00225
#else
00226
if (item.count() < 4)
00227
continue;
00228
#endif
00229
00230
KMountPoint *mp =
new KMountPoint();
00231
00232
int i = 0;
00233 mp->
m_mountedFrom = item[i++];
00234
#ifdef _OS_SOLARIS_
00235
00236 i++;
00237
#endif
00238
mp->
m_mountPoint = item[i++];
00239 mp->
m_mountType = item[i++];
00240
QString options = item[i++];
00241
if (infoNeeded & NeedMountOptions)
00242 {
00243 mp->
m_mountOptions = QStringList::split(
',', options);
00244 }
00245
00246
if (infoNeeded & NeedRealDeviceName)
00247 {
00248
if (mp->
m_mountedFrom.startsWith(
"/"))
00249 mp->
m_device = KStandardDirs::realPath(mp->
m_mountedFrom);
00250 }
00251
00252 result.append(mp);
00253 }
00254 }
00255
00256 f.close();
00257
00258
return result;
00259 }
00260
00261
00262 KMountPoint::List KMountPoint::currentMountPoints(
int infoNeeded)
00263 {
00264
KMountPoint::List result;
00265
00266
#ifdef HAVE_GETMNTINFO
00267
00268
struct statfs *mounted;
00269
00270
int num_fs = getmntinfo(&mounted, MNT_NOWAIT);
00271
00272
for (
int i=0;i<num_fs;i++)
00273 {
00274
KMountPoint *mp =
new KMountPoint();
00275 mp->
m_mountedFrom = QFile::decodeName(mounted[i].f_mntfromname);
00276 mp->
m_mountPoint = QFile::decodeName(mounted[i].f_mntonname);
00277
00278
#ifdef __osf__
00279
mp->
m_mountType = QFile::decodeName(mnt_names[mounted[i].f_type]);
00280
#else
00281
mp->
m_mountType = QFile::decodeName(mounted[i].f_fstypename);
00282
#endif
00283
00284
if (infoNeeded & NeedMountOptions)
00285 {
00286
struct fstab *ft = getfsfile(mounted[i].f_mntonname);
00287
QString options = QFile::decodeName(ft->fs_mntops);
00288 mp->
m_mountOptions = QStringList::split(
',', options);
00289 }
00290
00291
if (infoNeeded & NeedRealDeviceName)
00292 {
00293
if (mp->
m_mountedFrom.startsWith(
"/"))
00294 mp->
m_device = KStandardDirs::realPath(mp->
m_mountedFrom);
00295 }
00296
00297 result.append(mp);
00298 }
00299
00300
#elif defined(_AIX)
00301
00302
struct vmount *mntctl_buffer;
00303
struct vmount *vm;
00304
char *mountedfrom;
00305
char *mountedto;
00306
int fsname_len, num;
00307
int buf_sz = 4096;
00308
00309 mntctl_buffer = (
struct vmount*)malloc(buf_sz);
00310 num = mntctl(MCTL_QUERY, buf_sz, mntctl_buffer);
00311
if (num == 0)
00312 {
00313 buf_sz = *(
int*)mntctl_buffer;
00314 free(mntctl_buffer);
00315 mntctl_buffer = (
struct vmount*)malloc(buf_sz);
00316 num = mntctl(MCTL_QUERY, buf_sz, mntctl_buffer);
00317 }
00318
00319
if (num > 0)
00320 {
00321
00322 vm = (
struct vmount *)mntctl_buffer;
00323
for ( ; num > 0; num-- )
00324 {
00325
00326 fsname_len = vmt2datasize(vm, VMT_STUB);
00327 mountedto = (
char*)malloc(fsname_len + 1);
00328 mountedto[fsname_len] =
'\0';
00329 strncpy(mountedto, (
char *)vmt2dataptr(vm, VMT_STUB), fsname_len);
00330
00331 fsname_len = vmt2datasize(vm, VMT_OBJECT);
00332 mountedfrom = (
char*)malloc(fsname_len + 1);
00333 mountedfrom[fsname_len] =
'\0';
00334 strncpy(mountedfrom, (
char *)vmt2dataptr(vm, VMT_OBJECT), fsname_len);
00335
00336
00337
00338
00339
00340
struct vfs_ent* ent = getvfsbytype(vm->vmt_gfstype);
00341
00342
KMountPoint *mp =
new KMountPoint();
00343 mp->
m_mountedFrom = QFile::decodeName(mountedfrom);
00344 mp->
m_mountPoint = QFile::decodeName(mountedto);
00345 mp->
m_mountType = QFile::decodeName(ent->vfsent_name);
00346
00347 free(mountedfrom);
00348 free(mountedto);
00349
00350
if (infoNeeded & NeedMountOptions)
00351 {
00352
00353 }
00354
00355
if (infoNeeded & NeedRealDeviceName)
00356 {
00357
if (mp->
m_mountedFrom.startsWith(
"/"))
00358 mp->
m_device = KStandardDirs::realPath(mp->
m_mountedFrom);
00359 }
00360
00361 result.append(mp);
00362
00363
00364 vm = (
struct vmount *)((
char *)vm + vm->vmt_length);
00365 }
00366
00367 endvfsent( );
00368 }
00369
00370 free( mntctl_buffer );
00371
#else
00372
STRUCT_SETMNTENT mnttab;
00373
if ((mnttab = SETMNTENT(MNTTAB,
"r")) == 0)
00374
return result;
00375
00376 STRUCT_MNTENT fe;
00377
while (GETMNTENT(mnttab, fe))
00378 {
00379
KMountPoint *mp =
new KMountPoint();
00380 mp->
m_mountedFrom = QFile::decodeName(FSNAME(fe));
00381
00382 mp->
m_mountPoint = QFile::decodeName(MOUNTPOINT(fe));
00383 mp->
m_mountType = QFile::decodeName(MOUNTTYPE(fe));
00384
if(mp->
m_mountType ==
"supermount" )
00385 {
00386
QString options = QFile::decodeName(MOUNTOPTIONS(fe));
00387
QStringList split = QStringList::split(
',', options);
00388
for ( QStringList::Iterator it = split.begin(); it != split.end(); ++it ) {
00389
if( (*it).contains(
"dev="))
00390 {
00391
QString tmp = *it;
00392 tmp = tmp.remove(
"dev=");
00393 mp->
m_mountedFrom = tmp;
00394
break;
00395 }
00396 }
00397 }
00398
00399
if (infoNeeded & NeedMountOptions)
00400 {
00401
QString options = QFile::decodeName(MOUNTOPTIONS(fe));
00402 mp->
m_mountOptions = QStringList::split(
',', options);
00403 }
00404
00405
if (infoNeeded & NeedRealDeviceName)
00406 {
00407
if (mp->
m_mountedFrom.startsWith(
"/"))
00408 mp->
m_device = KStandardDirs::realPath(mp->
m_mountedFrom);
00409 }
00410
00411 result.append(mp);
00412 }
00413 ENDMNTENT(mnttab);
00414
#endif
00415
return result;
00416 }
00417
00418