diff options
Diffstat (limited to 'plugins/usbpnmodem.c')
-rw-r--r-- | plugins/usbpnmodem.c | 98 |
1 files changed, 98 insertions, 0 deletions
diff --git a/plugins/usbpnmodem.c b/plugins/usbpnmodem.c new file mode 100644 index 00000000..5f06e9d5 --- /dev/null +++ b/plugins/usbpnmodem.c @@ -0,0 +1,98 @@ +/* + * This file is part of oFono - Open Source Telephony + * + * Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * version 2 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 warranty of + * MERCHANTABILITY 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, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA + * 02110-1301 USA + * + */ + +#ifdef HAVE_CONFIG_H +#include <config.h> +#endif + +#include <stdio.h> +#include <errno.h> +#include <stdlib.h> +#include <string.h> +#include <glib.h> + +#include <gisi/netlink.h> +#include <gisi/client.h> + +#define OFONO_API_SUBJECT_TO_CHANGE +#include <ofono/plugin.h> +#include <ofono/log.h> +#include <ofono/modem.h> + +static GPhonetNetlink *link = NULL; + +/* + * Add or remove isimodems + * when usbpn* phonet interfaces are added/removed + */ +static void usbpn_status_cb(GIsiModem *idx, + GPhonetLinkState st, + char const ifname[], + void *data) +{ + struct ofono_modem *modem; + + DBG("Phonet link %s (%u) is %s", + ifname, g_isi_modem_index(idx), + st == PN_LINK_REMOVED ? "removed" : + st == PN_LINK_DOWN ? "down" : "up"); + + /* Expect phonet interface name usbpn<idx> */ + if (strncmp(ifname, "usbpn", 5) || + ifname[5 + strspn(ifname + 5, "0123456789")]) + return; + + if (st == PN_LINK_REMOVED) + return; + + link = g_pn_netlink_by_name(ifname); + if (link) { + DBG("Modem for interface %s already exists", ifname); + return; + } + + modem = ofono_modem_create(NULL, "isimodem"); + if (!modem) + return; + + ofono_modem_set_string(modem, "Interface", ifname); + + if (ofono_modem_register(modem) == 0) + DBG("Done regging modem %s", ofono_modem_get_path(modem)); + else + ofono_modem_remove(modem); +} + +static int usbpn_init(void) +{ + link = g_pn_netlink_start(NULL, usbpn_status_cb, NULL); + return 0; +} + +static void usbpn_exit(void) +{ + g_pn_netlink_stop(link); + link = NULL; +} + +OFONO_PLUGIN_DEFINE(usbpnmodem, "Hotplug driver for USB Phonet modems", VERSION, + OFONO_PLUGIN_PRIORITY_DEFAULT, + usbpn_init, usbpn_exit) |