diff options
author | kremlin <ian@kremlin.cc> | 2014-08-08 13:22:35 +0800 |
---|---|---|
committer | kremlin <ian@kremlin.cc> | 2014-08-08 13:22:35 +0800 |
commit | 3572d013e022b3361e0c6828e38474230789c136 (patch) | |
tree | adf53b782037bdb4b01165c134dd35b5dd20842f | |
parent | 3a3ab0fe910260a4abd0e84b373102fe8169d4ea (diff) | |
download | systembsd-3572d013e022b3361e0c6828e38474230789c136.tar systembsd-3572d013e022b3361e0c6828e38474230789c136.tar.gz systembsd-3572d013e022b3361e0c6828e38474230789c136.tar.bz2 systembsd-3572d013e022b3361e0c6828e38474230789c136.tar.lz systembsd-3572d013e022b3361e0c6828e38474230789c136.tar.xz systembsd-3572d013e022b3361e0c6828e38474230789c136.tar.zst systembsd-3572d013e022b3361e0c6828e38474230789c136.zip |
add SetHostname functionality
sethostname now works, cleans up after itself properly and
cleans/checks incoming data before trying to sethostname(3).
-rw-r--r-- | src/interfaces/hostnamed/hostnamed.c | 31 |
1 files changed, 30 insertions, 1 deletions
diff --git a/src/interfaces/hostnamed/hostnamed.c b/src/interfaces/hostnamed/hostnamed.c index 0e5c93c..52a419b 100644 --- a/src/interfaces/hostnamed/hostnamed.c +++ b/src/interfaces/hostnamed/hostnamed.c @@ -110,12 +110,41 @@ const gchar *server_archs[] = { /* --- begin method/property/dbus signal code --- */ +/* TODO the extra boolean passed to these funcs is for policykit auth */ +/* TODO complete call with error, message, etc */ static gboolean on_handle_set_hostname(Hostname1 *hn1_passed_interf, GDBusMethodInvocation *invoc, const gchar *greet, gpointer data) { - return FALSE; + GVariant *params; + gchar *proposed_hostname, *valid_hostname_buf; + gboolean policykit_auth, ret; + size_t check_length, bad_length; + + bad_length = MAXHOSTNAMELEN + 1; + proposed_hostname = NULL; + ret = FALSE; + + params = g_dbus_method_invocation_get_parameters(invoc); + g_variant_get(params, "(sb)", &proposed_hostname, &policykit_auth); + + if(proposed_hostname && (valid_hostname_buf = g_hostname_to_ascii(proposed_hostname))) { + + check_length = strnlen(proposed_hostname, bad_length); + + if(check_length < bad_length && !sethostname(proposed_hostname, check_length)) + ret = TRUE; + } + + hostname1_complete_set_hostname(hn1_passed_interf, invoc); + + if(proposed_hostname) + g_free(proposed_hostname); + if(valid_hostname_buf) + g_free(valid_hostname_buf); + + return ret; } static gboolean |