| Norman James | 26072c0 | 2015-08-25 07:14:29 -0500 | [diff] [blame] | 1 | #include <stdint.h>
 | 
 | 2 | #include <stdio.h>
 | 
 | 3 | #include <stdlib.h>
 | 
 | 4 | #include <string.h>
 | 
 | 5 | #include <fcntl.h>
 | 
 | 6 | #include <unistd.h>
 | 
 | 7 | #include <sys/stat.h>
 | 
 | 8 | #include <sys/mman.h>
 | 
| Norman James | 8abb50c | 2015-09-16 10:58:16 -0500 | [diff] [blame] | 9 | #include <syslog.h>
 | 
| Norman James | 362a80f | 2015-09-14 14:04:39 -0500 | [diff] [blame] | 10 | #include "interfaces/openbmc_intf.h"
 | 
| Norman James | 10ff6a3 | 2015-08-27 14:24:17 -0500 | [diff] [blame] | 11 | #include "openbmc.h"
 | 
 | 12 | #include "gpio.h"
 | 
| Norman James | e276510 | 2015-08-19 22:00:55 -0500 | [diff] [blame] | 13 | 
 | 
 | 14 | /* ---------------------------------------------------------------------------------------------------- */
 | 
| Norman James | 362a80f | 2015-09-14 14:04:39 -0500 | [diff] [blame] | 15 | static const gchar* dbus_object_path = "/org/openbmc/control";
 | 
| Norman James | 26072c0 | 2015-08-25 07:14:29 -0500 | [diff] [blame] | 16 | static const gchar* dbus_name        = "org.openbmc.control.Power";
 | 
 | 17 | 
 | 
| Norman James | 32e74e2 | 2015-09-15 21:28:06 -0500 | [diff] [blame] | 18 | //This object will use these GPIOs
 | 
| Norman James | 3f97c5d | 2015-08-26 17:44:14 -0500 | [diff] [blame] | 19 | GPIO power_pin    = (GPIO){ "POWER_PIN" };
 | 
 | 20 | GPIO pgood        = (GPIO){ "PGOOD" };
 | 
| Norman James | e276510 | 2015-08-19 22:00:55 -0500 | [diff] [blame] | 21 | 
 | 
 | 22 | static GDBusObjectManagerServer *manager = NULL;
 | 
| Norman James | e276510 | 2015-08-19 22:00:55 -0500 | [diff] [blame] | 23 | 
 | 
| Norman James | 8887267 | 2015-09-21 16:51:35 -0500 | [diff] [blame] | 24 | time_t pgood_timeout_start = 0;
 | 
| Norman James | 362a80f | 2015-09-14 14:04:39 -0500 | [diff] [blame] | 25 | 
 | 
| Norman James | 3d3b7fb | 2015-10-06 16:54:06 -0500 | [diff] [blame] | 26 | // TODO:  Change to interrupt driven instead of polling
 | 
| Norman James | ce46e3e | 2015-08-30 22:25:55 -0500 | [diff] [blame] | 27 | static gboolean poll_pgood(gpointer user_data)
 | 
 | 28 | {
 | 
 | 29 | 	ControlPower *control_power = object_get_control_power((Object*)user_data);
 | 
 | 30 | 	Control* control = object_get_control((Object*)user_data);
 | 
| Norman James | bd4abd1 | 2015-09-16 22:43:46 -0500 | [diff] [blame] | 31 | 
 | 
 | 32 | 	//send the heartbeat
 | 
| Norman James | ce46e3e | 2015-08-30 22:25:55 -0500 | [diff] [blame] | 33 | 	control_emit_heartbeat(control,dbus_name);
 | 
| Norman James | 32e74e2 | 2015-09-15 21:28:06 -0500 | [diff] [blame] | 34 | 	const gchar* obj_path = g_dbus_object_get_object_path((GDBusObject*)user_data);
 | 
| Norman James | ce46e3e | 2015-08-30 22:25:55 -0500 | [diff] [blame] | 35 | 
 | 
| Norman James | 6a1283c | 2015-09-16 22:21:11 -0500 | [diff] [blame] | 36 | 	guint poll_int = control_get_poll_interval(control);
 | 
 | 37 | 	if (poll_int == 0)
 | 
 | 38 | 	{
 | 
| Norman James | 2891c53 | 2015-10-06 08:01:56 -0500 | [diff] [blame] | 39 | 		printf("ERROR PowerControl: Poll interval cannot be 0\n");
 | 
| Norman James | 6a1283c | 2015-09-16 22:21:11 -0500 | [diff] [blame] | 40 | 		return FALSE;
 | 
 | 41 | 	}
 | 
| Norman James | 8887267 | 2015-09-21 16:51:35 -0500 | [diff] [blame] | 42 | 	//handle timeout
 | 
 | 43 | 	time_t current_time = time(NULL);
 | 
 | 44 | 	if (difftime(current_time,pgood_timeout_start) > control_power_get_pgood_timeout(control_power)
 | 
 | 45 | 		&& pgood_timeout_start != 0)
 | 
| Norman James | 32e74e2 | 2015-09-15 21:28:06 -0500 | [diff] [blame] | 46 | 	{
 | 
| Norman James | 2891c53 | 2015-10-06 08:01:56 -0500 | [diff] [blame] | 47 | 		printf("ERROR PowerControl: Pgood poll timeout\n");
 | 
| Norman James | bd4abd1 | 2015-09-16 22:43:46 -0500 | [diff] [blame] | 48 | 		// set timeout to 0 so timeout doesn't happen again
 | 
| Norman James | 32e74e2 | 2015-09-15 21:28:06 -0500 | [diff] [blame] | 49 | 		control_power_set_pgood_timeout(control_power,0);
 | 
| Norman James | 8887267 | 2015-09-21 16:51:35 -0500 | [diff] [blame] | 50 | 		pgood_timeout_start = 0;
 | 
| Norman James | 8abb50c | 2015-09-16 10:58:16 -0500 | [diff] [blame] | 51 | 		return TRUE;
 | 
| Norman James | 32e74e2 | 2015-09-15 21:28:06 -0500 | [diff] [blame] | 52 | 	}
 | 
| Norman James | 32e74e2 | 2015-09-15 21:28:06 -0500 | [diff] [blame] | 53 | 	uint8_t gpio;
 | 
| Norman James | 8887267 | 2015-09-21 16:51:35 -0500 | [diff] [blame] | 54 | 	
 | 
 | 55 | 	int rc = gpio_open(&pgood);
 | 
 | 56 | 	rc = gpio_read(&pgood,&gpio);
 | 
 | 57 | 	gpio_close(&pgood);	
 | 
| Norman James | 32e74e2 | 2015-09-15 21:28:06 -0500 | [diff] [blame] | 58 | 	if (rc == GPIO_OK)
 | 
| Norman James | 362a80f | 2015-09-14 14:04:39 -0500 | [diff] [blame] | 59 | 	{
 | 
| Norman James | 32e74e2 | 2015-09-15 21:28:06 -0500 | [diff] [blame] | 60 | 		//if changed, set property and emit signal
 | 
 | 61 | 		if (gpio != control_power_get_pgood(control_power))
 | 
 | 62 | 		{
 | 
 | 63 |  			control_power_set_pgood(control_power,gpio);
 | 
 | 64 |  			if (gpio==0)
 | 
 | 65 |  			{
 | 
 | 66 |  				control_power_emit_power_lost(control_power);
 | 
| Norman James | a3e47c4 | 2015-10-18 14:43:10 -0500 | [diff] [blame] | 67 | 				control_emit_goto_system_state(control,"HOST_POWERED_OFF");
 | 
| Norman James | 32e74e2 | 2015-09-15 21:28:06 -0500 | [diff] [blame] | 68 |  			}
 | 
 | 69 |  			else
 | 
 | 70 |  			{
 | 
 | 71 |  				control_power_emit_power_good(control_power);
 | 
| Norman James | a3e47c4 | 2015-10-18 14:43:10 -0500 | [diff] [blame] | 72 | 				control_emit_goto_system_state(control,"HOST_POWERED_ON");
 | 
| Norman James | 32e74e2 | 2015-09-15 21:28:06 -0500 | [diff] [blame] | 73 |  			}
 | 
 | 74 | 		}
 | 
 | 75 | 	} else {
 | 
| Norman James | 2891c53 | 2015-10-06 08:01:56 -0500 | [diff] [blame] | 76 | 		printf("ERROR PowerControl: GPIO read error (gpio=%s,rc=%d)\n",pgood.name,rc);
 | 
| Norman James | a3e47c4 | 2015-10-18 14:43:10 -0500 | [diff] [blame] | 77 | 		//return false so poll won't get called anymore
 | 
 | 78 | 		return FALSE;
 | 
| Norman James | 32e74e2 | 2015-09-15 21:28:06 -0500 | [diff] [blame] | 79 | 	}
 | 
 | 80 | 	//pgood is not at desired state yet
 | 
 | 81 | 	if (gpio != control_power_get_state(control_power) &&
 | 
| Norman James | 8887267 | 2015-09-21 16:51:35 -0500 | [diff] [blame] | 82 | 		control_power_get_pgood_timeout(control_power) > 0)
 | 
| Norman James | 32e74e2 | 2015-09-15 21:28:06 -0500 | [diff] [blame] | 83 | 	{
 | 
| Norman James | 8887267 | 2015-09-21 16:51:35 -0500 | [diff] [blame] | 84 | 		if (pgood_timeout_start == 0 ) {
 | 
 | 85 | 			pgood_timeout_start = current_time;
 | 
 | 86 | 		}
 | 
| Norman James | 32e74e2 | 2015-09-15 21:28:06 -0500 | [diff] [blame] | 87 | 	}
 | 
 | 88 | 	else 
 | 
 | 89 | 	{
 | 
| Norman James | 8887267 | 2015-09-21 16:51:35 -0500 | [diff] [blame] | 90 | 		pgood_timeout_start = 0;
 | 
| Norman James | 362a80f | 2015-09-14 14:04:39 -0500 | [diff] [blame] | 91 | 	}
 | 
| Norman James | ce46e3e | 2015-08-30 22:25:55 -0500 | [diff] [blame] | 92 | 	return TRUE;
 | 
 | 93 | }
 | 
 | 94 | 
 | 
 | 95 | 
 | 
 | 96 | 
 | 
| Norman James | e276510 | 2015-08-19 22:00:55 -0500 | [diff] [blame] | 97 | static gboolean
 | 
| Norman James | 3f97c5d | 2015-08-26 17:44:14 -0500 | [diff] [blame] | 98 | on_set_power_state (ControlPower          *pwr,
 | 
| Norman James | e276510 | 2015-08-19 22:00:55 -0500 | [diff] [blame] | 99 |                 GDBusMethodInvocation  *invocation,
 | 
 | 100 |                 guint                   state,
 | 
 | 101 |                 gpointer                user_data)
 | 
 | 102 | {
 | 
| Norman James | 362a80f | 2015-09-14 14:04:39 -0500 | [diff] [blame] | 103 | 	Control* control = object_get_control((Object*)user_data);
 | 
| Norman James | 32e74e2 | 2015-09-15 21:28:06 -0500 | [diff] [blame] | 104 | 	const gchar* obj_path = g_dbus_object_get_object_path((GDBusObject*)user_data);
 | 
| Norman James | 3f97c5d | 2015-08-26 17:44:14 -0500 | [diff] [blame] | 105 | 	if (state > 1)
 | 
 | 106 | 	{
 | 
 | 107 | 		g_dbus_method_invocation_return_dbus_error (invocation,
 | 
 | 108 |                                                 "org.openbmc.ControlPower.Error.Failed",
 | 
 | 109 |                                                 "Invalid power state");
 | 
 | 110 | 		return TRUE;
 | 
 | 111 | 	}
 | 
| Norman James | 9e6acf9 | 2015-09-08 07:00:04 -0500 | [diff] [blame] | 112 | 	// return from method call
 | 
 | 113 | 	control_power_complete_set_power_state(pwr,invocation);
 | 
| Norman James | 3f97c5d | 2015-08-26 17:44:14 -0500 | [diff] [blame] | 114 | 	if (state == control_power_get_state(pwr))
 | 
 | 115 | 	{
 | 
| Norman James | 9e6acf9 | 2015-09-08 07:00:04 -0500 | [diff] [blame] | 116 | 		g_print("Power already at requested state: %d\n",state);
 | 
| Norman James | 3f97c5d | 2015-08-26 17:44:14 -0500 | [diff] [blame] | 117 | 	}
 | 
| Norman James | 9e6acf9 | 2015-09-08 07:00:04 -0500 | [diff] [blame] | 118 | 	else
 | 
 | 119 | 	{
 | 
| Norman James | 32e74e2 | 2015-09-15 21:28:06 -0500 | [diff] [blame] | 120 | 		int error = 0;
 | 
 | 121 | 		do {
 | 
| Norman James | 19e4591 | 2015-10-04 20:19:41 -0500 | [diff] [blame] | 122 | 			if (state == 1) {
 | 
| Norman James | a3e47c4 | 2015-10-18 14:43:10 -0500 | [diff] [blame] | 123 | 				control_emit_goto_system_state(control,"HOST_POWERING_ON");
 | 
| Norman James | 19e4591 | 2015-10-04 20:19:41 -0500 | [diff] [blame] | 124 | 			} else {
 | 
| Norman James | a3e47c4 | 2015-10-18 14:43:10 -0500 | [diff] [blame] | 125 | 				control_emit_goto_system_state(control,"HOST_POWERING_OFF");
 | 
| Norman James | 19e4591 | 2015-10-04 20:19:41 -0500 | [diff] [blame] | 126 | 			}
 | 
| Norman James | 32e74e2 | 2015-09-15 21:28:06 -0500 | [diff] [blame] | 127 | 			error = gpio_open(&power_pin);
 | 
| Norman James | 8887267 | 2015-09-21 16:51:35 -0500 | [diff] [blame] | 128 | 			if (error != GPIO_OK) { break;	}
 | 
| Norman James | 32e74e2 | 2015-09-15 21:28:06 -0500 | [diff] [blame] | 129 | 			error = gpio_write(&power_pin,!state);
 | 
| Norman James | 8887267 | 2015-09-21 16:51:35 -0500 | [diff] [blame] | 130 | 			if (error != GPIO_OK) { break;	}
 | 
| Norman James | 32e74e2 | 2015-09-15 21:28:06 -0500 | [diff] [blame] | 131 | 			gpio_close(&power_pin);
 | 
 | 132 | 			control_power_set_state(pwr,state);
 | 
| Norman James | 32e74e2 | 2015-09-15 21:28:06 -0500 | [diff] [blame] | 133 | 		} while(0);
 | 
 | 134 | 		if (error != GPIO_OK)
 | 
| Norman James | 362a80f | 2015-09-14 14:04:39 -0500 | [diff] [blame] | 135 | 		{
 | 
| Norman James | 2891c53 | 2015-10-06 08:01:56 -0500 | [diff] [blame] | 136 | 			printf("ERROR PowerControl: GPIO set power state (rc=%d)\n",error);
 | 
| Norman James | 362a80f | 2015-09-14 14:04:39 -0500 | [diff] [blame] | 137 | 		}
 | 
| Norman James | 9e6acf9 | 2015-09-08 07:00:04 -0500 | [diff] [blame] | 138 | 	}
 | 
 | 139 | 	return TRUE;
 | 
 | 140 | }
 | 
| Norman James | e276510 | 2015-08-19 22:00:55 -0500 | [diff] [blame] | 141 | 
 | 
| Norman James | 9e6acf9 | 2015-09-08 07:00:04 -0500 | [diff] [blame] | 142 | static gboolean
 | 
 | 143 | on_init (Control         *control,
 | 
 | 144 |          GDBusMethodInvocation  *invocation,
 | 
 | 145 |          gpointer                user_data)
 | 
 | 146 | {
 | 
| Norman James | 8887267 | 2015-09-21 16:51:35 -0500 | [diff] [blame] | 147 | 	pgood_timeout_start = 0;
 | 
| Norman James | 9e6acf9 | 2015-09-08 07:00:04 -0500 | [diff] [blame] | 148 | 	guint poll_interval = control_get_poll_interval(control);
 | 
 | 149 | 	g_timeout_add(poll_interval, poll_pgood, user_data);
 | 
 | 150 | 	control_complete_init(control,invocation);
 | 
| Norman James | 3f97c5d | 2015-08-26 17:44:14 -0500 | [diff] [blame] | 151 | 	return TRUE;
 | 
| Norman James | e276510 | 2015-08-19 22:00:55 -0500 | [diff] [blame] | 152 | }
 | 
 | 153 | 
 | 
 | 154 | static gboolean
 | 
| Norman James | 3f97c5d | 2015-08-26 17:44:14 -0500 | [diff] [blame] | 155 | on_get_power_state (ControlPower          *pwr,
 | 
| Norman James | e276510 | 2015-08-19 22:00:55 -0500 | [diff] [blame] | 156 |                 GDBusMethodInvocation  *invocation,
 | 
 | 157 |                 gpointer                user_data)
 | 
 | 158 | {
 | 
| Norman James | 3f97c5d | 2015-08-26 17:44:14 -0500 | [diff] [blame] | 159 | 	guint pgood = control_power_get_pgood(pwr);
 | 
 | 160 | 	control_power_complete_get_power_state(pwr,invocation,pgood);
 | 
 | 161 | 	return TRUE;
 | 
| Norman James | e276510 | 2015-08-19 22:00:55 -0500 | [diff] [blame] | 162 | }
 | 
 | 163 | 
 | 
 | 164 | static void 
 | 
 | 165 | on_bus_acquired (GDBusConnection *connection,
 | 
 | 166 |                  const gchar     *name,
 | 
 | 167 |                  gpointer         user_data)
 | 
 | 168 | {
 | 
| Norman James | 3f97c5d | 2015-08-26 17:44:14 -0500 | [diff] [blame] | 169 | 	ObjectSkeleton *object;
 | 
| Norman James | 10ff6a3 | 2015-08-27 14:24:17 -0500 | [diff] [blame] | 170 |  	cmdline *cmd = user_data;
 | 
 | 171 | 	if (cmd->argc < 2)
 | 
 | 172 | 	{
 | 
 | 173 | 		g_print("No objects created.  Put object name(s) on command line\n");
 | 
 | 174 | 		return;
 | 
 | 175 | 	}	
 | 
 | 176 |   	manager = g_dbus_object_manager_server_new (dbus_object_path);
 | 
| Norman James | 8887267 | 2015-09-21 16:51:35 -0500 | [diff] [blame] | 177 | 	gchar *s;
 | 
 | 178 |   	s = g_strdup_printf ("%s/%s",dbus_object_path,cmd->argv[1]);
 | 
| Norman James | 8887267 | 2015-09-21 16:51:35 -0500 | [diff] [blame] | 179 |   	object = object_skeleton_new (s);
 | 
 | 180 |   	g_free (s);
 | 
| Norman James | e276510 | 2015-08-19 22:00:55 -0500 | [diff] [blame] | 181 | 
 | 
| Norman James | 8887267 | 2015-09-21 16:51:35 -0500 | [diff] [blame] | 182 | 	ControlPower* control_power = control_power_skeleton_new ();
 | 
 | 183 | 	object_skeleton_set_control_power (object, control_power);
 | 
 | 184 | 	g_object_unref (control_power);
 | 
 | 185 | 	
 | 
 | 186 | 	Control* control = control_skeleton_new ();
 | 
 | 187 | 	object_skeleton_set_control (object, control);
 | 
 | 188 | 	g_object_unref (control);
 | 
| Norman James | e276510 | 2015-08-19 22:00:55 -0500 | [diff] [blame] | 189 | 
 | 
| Norman James | 8887267 | 2015-09-21 16:51:35 -0500 | [diff] [blame] | 190 | 	//define method callbacks here
 | 
 | 191 | 	g_signal_connect (control_power,
 | 
 | 192 |        	            "handle-set-power-state",
 | 
 | 193 |                	    G_CALLBACK (on_set_power_state),
 | 
 | 194 |                	    object); /* user_data */
 | 
| Norman James | ce46e3e | 2015-08-30 22:25:55 -0500 | [diff] [blame] | 195 | 
 | 
| Norman James | 8887267 | 2015-09-21 16:51:35 -0500 | [diff] [blame] | 196 | 	g_signal_connect (control_power,
 | 
 | 197 |                	    "handle-get-power-state",
 | 
 | 198 |                	    G_CALLBACK (on_get_power_state),
 | 
 | 199 |                	    NULL); /* user_data */
 | 
| Norman James | e276510 | 2015-08-19 22:00:55 -0500 | [diff] [blame] | 200 | 
 | 
| Norman James | 8887267 | 2015-09-21 16:51:35 -0500 | [diff] [blame] | 201 | 	g_signal_connect (control,
 | 
 | 202 |                	    "handle-init",
 | 
 | 203 |                	    G_CALLBACK (on_init),
 | 
 | 204 |                	    object); /* user_data */
 | 
| Norman James | 9e6acf9 | 2015-09-08 07:00:04 -0500 | [diff] [blame] | 205 | 
 | 
 | 206 | 
 | 
| Norman James | 8887267 | 2015-09-21 16:51:35 -0500 | [diff] [blame] | 207 | 	/* Export the object (@manager takes its own reference to @object) */
 | 
 | 208 | 	g_dbus_object_manager_server_export (manager, G_DBUS_OBJECT_SKELETON (object));
 | 
 | 209 | 	g_object_unref (object);
 | 
| Norman James | ce46e3e | 2015-08-30 22:25:55 -0500 | [diff] [blame] | 210 | 
 | 
| Norman James | 3f97c5d | 2015-08-26 17:44:14 -0500 | [diff] [blame] | 211 | 	/* Export all objects */
 | 
 | 212 | 	g_dbus_object_manager_server_set_connection (manager, connection);
 | 
 | 213 | 
 | 
 | 214 | 	// get gpio device paths
 | 
| Norman James | bd4abd1 | 2015-09-16 22:43:46 -0500 | [diff] [blame] | 215 | 	int rc = GPIO_OK;
 | 
| Norman James | 32e74e2 | 2015-09-15 21:28:06 -0500 | [diff] [blame] | 216 | 	do {
 | 
| Norman James | 32e74e2 | 2015-09-15 21:28:06 -0500 | [diff] [blame] | 217 | 		rc = gpio_init(connection,&power_pin);
 | 
 | 218 | 		if (rc != GPIO_OK) { break; }
 | 
 | 219 | 		rc = gpio_init(connection,&pgood);
 | 
 | 220 | 		if (rc != GPIO_OK) { break; }
 | 
| Norman James | 65a295a | 2015-09-26 22:21:10 -0500 | [diff] [blame] | 221 | 		uint8_t gpio;
 | 
| Norman James | 32e74e2 | 2015-09-15 21:28:06 -0500 | [diff] [blame] | 222 | 		rc = gpio_open(&pgood);
 | 
| Norman James | 65a295a | 2015-09-26 22:21:10 -0500 | [diff] [blame] | 223 | 		if (rc != GPIO_OK) { break; }
 | 
 | 224 | 		rc = gpio_read(&pgood,&gpio);
 | 
 | 225 | 		if (rc != GPIO_OK) { break; }
 | 
 | 226 | 		gpio_close(&pgood);	
 | 
 | 227 | 		control_power_set_pgood(control_power,gpio);
 | 
| Norman James | f66005a | 2015-10-08 15:11:44 -0500 | [diff] [blame] | 228 | 		printf("Pgood state: %d\n",gpio);
 | 
| Norman James | 32e74e2 | 2015-09-15 21:28:06 -0500 | [diff] [blame] | 229 | 	} while(0);
 | 
| Norman James | bd4abd1 | 2015-09-16 22:43:46 -0500 | [diff] [blame] | 230 | 	if (rc != GPIO_OK)
 | 
 | 231 | 	{
 | 
| Norman James | 2891c53 | 2015-10-06 08:01:56 -0500 | [diff] [blame] | 232 | 		printf("ERROR PowerControl: GPIO setup (rc=%d)\n",rc);
 | 
| Norman James | 65a295a | 2015-09-26 22:21:10 -0500 | [diff] [blame] | 233 | 	} 
 | 
| Norman James | e276510 | 2015-08-19 22:00:55 -0500 | [diff] [blame] | 234 | }
 | 
 | 235 | 
 | 
 | 236 | static void
 | 
 | 237 | on_name_acquired (GDBusConnection *connection,
 | 
 | 238 |                   const gchar     *name,
 | 
 | 239 |                   gpointer         user_data)
 | 
 | 240 | {
 | 
| Norman James | e276510 | 2015-08-19 22:00:55 -0500 | [diff] [blame] | 241 | }
 | 
 | 242 | 
 | 
 | 243 | static void
 | 
 | 244 | on_name_lost (GDBusConnection *connection,
 | 
 | 245 |               const gchar     *name,
 | 
 | 246 |               gpointer         user_data)
 | 
 | 247 | {
 | 
| Norman James | e276510 | 2015-08-19 22:00:55 -0500 | [diff] [blame] | 248 | }
 | 
 | 249 | 
 | 
| Norman James | e276510 | 2015-08-19 22:00:55 -0500 | [diff] [blame] | 250 | 
 | 
| Norman James | 3f97c5d | 2015-08-26 17:44:14 -0500 | [diff] [blame] | 251 | 
 | 
 | 252 | 
 | 
 | 253 | /*----------------------------------------------------------------*/
 | 
 | 254 | /* Main Event Loop                                                */
 | 
 | 255 | 
 | 
| Norman James | e276510 | 2015-08-19 22:00:55 -0500 | [diff] [blame] | 256 | gint
 | 
 | 257 | main (gint argc, gchar *argv[])
 | 
 | 258 | {
 | 
 | 259 |   GMainLoop *loop;
 | 
| Norman James | 90caa3c | 2015-08-27 21:28:48 -0500 | [diff] [blame] | 260 |   cmdline cmd;
 | 
 | 261 |   cmd.argc = argc;
 | 
 | 262 |   cmd.argv = argv;
 | 
| Norman James | e276510 | 2015-08-19 22:00:55 -0500 | [diff] [blame] | 263 | 
 | 
 | 264 |   guint id;
 | 
| Norman James | e276510 | 2015-08-19 22:00:55 -0500 | [diff] [blame] | 265 |   loop = g_main_loop_new (NULL, FALSE);
 | 
 | 266 | 
 | 
| Norman James | 5e792e3 | 2015-10-07 17:36:17 -0500 | [diff] [blame] | 267 |   id = g_bus_own_name (DBUS_TYPE,
 | 
| Norman James | 26072c0 | 2015-08-25 07:14:29 -0500 | [diff] [blame] | 268 |                        dbus_name,
 | 
| Norman James | e276510 | 2015-08-19 22:00:55 -0500 | [diff] [blame] | 269 |                        G_BUS_NAME_OWNER_FLAGS_ALLOW_REPLACEMENT |
 | 
 | 270 |                        G_BUS_NAME_OWNER_FLAGS_REPLACE,
 | 
 | 271 |                        on_bus_acquired,
 | 
 | 272 |                        on_name_acquired,
 | 
 | 273 |                        on_name_lost,
 | 
| Norman James | 90caa3c | 2015-08-27 21:28:48 -0500 | [diff] [blame] | 274 |                        &cmd,
 | 
| Norman James | e276510 | 2015-08-19 22:00:55 -0500 | [diff] [blame] | 275 |                        NULL);
 | 
 | 276 | 
 | 
| Norman James | ce46e3e | 2015-08-30 22:25:55 -0500 | [diff] [blame] | 277 |    g_main_loop_run (loop);
 | 
| Norman James | e276510 | 2015-08-19 22:00:55 -0500 | [diff] [blame] | 278 |   
 | 
 | 279 |   g_bus_unown_name (id);
 | 
 | 280 |   g_main_loop_unref (loop);
 | 
 | 281 |   return 0;
 | 
 | 282 | }
 |