Page MenuHomePhabricator

mac.cpp
No OneTemporary

#include "qmac.h"
#include <QSharedData>
//заголовочный файл подсистемы MAC библиотеки PARSEC (мандатное разграничения доступа)
#include <parsec/mac.h>
//---------------------------------------------------------------------------
//---------------------------------------------------------------------------
class FileMacData : public QSharedData
{
friend class ProcessMacData;
public:
FileMacData(const QString& a_fileName);
~FileMacData();
QString level() const { return _level; }
QString levelText() const { return _levelText; }
QString categoryText() const { return _categoryText; }
QString fileName() const { return _fileName; }
private:
mac_t _mac;
QString _level;
QString _levelText;
QString _categoryText;
QString _fileName;
};
FileMacData::FileMacData(const QString& a_fileName)
: _fileName(a_fileName)
{
//получение метки файла по его имени
_mac = mac_get_file(a_fileName.toLocal8Bit().constData());
//числовое представление метки файла
_level = QString::number(mac_get_lev(_mac));
//текстовое представление метки файла
ssize_t size;
wchar_t* wtext = mac_to_wtext(_mac, &size, MAC_FMT_TXT | MAC_FMT_LEV);
_levelText = QString::fromWCharArray(wtext, size);
//освободить память, выделенную функцией mac_to_wtext
free(wtext);
//текстовое представление списка категорий
wtext = mac_to_wtext(_mac, &size, MAC_FMT_TXT | MAC_FMT_CAT);
_categoryText = QString::fromWCharArray(wtext, size);
//освободить память, выделенную функцией mac_to_wtext
free(wtext);
}
FileMacData::~FileMacData()
{
mac_free(_mac);
}
//---------------------------------------------------------------------------
//---------------------------------------------------------------------------
FileMac::FileMac(const QString& a_fileName)
: d(new FileMacData(a_fileName))
{
}
FileMac::~FileMac() = default;
//---------------------------------------------------------------------------
QString FileMac::level() const
{
return d->level();
}
QString FileMac::levelText() const
{
return d->levelText();
}
QString FileMac::categoryText() const
{
return d->categoryText();
}
QString FileMac::fileName() const
{
return d->fileName();
}
//---------------------------------------------------------------------------
//---------------------------------------------------------------------------
class ProcessMacData : public QSharedData
{
public:
ProcessMacData();
~ProcessMacData();
QString level() const { return _level; }
QString levelText() const { return _levelText; }
QString categoryText() const { return _categoryText; }
bool canRead(const FileMacData& a_fileMacData);
bool canWrite(const FileMacData& a_fileMacData);
private:
mac_t _mac;
QString _level;
QString _levelText;
QString _categoryText;
};
ProcessMacData::ProcessMacData()
{
//получение метки текущего процесса, то же, что mac_get_pid(0) или mac_get_pid(pid)
_mac = mac_get_proc();
//числовое представление метки процесса
_level = QString::number(mac_get_lev(_mac));
//текстовое представление метки процесса
ssize_t size;
wchar_t* wtext = mac_to_wtext(_mac, &size, MAC_FMT_TXT | MAC_FMT_LEV);
_levelText = QString::fromWCharArray(wtext, size);
//освободить память, выделенную функцией mac_to_wtext
free(wtext);
//текстовое представление списка категорий
wtext = mac_to_wtext(_mac, &size, MAC_FMT_TXT | MAC_FMT_CAT);
_categoryText = QString::fromWCharArray(wtext, size);
//освободить память, выделенную функцией mac_to_wtext
free(wtext);
}
ProcessMacData::~ProcessMacData()
{
mac_free(_mac);
}
//---------------------------------------------------------------------------
bool ProcessMacData::canRead(const FileMacData& a_fileMacData)
{
return 0 == mac_file_permit(_mac, a_fileMacData._mac, R_OK);
}
//---------------------------------------------------------------------------
bool ProcessMacData::canWrite(const FileMacData& a_fileMacData)
{
return 0 == mac_file_permit(_mac, a_fileMacData._mac, W_OK);
}
//---------------------------------------------------------------------------
//---------------------------------------------------------------------------
ProcessMac::ProcessMac()
: d(new ProcessMacData)
{
}
ProcessMac::~ProcessMac() = default;
//---------------------------------------------------------------------------
QString ProcessMac::level() const
{
return d->level();
}
QString ProcessMac::levelText() const
{
return d->levelText();
}
QString ProcessMac::categoryText() const
{
return d->categoryText();
}
bool ProcessMac::canRead(const FileMac& a_fileMac)
{
return d->canRead(*(a_fileMac.d));
}
bool ProcessMac::canWrite(const FileMac& a_fileMac)
{
return d->canWrite(*(a_fileMac.d));
}

File Metadata

Mime Type
text/x-c++
Expires
Wed, Jun 11, 3:12 PM (1 d, 14 h)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
127064

Event Timeline