Add helper script and configuration file for DHCP support
authorMarcel Holtmann <marcel@holtmann.org>
Mon, 24 Dec 2007 02:00:36 +0000 (03:00 +0100)
committerMarcel Holtmann <marcel@holtmann.org>
Mon, 24 Dec 2007 02:00:36 +0000 (03:00 +0100)
Makefile.am
configure.in
scripts/Makefile.am [new file with mode: 0644]
scripts/dhclient-script.c [new file with mode: 0644]
scripts/dhclient.conf [new file with mode: 0644]

index 0a0969f..52247b9 100644 (file)
@@ -1,5 +1,5 @@
 
-SUBDIRS = include src plugins
+SUBDIRS = include src plugins scripts
 
 MAINTAINERCLEANFILES = Makefile.in \
        aclocal.m4 configure config.h.in config.sub config.guess \
index 930691a..8f13afc 100644 (file)
@@ -34,9 +34,15 @@ PKG_CHECK_MODULES(GDBUS, gdbus, dummy=yes,
 AC_SUBST(GDBUS_CFLAGS)
 AC_SUBST(GDBUS_LIBS)
 
+PKG_CHECK_MODULES(DBUS, dbus-1 >= 1.0, dummy=yes,
+                               AC_MSG_ERROR(libdbus is required))
+AC_SUBST(DBUS_CFLAGS)
+AC_SUBST(DBUS_LIBS)
+
 PKG_CHECK_MODULES(HAL, hal >= 0.5.8, dummy=yes,
                                AC_MSG_ERROR(libhal is required))
 AC_SUBST(HAL_CFLAGS)
 AC_SUBST(HAL_LIBS)
 
-AC_OUTPUT(Makefile include/Makefile src/Makefile plugins/Makefile)
+AC_OUTPUT(Makefile include/Makefile src/Makefile
+                       plugins/Makefile scripts/Makefile)
diff --git a/scripts/Makefile.am b/scripts/Makefile.am
new file mode 100644 (file)
index 0000000..bb79358
--- /dev/null
@@ -0,0 +1,14 @@
+
+scriptdir = $(libdir)/connman/scripts
+
+script_DATA = dhclient.conf
+
+script_PROGRAMS = dhclient-script
+
+dhclient_script_LDADD = @DBUS_LIBS@
+
+AM_CFLAGS = @DBUS_CFLAGS@
+
+EXTRA_DIST = $(script_DATA)
+
+MAINTAINERCLEANFILES = Makefile.in
diff --git a/scripts/dhclient-script.c b/scripts/dhclient-script.c
new file mode 100644 (file)
index 0000000..39b235c
--- /dev/null
@@ -0,0 +1,110 @@
+/*
+ *
+ *  Connection Manager
+ *
+ *  Copyright (C) 2007  Intel Corporation. All rights reserved.
+ *
+ *  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 <stdlib.h>
+#include <string.h>
+
+#include <dbus/dbus.h>
+
+extern char **environ;
+
+static void append(DBusMessageIter *dict, const char *pattern)
+{
+       DBusMessageIter entry;
+       const char *key, *value;
+       char *delim;
+
+       delim = strchr(pattern, '=');
+       *delim = '\0';
+
+       key = pattern;
+       value = delim + 1;
+
+       dbus_message_iter_open_container(dict, DBUS_TYPE_DICT_ENTRY,
+                                                       NULL, &entry);
+
+       dbus_message_iter_append_basic(&entry, DBUS_TYPE_STRING, &key);
+
+       dbus_message_iter_append_basic(&entry, DBUS_TYPE_STRING, &value);
+
+       dbus_message_iter_close_container(dict, &entry);
+}
+
+int main(int argc, char *argv[])
+{
+       DBusConnection *conn;
+       DBusMessage *msg;
+       DBusMessageIter iter, dict;
+       dbus_uint32_t pid;
+       char **envp, *busname, *reason, *interface;
+
+       busname = getenv("BUSNAME");
+
+       pid = atoi(getenv("pid"));
+       reason = getenv("reason");
+       interface = getenv("interface");
+
+       conn = dbus_bus_get(DBUS_BUS_SYSTEM, NULL);
+       if (conn == NULL)
+               exit(1);
+
+       msg = dbus_message_new_method_call(busname, "/org/isc/dhclient",
+                                               "org.isc.dhclient", "notify");
+       if (msg == NULL) {
+               dbus_connection_unref(conn);
+               exit(1);
+       }
+
+       dbus_message_append_args(msg, DBUS_TYPE_UINT32, &pid,
+                               DBUS_TYPE_STRING, &reason, DBUS_TYPE_INVALID);
+
+       dbus_message_iter_init_append(msg, &iter);
+
+       dbus_message_iter_open_container(&iter, DBUS_TYPE_ARRAY,
+                       DBUS_DICT_ENTRY_BEGIN_CHAR_AS_STRING
+                       DBUS_TYPE_STRING_AS_STRING DBUS_TYPE_STRING_AS_STRING
+                       DBUS_DICT_ENTRY_END_CHAR_AS_STRING, &dict);
+
+       for (envp = environ; envp && *envp; envp++) {
+               if (strlen(*envp) < 5)
+                       continue;
+
+               if (strncmp(*envp, "new_", 4) == 0 ||
+                               strncmp(*envp, "old_", 4) == 0 ||
+                                       strncmp(*envp, "alia", 4) == 0)
+                       append(&dict, *envp);
+       }
+
+       dbus_message_iter_close_container(&iter, &dict);
+
+       dbus_connection_send(conn, msg, NULL);
+
+       dbus_message_unref(msg);
+
+       dbus_connection_unref(conn);
+
+       return 0;
+}
diff --git a/scripts/dhclient.conf b/scripts/dhclient.conf
new file mode 100644 (file)
index 0000000..4b206a3
--- /dev/null
@@ -0,0 +1,3 @@
+send host-name "<hostname>";
+request subnet-mask, broadcast-address, time-offset, routers,
+       domain-name, domain-name-servers, host-name;