I am using an embedded system that has multiple users like 'root' and 'user1'. I am running a c++ binary logged in as 'user1' and It fails to start / stop a service with a permission error. The same binary when running in root works fine. Here is the code:
#include <iostream>
#include <systemd/sd-bus.h>
static void SDCallMethodSS(
sd_bus* bus,
const std::string& name,
const std::string& method)
{
sd_bus_error err = SD_BUS_ERROR_NULL;
sd_bus_message* msg = nullptr;
int r;
r = sd_bus_call_method(bus,
"org.freedesktop.systemd1",
"/org/freedesktop/systemd1",
"org.freedesktop.systemd1.Manager",
method.c_str(),
&err,
&msg,
"ss",
name.c_str(), "replace" );
if (r < 0)
{
std::string err_str("Could not send " + method +
" command to systemd for service: " + name +
". Error: " + err.message );
sd_bus_error_free(&err);
sd_bus_message_unref(msg);
throw std::runtime_error(err_str);
}
char* response;
r = sd_bus_message_read(msg, "o", &response);
if (r < 0)
{
std::cerr<< "Failed to parse response message: " << strerror(-r) << std::endl;;
}
sd_bus_error_free(&err);
sd_bus_message_unref(msg);
}
int main() {
int r;
sd_bus *bus = NULL;
r = sd_bus_open_system(&bus);
if (r < 0) {
std::cerr<< "Failed to connect to system bus: " << strerror(-r) << std::endl;
return -1;
}
try{
SDCallMethodSS(bus, std::string("foo-daemon.service"), std::string("StopUnit"));
} catch (std::exception& e) {
std::cout << "Exception in SDCallMethodSS(): " << e.what() << std::endl;
return -2;
}
}
Foo-daemon is a dummy program:
#include <unistd.h>
int main()
{
while(1){
sleep(1);
}
}
The service file is simple:
[Unit]
Description=Foo
[Service]
ExecStart=/usr/local/bin/foo-daemon
[Install]
WantedBy=multi-user.target
Service file is loaded into /etc/systemd/system Output for 'user1' is:
Exception in SDCallMethodSS(): Could not send StopUnit command to systemd for service: foo-daemon.service. Error: Permission denied
How do I address the permissions issue for 'user1'