Fix agent cleanup function
[platform/upstream/connman.git] / src / agent.c
1 /*
2  *
3  *  Connection Manager
4  *
5  *  Copyright (C) 2007  Intel Corporation. All rights reserved.
6  *
7  *  This program is free software; you can redistribute it and/or modify
8  *  it under the terms of the GNU General Public License version 2 as
9  *  published by the Free Software Foundation.
10  *
11  *  This program is distributed in the hope that it will be useful,
12  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
13  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14  *  GNU General Public License for more details.
15  *
16  *  You should have received a copy of the GNU General Public License
17  *  along with this program; if not, write to the Free Software
18  *  Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
19  *
20  */
21
22 #ifdef HAVE_CONFIG_H
23 #include <config.h>
24 #endif
25
26 #include <errno.h>
27 #include <stdlib.h>
28 #include <string.h>
29
30 #include <gdbus.h>
31
32 #include "connman.h"
33
34 static DBusConnection *connection = NULL;
35 static guint agent_watch = 0;
36 static gchar *agent_path = NULL;
37 static gchar *agent_sender = NULL;
38
39 static void agent_free(void)
40 {
41         agent_watch = 0;
42
43         g_free(agent_sender);
44         agent_sender = NULL;
45
46         g_free(agent_path);
47         agent_path = NULL;
48 }
49
50 static gboolean agent_disconnect(void *data)
51 {
52         DBG("data %p", data);
53
54         agent_free();
55
56         return TRUE;
57 }
58
59 int __connman_agent_register(const char *sender, const char *path)
60 {
61         DBG("sender %s path %s", sender, path);
62
63         if (agent_path != NULL)
64                 return -EEXIST;
65
66         agent_sender = g_strdup(sender);
67         agent_path = g_strdup(path);
68
69         agent_watch = g_dbus_add_disconnect_watch(connection, sender,
70                                                 agent_disconnect, NULL, NULL);
71
72         return 0;
73 }
74
75 int __connman_agent_unregister(const char *sender, const char *path)
76 {
77         DBG("sender %s path %s", sender, path);
78
79         if (agent_path == NULL)
80                 return -ENOENT;
81
82         if (agent_watch > 0)
83                 g_dbus_remove_watch(connection, agent_watch);
84
85         agent_free();
86
87         return 0;
88 }
89
90 int __connman_agent_init(DBusConnection *conn)
91 {
92         DBG("conn %p", conn);
93
94         connection = dbus_connection_ref(conn);
95         if (connection == NULL)
96                 return -1;
97
98         return 0;
99 }
100
101 void __connman_agent_cleanup(void)
102 {
103         DBusMessage *msg;
104
105         DBG("conn %p", connection);
106
107         if (agent_watch > 0)
108                 g_dbus_remove_watch(connection, agent_watch);
109
110         if (agent_path == NULL)
111                 return;
112
113         msg = dbus_message_new_method_call(agent_sender, agent_path,
114                                         CONNMAN_AGENT_INTERFACE, "Release");
115         if (msg == NULL)
116                 return;
117
118         dbus_message_set_no_reply(msg, TRUE);
119
120         dbus_connection_send(connection, msg, NULL);
121
122         dbus_message_unref(msg);
123
124         agent_free();
125
126         dbus_connection_unref(connection);
127 }