How do I programmatically open a file in its default program in Linux (im using Ubuntu 10.10).
For example, opening *.mp3 will open the file in Movie Player (or something else).
You need to run gnome-open, kde-open, or exo-open, depending on which desktop you are using.
I believe there is a project called xdg-utils that attempts to provide a unified interface to the local desktop.
So, something like:
snprintf(s, sizeof s, "%s %s", "xdg-open", the_file);
system(s);
Beware of code injection. It's safer to bypass scripting layers with user input, so consider something like:
pid = fork();
if (pid == 0) {
execl("/usr/bin/xdg-open", "xdg-open", the_file, (char *)0);
exit(1);
}
// parent will usually wait for child here
xdg-open calls the appropiate one.execv* instead of system.system, is a pretty obvious attack vector.execl("xdg-open", "xdg-open", file, (char *) NULL) is much safer. (Of course, after a fork()).Ubuntu 10.10 is based on GNOME. So, it would be good idea to use
g_app_info_launch_default_for_uri().
Something like this should work.
#include <stdio.h>
#include <gio/gio.h>
int main(int argc, char *argv[])
{
gboolean ret;
GError *error = NULL;
g_type_init();
ret = g_app_info_launch_default_for_uri("file:///etc/passwd",
NULL,
&error);
if (ret)
g_message("worked");
else
g_message("nop: %s", error->message);
return 0;
}
BTW, xdg-open, a shell script, tries to determin your desktop environment and call a known helper like gvfs-open for GNOME, kde-open for KDE, or something else. gvfs-open ends up calling g_app_info_launch_default_for_uri().
librewolf but it still spawns firefox for urls. I have this issue rarely with other programs too, probably always those that use this function...gio mime x-scheme-handler/https to see how your system answers. If it recommends firefox, try running strace gio mime x-scheme-handler/https 2>&1 | grep open | grep -v -e ') = -1' -e O_DIRECTORY, and grep though each files to see which file you have your wrong settings are.
firefoxcommand from your terminal .... you can make it right.... Have a look on my solution....and see if this works for you