~ted/ubuntu-app-launch/fix-profiling-flags

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
/*
 * Copyright 2013 Canonical Ltd.
 *
 * This program is free software: you can redistribute it and/or modify it
 * under the terms of the GNU General Public License version 3, as published
 * by the Free Software Foundation.
 *
 * This program is distributed in the hope that it will be useful, but
 * WITHOUT ANY WARRANTY; without even the implied warranties of
 * MERCHANTABILITY, SATISFACTORY QUALITY, or FITNESS FOR A PARTICULAR
 * PURPOSE.  See the GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License along
 * with this program.  If not, see <http://www.gnu.org/licenses/>.
 *
 * Authors:
 *     Ted Gould <ted.gould@canonical.com>
 */

#include <gio/gio.h>

int
main (int argc, char * argv[])
{
	const gchar * job = g_getenv("JOB");
	g_return_val_if_fail(job != NULL, -1);

	const gchar * instance = g_getenv("INSTANCE");
	g_return_val_if_fail(instance != NULL, -1);

	gboolean crashed = FALSE;
	if (g_getenv("EXIT_STATUS") != NULL || g_getenv("EXIT_SIGNAL") != NULL) {
		crashed = TRUE;
	}

	gchar * appid = g_strdup(instance);
	if (g_strcmp0(job, "application-legacy") == 0) {
		gchar * lasthyphenstanding = g_strrstr(appid, "-");
		if (lasthyphenstanding != NULL) {
			lasthyphenstanding[0] = '\0';
		} else {
			g_warning("Legacy job instance '%s' is missing a hyphen", appid);
		}
	}

	GDBusConnection * bus = g_bus_get_sync(G_BUS_TYPE_SESSION, NULL, NULL);
	g_return_val_if_fail(bus != NULL, -1);

	GError * error = NULL;
	g_dbus_connection_emit_signal(bus,
		NULL, /* destination */
		"/", /* path */
		"com.canonical.UbuntuAppLaunch",
		"ApplicationFailed",
		g_variant_new("(ss)", appid, crashed ? "crash" : "start-failure"),
		&error);

	g_debug("Emitting failed event '%s' for app '%s'", crashed ? "crash" : "start-failure", appid);

	if (error != NULL) {
		g_warning("Unable to emit signal: %s", error->message);
		g_error_free(error);
		return -1;
	}

	g_dbus_connection_flush_sync(bus, NULL, NULL);
	g_object_unref(bus);
	g_free(appid);

	return 0;
}