X-Git-Url: https://uglyman.kremlin.cc/gitweb/gitweb.cgi?p=systembsd.git;a=blobdiff_plain;f=src%2Finterfaces%2Ftimedated%2Ftimedated.c;h=41483a4ac162d7b46534c9d4fb406dd64f5a61c8;hp=0aee4dc430764a6ff1ebb5c22d2264370a509d22;hb=fe95904343623a78153b89fd1c2f1c0c4544c606;hpb=a8f7171993dc1467e353bbd1f7c712c31f2b846b diff --git a/src/interfaces/timedated/timedated.c b/src/interfaces/timedated/timedated.c index 0aee4dc..41483a4 100644 --- a/src/interfaces/timedated/timedated.c +++ b/src/interfaces/timedated/timedated.c @@ -101,12 +101,43 @@ on_handle_set_time(Timedate1 *td1_passed_interf, return FALSE; } - if(relative) { + if(!proposed_time) { + + timedate1_complete_set_time(td1_passed_interf, invoc); + return TRUE; - new_time = (struct timespec *) g_malloc0(sizeof(struct timespec)); + } else if(relative) { + new_time = (struct timespec *) g_malloc0(sizeof(struct timespec)); cur_time = g_get_real_time(); - /* LEFT OFF HERE 9/13 */ return FALSE; + + if(proposed_time < 0 && cur_time + proposed_time > proposed_time) { + + g_dbus_method_invocation_return_dbus_error(invoc, "org.freedesktop.timedate1.Error.EINVAL", "Resultant time out of bounds."); + return FALSE; + + } else if(cur_time + proposed_time < proposed_time) { + + g_dbus_method_invocation_return_dbus_error(invoc, "org.freedesktop.timedate1.Error.EINVAL", "Resultant time out of bounds."); + return FALSE; + } + + new_time = (struct timespec *) g_malloc0(sizeof(struct timespec)); + new_time->tv_sec = proposed_time; + new_time->tv_nsec = 0; + g_ptr_array_add(timedated_freeable, new_time); + + if(!clock_settime(CLOCK_REALTIME, new_time)) { + + timedate1_complete_set_time(td1_passed_interf, invoc); + return TRUE; + + } else { + + g_dbus_method_invocation_return_dbus_error(invoc, "org.freedesktop.timedate1.Error.ECANCELED", "Failed to set system time for unknown reasons."); + return FALSE; + } + } else if(proposed_time >= 0) { new_time = (struct timespec *) g_malloc0(sizeof(struct timespec)); @@ -124,9 +155,10 @@ on_handle_set_time(Timedate1 *td1_passed_interf, g_dbus_method_invocation_return_dbus_error(invoc, "org.freedesktop.timedate1.Error.ECANCELED", "Failed to set system time for unknown reasons."); return FALSE; } + } else { - g_dbus_method_invocation_return_dbus_error(invoc, "org.freedesktop.timedate1.EDOM", "Provided time results in a negative clock value."); + g_dbus_method_invocation_return_dbus_error(invoc, "org.freedesktop.timedate1.Error.EINVAL", "Resultant time out of bounds."); return FALSE; } }