Work around sudo not changing $HOME thus the configuration file ending up in the invoking user $HOME with root permissions, leading to an unwriteable configuration file if running as user.

git-svn-id: svn://svn.rockbox.org/rockbox/trunk@20103 a1c6a512-1295-4272-9138-f99709370657
This commit is contained in:
Dominik Riebeling 2009-02-25 21:05:57 +00:00
parent 884dc711b8
commit c96452ac92

View file

@ -16,11 +16,15 @@
* KIND, either express or implied. * KIND, either express or implied.
* *
****************************************************************************/ ****************************************************************************/
#include "rbsettings.h" #include "rbsettings.h"
#include <QSettings> #include <QSettings>
#if defined(Q_OS_LINUX)
#include <unistd.h>
#endif
void RbSettings::open() void RbSettings::open()
{ {
// only use built-in rbutil.ini // only use built-in rbutil.ini
@ -28,11 +32,12 @@ void RbSettings::open()
// portable installation: // portable installation:
// check for a configuration file in the program folder. // check for a configuration file in the program folder.
QFileInfo config; QFileInfo config;
config.setFile(QCoreApplication::instance()->applicationDirPath() + "/RockboxUtility.ini"); config.setFile(QCoreApplication::instance()->applicationDirPath()
if(config.isFile()) + "/RockboxUtility.ini");
if(config.isFile())
{ {
userSettings = new QSettings(QCoreApplication::instance()->applicationDirPath() + "/RockboxUtility.ini", userSettings = new QSettings(QCoreApplication::instance()->applicationDirPath()
QSettings::IniFormat, this); + "/RockboxUtility.ini", QSettings::IniFormat, this);
qDebug() << "config: portable"; qDebug() << "config: portable";
} }
else else
@ -46,7 +51,25 @@ void RbSettings::open()
void RbSettings::sync() void RbSettings::sync()
{ {
userSettings->sync(); userSettings->sync();
} #if defined(Q_OS_LINUX)
// when using sudo it runs rbutil with uid 0 but unfortunately without a
// proper login shell, thus the configuration file gets placed in the
// calling users $HOME. This in turn will cause issues if trying to
// run rbutil later as user. Try to detect this case via the environment
// variable SUDO_UID and SUDO_GID and if set chown the user config file.
if(getuid() == 0)
{
char* realuser = getenv("SUDO_UID");
char* realgroup = getenv("SUDO_GID");
if(realuser != NULL && realgroup != NULL)
{
int realuid = atoi(realuser);
int realgid = atoi(realgroup);
chown(qPrintable(userSettings->fileName()), realuid, realgid);
}
}
#endif
}
QVariant RbSettings::deviceSettingCurGet(QString entry,QString def) QVariant RbSettings::deviceSettingCurGet(QString entry,QString def)
{ {
@ -260,12 +283,12 @@ QString RbSettings::lastTalkedFolder()
{ {
return userSettings->value("last_talked_folder").toString(); return userSettings->value("last_talked_folder").toString();
} }
QString RbSettings::voiceLanguage() QString RbSettings::voiceLanguage()
{ {
return userSettings->value("voicelanguage").toString(); return userSettings->value("voicelanguage").toString();
} }
int RbSettings::wavtrimTh() int RbSettings::wavtrimTh()
{ {
return userSettings->value("wavtrimthreshold",500).toInt(); return userSettings->value("wavtrimthreshold",500).toInt();
@ -328,7 +351,7 @@ QStringList RbSettings::allPlatforms()
QStringList result; QStringList result;
devices->beginGroup("platforms"); devices->beginGroup("platforms");
QStringList a = devices->childKeys(); QStringList a = devices->childKeys();
for(int i = 0; i < a.size(); i++) for(int i = 0; i < a.size(); i++)
{ {
result.append(devices->value(a.at(i), "null").toString()); result.append(devices->value(a.at(i), "null").toString());
} }
@ -341,7 +364,7 @@ QStringList RbSettings::allLanguages()
QStringList result; QStringList result;
devices->beginGroup("languages"); devices->beginGroup("languages");
QStringList a = devices->childKeys(); QStringList a = devices->childKeys();
for(int i = 0; i < a.size(); i++) for(int i = 0; i < a.size(); i++)
{ {
result.append(devices->value(a.at(i), "null").toString()); result.append(devices->value(a.at(i), "null").toString());
} }
@ -385,7 +408,7 @@ QString RbSettings::nameOfTargetId(int id)
} }
devices->endGroup(); devices->endGroup();
} }
return result; return result;
} }
@ -397,7 +420,7 @@ QMap<int, QString> RbSettings::usbIdMap()
devices->beginGroup("platforms"); devices->beginGroup("platforms");
platforms = devices->childKeys(); platforms = devices->childKeys();
devices->endGroup(); devices->endGroup();
for(int i = 0; i < platforms.size(); i++) for(int i = 0; i < platforms.size(); i++)
{ {
devices->beginGroup("platforms"); devices->beginGroup("platforms");
@ -423,7 +446,7 @@ QMap<int, QString> RbSettings::usbIdErrorMap()
devices->beginGroup("platforms"); devices->beginGroup("platforms");
platforms = devices->childKeys(); platforms = devices->childKeys();
devices->endGroup(); devices->endGroup();
for(int i = 0; i < platforms.size(); i++) for(int i = 0; i < platforms.size(); i++)
{ {
devices->beginGroup("platforms"); devices->beginGroup("platforms");
@ -449,7 +472,7 @@ QMap<int, QString> RbSettings::usbIdIncompatMap()
devices->beginGroup("platforms"); devices->beginGroup("platforms");
platforms = devices->childKeys(); platforms = devices->childKeys();
devices->endGroup(); devices->endGroup();
for(int i = 0; i < platforms.size(); i++) for(int i = 0; i < platforms.size(); i++)
{ {
devices->beginGroup("platforms"); devices->beginGroup("platforms");
@ -580,7 +603,7 @@ void RbSettings::setTTSLang(QString tts, QString lang)
void RbSettings::setTTSUseSapi4(bool value) void RbSettings::setTTSUseSapi4(bool value)
{ {
userSettingsGroupSet("sapi","useSapi4",value); userSettingsGroupSet("sapi","useSapi4",value);
} }
void RbSettings::setEncoderPath(QString enc, QString path) void RbSettings::setEncoderPath(QString enc, QString path)
{ {