#include <sys/types.h>
#include <sys/socket.h>
#include <string.h>
#include <stdlib.h>
#include <limits.h>
#include <unistd.h>
#include <stdio.h>
#include <errno.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <sys/ioctl.h>
#include <sys/time.h>
#include <sys/times.h>
#include <time.h>
#include <signal.h>
#include <ctype.h>
#include <libosso.h>
#include <cityinfo.h>
#include "codec.h"
#include <dbus/dbus-glib-lowlevel.h>
#include <assert.h>
#include "logging.h"
#include "server.h"
#include "libtime.h"
#include "clock_dbus.h"
Data Structures | |
struct | TZCountryResultData |
Functions | |
static gboolean | handle_alarm (DBusConnection *bus) |
static void | server_setup_timezone_from_mcc_if_required (void) |
static int | get_dst (time_t tick) |
static int | read_conf () |
static int | save_conf (void) |
static int | get_utc_offset (time_t tick, int dst) |
static void | dump_date (void) |
static int | send_time_change_indication (time_t t) |
static int | set_time (time_t t) |
static DBusMessage * | server_new_rsp (DBusMessage *msg, int type,...) |
static DBusMessage * | server_set_time (DBusMessage *msg) |
static int | set_tz (const char *tz) |
static DBusMessage * | server_activate_net_time (DBusMessage *msg) |
static int | handle_csd_net_time_change (DBusMessage *msg) |
static DBusMessage * | server_get_time_format (DBusMessage *msg) |
static DBusMessage * | server_get_default_tz (DBusMessage *msg) |
static DBusMessage * | server_get_time (DBusMessage *msg) |
static DBusMessage * | server_set_time_format (DBusMessage *msg) |
static DBusMessage * | server_get_tz (DBusMessage *msg) |
static DBusMessage * | server_is_net_time_changed (DBusMessage *msg) |
static DBusMessage * | server_set_tz (DBusMessage *msg) |
static DBusMessage * | server_get_autosync (DBusMessage *msg) |
static DBusMessage * | server_set_autosync (DBusMessage *msg) |
static DBusMessage * | server_have_opertime (DBusMessage *msg) |
static int | server_parse_mcc_mapping_line (const char *line, char **country) |
static gboolean | server_find_country_by_mcc (int mcc, char **found_country) |
static gboolean | server_searching_tz (const Cityinfo *city, gpointer data) |
static gboolean | server_find_only_tz_by_country (const char *const country, char **found_tz) |
static gboolean | server_find_only_tz_by_mcc (int mcc, char **found_tz) |
static void | server_set_tz_from_mcc (void) |
static void | server_handle_network_timeinfo_reply (DBusMessage *msg) |
static void | server_network_timeinfo_reply_dbus_cb (DBusPendingCall *pending_call, void *data) |
static void | server_check_if_network_timeinfo_available (void) |
static void | server_handle_registration_status_reply (DBusMessage *msg) |
static void | server_registration_status_reply_dbus_cb (DBusPendingCall *pending_call, void *data) |
static void | server_add_registration_change_match (void) |
static void | server_remove_registration_change_match (void) |
static DBusHandlerResult | server_filter (DBusConnection *conn, DBusMessage *msg, void *user_data) |
int | server_init (void) |
void | server_quit (void) |
Copyright (C) 2008 Nokia. All rights reserved.
static gboolean handle_alarm | ( | DBusConnection * | bus | ) | [static] |
Check DST change and send time change indication when DST changes.
static void server_setup_timezone_from_mcc_if_required | ( | void | ) | [static] |
If autoupdate is on, it sends get registration status request to CSD. It launches procedure to update time if device is registered in network. Reply is catched by server_registration_status_reply_dbus_cb callback.
Also the method asks D-Bus to notify about registration status change signal if time autoupdate is on and removr this tracking if time autoupdate is off. The signal is handled by server_filter (refer to server_init also).
Referenced by server_init(), and server_set_autosync().
static int get_dst | ( | time_t | tick | ) | [static] |
Get daylight state
tick | Current time, 0 if not known |
Referenced by dump_date(), get_utc_offset(), handle_alarm(), send_time_change_indication(), and server_init().
static int read_conf | ( | ) | [static] |
static int save_conf | ( | void | ) | [static] |
Save current config to /home/user/.clockd.conf
Referenced by handle_csd_net_time_change(), server_init(), server_set_autosync(), server_set_time(), server_set_time_format(), server_set_tz(), and server_set_tz_from_mcc().
static int get_utc_offset | ( | time_t | tick, | |
int | dst | |||
) | [static] |
Get UTC offset
tick | Current time, 0 if not known | |
dst | nonzero if daylight is counted in |
Referenced by dump_date().
static void dump_date | ( | void | ) | [static] |
Dump current date settings to syslog.
Referenced by handle_csd_net_time_change(), server_init(), server_set_time(), server_set_tz(), and server_set_tz_from_mcc().
static int send_time_change_indication | ( | time_t | t | ) | [static] |
Send "change" indication to all interested parties (via libosso).
t | Current time |
Referenced by handle_alarm(), handle_csd_net_time_change(), server_set_autosync(), server_set_time(), server_set_time_format(), server_set_tz(), and server_set_tz_from_mcc().
static int set_time | ( | time_t | t | ) | [static] |
Set system and RTC time using suidroot rclockd helper
t | Current time |
static DBusMessage* server_new_rsp | ( | DBusMessage * | msg, | |
int | type, | |||
... | ||||
) | [static] |
Create D-Bus method call response message
msg | request message | |
type | vararg type/value attributes |
Referenced by server_activate_net_time(), server_get_autosync(), server_get_default_tz(), server_get_time(), server_get_time_format(), server_get_tz(), server_have_opertime(), server_is_net_time_changed(), server_set_autosync(), server_set_time(), server_set_time_format(), and server_set_tz().
static DBusMessage* server_set_time | ( | DBusMessage * | msg | ) | [static] |
Handle D-Bus set_time method. Sets system/RTC time and sends time change indication with libosso.
msg | request message |
Referenced by server_filter().
static int set_tz | ( | const char * | tz | ) | [static] |
Set system timezone
tz | Timezone |
Referenced by server_init(), server_set_tz(), and server_set_tz_from_mcc().
static DBusMessage* server_activate_net_time | ( | DBusMessage * | msg | ) | [static] |
Handle D-Bus activate_net_time method. Sets system/RTC time and sends time change indication with libosso.
msg | request message |
Referenced by server_filter().
static int handle_csd_net_time_change | ( | DBusMessage * | msg | ) | [static] |
Handle D-Bus net_time_change signal from CSD. If network autosync is enabled, set system/RTC time and sends time change indication with libosso; otherwise just store the data (that can be activated with activate_net_time method later)
msg | signal message |
Referenced by server_filter(), and server_handle_network_timeinfo_reply().
static DBusMessage* server_get_time_format | ( | DBusMessage * | msg | ) | [static] |
Handle D-Bus get_time_fmt method
msg | request message |
Referenced by server_filter().
static DBusMessage* server_get_default_tz | ( | DBusMessage * | msg | ) | [static] |
Handle D-Bus get_default_tz method
msg | request message |
Referenced by server_filter().
static DBusMessage* server_get_time | ( | DBusMessage * | msg | ) | [static] |
Handle D-Bus get_time method
msg | request message |
Referenced by server_filter().
static DBusMessage* server_set_time_format | ( | DBusMessage * | msg | ) | [static] |
Handle D-Bus get_time_fmt method. Sets the time format locally and sends time change indication with libosso. Saves config to /home/user/.clockd.conf.
msg | request message |
Referenced by server_filter().
static DBusMessage* server_get_tz | ( | DBusMessage * | msg | ) | [static] |
Handle D-Bus get_tz method.
msg | request message |
Referenced by server_filter().
static DBusMessage* server_is_net_time_changed | ( | DBusMessage * | msg | ) | [static] |
Handle D-Bus is_net_time_changed method
msg | request message |
Referenced by server_filter().
static DBusMessage* server_set_tz | ( | DBusMessage * | msg | ) | [static] |
Handle D-Bus set_tz method. Sets the time zone and sends time change indication. Saves config to /home/user/.clockd.conf.
msg | request message |
Referenced by server_filter().
static DBusMessage* server_get_autosync | ( | DBusMessage * | msg | ) | [static] |
Handle D-Bus get_autosync method
msg | request message |
Referenced by server_filter().
static DBusMessage* server_set_autosync | ( | DBusMessage * | msg | ) | [static] |
Handle D-Bus set_autosync method. Set autosync on/off and sends time change indication with libosso. Saves config to /home/user/.clockd.conf.
msg | request message |
Referenced by server_filter().
static DBusMessage* server_have_opertime | ( | DBusMessage * | msg | ) | [static] |
Handle D-Bus have_opertime method
msg | request message |
Referenced by server_filter().
static int server_parse_mcc_mapping_line | ( | const char * | line, | |
char ** | country | |||
) | [static] |
Parse line from /usr/share/operator-wizard/mcc_mapping to extract MCC and country name.
line | line from /usr/share/operator-wizard/mcc_mapping to parse | |
country | NULL if fails, country name (localizable) if OK |
Referenced by server_find_country_by_mcc().
static gboolean server_find_country_by_mcc | ( | int | mcc, | |
char ** | found_country | |||
) | [static] |
Map MCC to country name using /usr/share/operator-wizard/mcc_mapping Allocates memory to return country name. Caller is responsible to free the memory.
mcc | MCC to find | |
found_country | NULL if fails, country name (localizable) if OK |
Referenced by server_find_only_tz_by_mcc().
static gboolean server_searching_tz | ( | const Cityinfo * | city, | |
gpointer | data | |||
) | [static] |
Helper function used to map country name to timezone. If entry has equal country name as sent for searching, it extract timezone info for this entry. If multiple entry found, the result resets as nothing was found and it stops searching. If only requested entry found, it allocates memory which must be released by API user. Refer to cityinfo API for details about helper functions for cityinfo_foreach algorithm
city | Entry in city info db | |
data | TZCountryResultData used to provide country name (country) for searching and field to return found timezone (tz) |
Referenced by server_find_only_tz_by_country().
static gboolean server_find_only_tz_by_country | ( | const char *const | country, | |
char ** | found_tz | |||
) | [static] |
Wrapper above cityinfo API used to find only timezone by country name. It use cityinfo_foreach algorithm to analyse entries in cityinfo db (refer to cityinfo API for details). If timezone found, memory is allocated to returm it. This memory must be freed by caller.
country | Country name to find timezone | |
found_tz | NULL if not found or multiple timezones found, timezone name otherwise |
Referenced by server_find_only_tz_by_mcc().
static gboolean server_find_only_tz_by_mcc | ( | int | mcc, | |
char ** | found_tz | |||
) | [static] |
Search for only timezone by MCC (country code). If timezone found, memory is allocated to returm it. This memory must be freed by caller.
mcc | Country code to find timezone | |
found_tz | NULL if not found or multiple timezones found, timezone name otherwise |
Referenced by server_set_tz_from_mcc().
static void server_set_tz_from_mcc | ( | void | ) | [static] |
Change current timezone to found by MCC if MCC can be definitely mapped to timezone It used cached value of MCC (mcc_cache).
Referenced by server_handle_network_timeinfo_reply().
static void server_handle_network_timeinfo_reply | ( | DBusMessage * | msg | ) | [static] |
Handle reply on get time info request to CSD. If autoupdate is off - do nothing. If autoupdate is on and NITZ supported by network, it parse reply and set network time. If autoupdate is on and NITZ does not supported by network, it makes attempt to correct timezone at least using cached MCC
msg | D-Bus reply on get time info request to CSD |
Referenced by server_network_timeinfo_reply_dbus_cb().
static void server_network_timeinfo_reply_dbus_cb | ( | DBusPendingCall * | pending_call, | |
void * | data | |||
) | [static] |
Callback to catch reply on get time info request to CSD. Refer to D-Bus API for details
pending_call | D-Bus object to catch reply | |
data | Not used |
Referenced by server_check_if_network_timeinfo_available().
static void server_check_if_network_timeinfo_available | ( | void | ) | [static] |
Sends get time info request to CSD. Reply is catched by server_network_timeinfo_reply_dbus_cb callback
Referenced by server_handle_registration_status_reply().
static void server_handle_registration_status_reply | ( | DBusMessage * | msg | ) | [static] |
Handle reply on get registration status request to CSD. If registered in home or roaming network and received MCC is not equal to cached one, launch network time update attempt, since country (and timezone probably) is changed.
msg | D-Bus reply on get registration status request to CSD |
Referenced by server_filter(), and server_registration_status_reply_dbus_cb().
static void server_registration_status_reply_dbus_cb | ( | DBusPendingCall * | pending_call, | |
void * | data | |||
) | [static] |
Callback to catch reply on get registration status request to CSD. Refer to D-Bus API for details
pending_call | D-Bus object to catch reply | |
data | Not used |
Referenced by server_setup_timezone_from_mcc_if_required().
static void server_add_registration_change_match | ( | void | ) | [static] |
Add tracking of registration status change signal to system bus if it was not added before
Referenced by server_setup_timezone_from_mcc_if_required().
static void server_remove_registration_change_match | ( | void | ) | [static] |
Remove tracking of registration status change signal from system bus if it was added before
Referenced by server_quit(), and server_setup_timezone_from_mcc_if_required().
static DBusHandlerResult server_filter | ( | DBusConnection * | conn, | |
DBusMessage * | msg, | |||
void * | user_data | |||
) | [static] |
Handle requests (methods or signals) coming via D-Bus
conn | D-Bus connection | |
msg | D-Bus message | |
user_data | User data (not used) |
Referenced by server_init(), and server_quit().
int server_init | ( | void | ) |
Init D-Bus server
The following is set up:
Referenced by mainloop_run().
void server_quit | ( | void | ) |
Deinitialize D-Bus server
Referenced by mainloop_run().