Could I connect user's session bus from root?

danny tornadory at
Thu May 13 03:07:44 PDT 2010

Hi All,

I have made it worked after seteuid in the program and export DBUS_SESSION_BUS_ADDRESS as the plain user's.

I don't know why but it did work, thanks all of you a lot.


 Best Regards,

在2010-05-13 10:36:51,danny <tornadory at> 写道:
Hi All,

I test, but unfortunately it failed.

Below is my test program,  I thought the g_volume_monitor_get() need user's info, was it wrong?

Normally while I run "./test" , it will monitor the removable device and show the drive's name while some devices such as USB type connected or disconnected.

But when run it as root, it will show nothing.

*   gcc -o test test.c `pkg-config --libs --cflags gtk+-2.0`
*   Usage:  ./test

#include <gio/gio.h>
#include <gtk/gtk.h>
#include <string.h>
#include <unistd.h>
#include <errno.h>

static void print_drive_info(GDrive *drive)
    gchar *name;

    name = g_drive_get_name(drive);
    g_print("\tname: %s\n",
        name ? name : "(null)");


static void on_drive_changed(GVolumeMonitor *volume_monitor, GDrive *drive)
    g_print("Drive changed:\n");

static void on_drive_connected(GVolumeMonitor *volume_monitor, GDrive *drive)
    g_print("Drive connected:\n");

static void on_drive_disconnected(GVolumeMonitor *volume_monitor, GDrive *drive)
    g_print("Drive disconnected:\n");

static void on_refresh_clicked(GtkButton *button, Context ctx)

int main(int argc, char *argv[])
    GVolumeMonitor *monitor;

    gtk_init(&argc, &argv);

    /*Just for test , I set the uid euid directly to 500 which is my own user id */
    int old_uid = getuid();
    int old_euid = geteuid();
    printf("uid is %d \n euid is %d \n",getuid(), geteuid() );
    if (setuid(500) == -1)
    //if (seteuid(500) == -1)
    printf ("seteuid : %s \n", strerror(errno));
    return -1;
    printf("uid is %d \n euid is %d \n",getuid(), geteuid() );

    monitor = g_volume_monitor_get();   //the main entry I get information
    g_signal_connect(monitor, "drive-changed", G_CALLBACK(on_drive_changed), NULL);
    g_signal_connect(monitor, "drive-connected", G_CALLBACK(on_drive_connected), NULL);
    g_signal_connect(monitor, "drive-disconnected", G_CALLBACK(on_drive_disconnected), NULL);

    return 0;


 Best Regards,

在2010-05-13 09:48:16,danny <tornadory at> 写道:
Thanks all of you, I'll try it now.

Thanks again.


 Best Regards,

在2010-05-13 00:26:45,"Thiago Macieira" <thiago at> 写道:
>Em Quarta-feira 12 Maio 2010, às 18:02:10, Rémi Denis-Courmont escreveu:
>> Le mercredi 12 mai 2010 14:04:40 Thiago Macieira, vous avez écrit :
>> > Em Quarta-feira 12. Maio 2010, às 12.13.06, danny escreveu:
>> > > Dear All,
>> > > 
>> > > I have a program run as root, but I need get information from GVFS
>> > > which is on the session bus, and it shows "failed to connect the
>> > > session bus" while I run the test program, and it could not get any
>> > > information from the GVFS.
>> > > 
>> > > Could I access the session bus in my "root" program?
>> > 
>> > No.
>> > 
>> > The user's session bus requires the user's UID. Your program needs to
>> > drop privileges before connecting.
>> I think, in principles, the root process could just set its effective UID
>> to the user, while establishing the DBus connection, then back to root. It
>> does not need to drop the root privileges.
>Well, setting the EUID is dropping the privileges, even if you can still take 
>them back later :-)
>Thiago Macieira - thiago (AT) - thiago (AT)
>  Senior Product Manager - Nokia, Qt Development Frameworks
>      PGP/GPG: 0x6EF45358; fingerprint:
>      E067 918B B660 DBD1 105C  966C 33F5 F005 6EF4 5358

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <>

More information about the dbus mailing list