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'