/** * pk_get_distro_id: * * Return value: the distro-id, typically "distro;version;arch" **/ gchar * pk_get_distro_id (void) { const gchar *filename = "/etc/os-release"; gboolean ret; _cleanup_error_free_ GError *error = NULL; _cleanup_free_ gchar *arch = NULL; _cleanup_free_ gchar *contents = NULL; _cleanup_free_ gchar *name = NULL; _cleanup_free_ gchar *version = NULL; _cleanup_keyfile_unref_ GKeyFile *key_file = NULL; _cleanup_string_free_ GString *str = NULL; /* we don't want distro specific results in 'make check' */ if (g_getenv ("PK_SELF_TEST") != NULL) return g_strdup ("selftest;11.91;i686"); /* load data */ if (!g_file_test (filename, G_FILE_TEST_EXISTS)) filename = "/usr/lib/os-release"; if (!g_file_get_contents (filename, &contents, NULL, NULL)) return NULL; /* make a valid GKeyFile from the .ini data by prepending a header */ str = g_string_new (contents); g_string_prepend (str, "[os-release]\n"); key_file = g_key_file_new (); ret = g_key_file_load_from_data (key_file, str->str, -1, G_KEY_FILE_NONE, &error); if (!ret) { g_warning ("failed to load os-release: %s", error->message); return NULL; } /* get keys */ name = g_key_file_get_string (key_file, "os-release", "ID", NULL); if (name == NULL) return NULL; version = g_key_file_get_string (key_file, "os-release", "VERSION_ID", NULL); if (version == NULL) return NULL; arch = pk_get_distro_id_machine_type (); return g_strdup_printf ("%s;%s;%s", name, version, arch); }
/** * pk_get_distro_id: * * Return value: the distro-id, typically "distro;version;arch" **/ gchar * pk_get_distro_id (void) { gboolean ret; g_autoptr(GError) error = NULL; g_autofree gchar *arch = NULL; g_autofree gchar *name = NULL; g_autofree gchar *version = NULL; /* we don't want distro specific results in 'make check' */ if (g_getenv ("PK_SELF_TEST") != NULL) return g_strdup ("selftest;11.91;i686"); ret = pk_parse_os_release (&name, &version, &error); if (!ret) { g_warning ("failed to load os-release: %s", error->message); return NULL; } arch = pk_get_distro_id_machine_type (); return g_strdup_printf ("%s;%s;%s", name, version, arch); }
/** * pk_get_distro_id: * * Return value: the distro-id, typically "distro;version;arch" **/ gchar * pk_get_distro_id (void) { guint i; gboolean ret; gchar *contents = NULL; gchar *arch = NULL; gchar *version = NULL; gchar **split = NULL; gchar *distro = NULL; gchar *distro_id = NULL; /* The distro id property should have the format "distro;version;arch" as this is used to determine if a specific package can be installed on a certain machine. For instance, x86_64 packages cannot be installed on a i386 machine. */ /* we can't get arch from /etc */ arch = pk_get_distro_id_machine_type (); /* check for fedora */ ret = g_file_get_contents ("/etc/fedora-release", &contents, NULL, NULL); if (ret) { /* Fedora release 8.92 (Rawhide) */ split = g_strsplit (contents, " ", 0); if (split == NULL) goto out; /* complete! */ distro_id = g_strdup_printf ("fedora;%s;%s", split[2], arch); goto out; } /* check for suse */ ret = g_file_get_contents ("/etc/SuSE-release", &contents, NULL, NULL); if (ret) { /* replace with spaces: openSUSE 11.0 (i586) Alpha3\nVERSION = 11.0 */ g_strdelimit (contents, "()\n", ' '); /* openSUSE 11.0 i586 Alpha3 VERSION = 11.0 */ split = g_strsplit (contents, " ", 0); if (split == NULL) goto out; /* complete! */ distro_id = g_strdup_printf ("suse;%s-%s;%s", split[1], split[3], arch); goto out; } /* check for meego */ ret = g_file_get_contents ("/etc/meego-release", &contents, NULL, NULL); if (ret) { /* Meego release 1.0 (MeeGo) */ split = g_strsplit (contents, " ", 0); if (split == NULL) goto out; /* complete! */ distro_id = g_strdup_printf ("meego;%s;%s", split[2], arch); goto out; } /* check for foresight or foresight derivatives */ ret = g_file_get_contents ("/etc/distro-release", &contents, NULL, NULL); if (ret) { /* Foresight Linux 2 */ split = g_strsplit (contents, " ", 0); if (split == NULL) goto out; /* complete! */ distro_id = g_strdup_printf ("foresight;%s;%s", split[2], arch); goto out; } /* check for PLD */ ret = g_file_get_contents ("/etc/pld-release", &contents, NULL, NULL); if (ret) { /* 2.99 PLD Linux (Th) */ split = g_strsplit (contents, " ", 0); if (split == NULL) goto out; /* complete! */ distro_id = g_strdup_printf ("pld;%s;%s", split[0], arch); goto out; } /* check for Arch */ ret = g_file_test ("/etc/arch-release", G_FILE_TEST_EXISTS); if (ret) { /* complete! */ distro_id = g_strdup_printf ("arch;current;%s", arch); goto out; } /* check for LSB */ ret = g_file_get_contents ("/etc/lsb-release", &contents, NULL, NULL); if (ret) { /* split by lines */ split = g_strsplit (contents, "\n", -1); for (i=0; split[i] != NULL; i++) { if (g_str_has_prefix (split[i], "DISTRIB_ID=")) distro = g_ascii_strdown (&split[i][11], -1); if (g_str_has_prefix (split[i], "DISTRIB_RELEASE=")) version = g_ascii_strdown (&split[i][16], -1); } /* complete! */ distro_id = g_strdup_printf ("%s;%s;%s", distro, version, arch); goto out; } /* check for Debian or Debian derivatives */ ret = g_file_get_contents ("/etc/debian_version", &contents, NULL, NULL); if (ret) { /* remove "\n": "squeeze/sid\n" */ g_strdelimit (contents, "\n", '\0'); /* removes leading and trailing whitespace */ g_strstrip (contents); /* complete! */ distro_id = g_strdup_printf ("debian;%s;%s", contents, arch); goto out; } #ifdef __FreeBSD__ ret = TRUE; #endif /* FreeBSD */ if (ret) { /* we can't get version from /etc */ version = pk_get_distro_id_os_release (); if (version == NULL) goto out; /* 7.2-RELEASE */ split = g_strsplit (version, "-", 0); if (split == NULL) goto out; /* complete! */ distro_id = g_strdup_printf ("freebsd;%s;%s", split[0], arch); goto out; } out: g_strfreev (split); g_free (version); g_free (distro); g_free (arch); g_free (contents); return distro_id; }