server.c File Reference

clockd 'server' More...

#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)


Detailed Description

This is D-Bus server for clockd that communicates with clock/time -aware applications. It also listens for CSD NET_TIME_CHANGE signal and reacts to it accordingly.

Copyright (C) 2008 Nokia. All rights reserved.

Author:
Simo Piiroinen <simo.piiroinen@nokia.com>

Raimo Vuonnala <raimo.vuonnala@nokia.com>


Function Documentation

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

Parameters:
tick Current time, 0 if not known
Returns:
0 if no DST, 1 if DST

Referenced by dump_date(), get_utc_offset(), handle_alarm(), send_time_change_indication(), and server_init().

static int read_conf (  )  [static]

Read /home/user/.clockd.conf contents

Returns:
0 if OK, -1 if error

Referenced by server_init().

static int save_conf ( void   )  [static]

Save current config to /home/user/.clockd.conf

Returns:
0 if OK, -1 if error

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

Parameters:
tick Current time, 0 if not known
dst nonzero if daylight is counted in
Returns:
Offset in secs

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).

Parameters:
t Current time
Returns:
0 if OK, -1 if error

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

Parameters:
t Current time
Returns:
0 if OK, -1 if error

static DBusMessage* server_new_rsp ( DBusMessage *  msg,
int  type,
  ... 
) [static]

Create D-Bus method call response message

Parameters:
msg request message
type vararg type/value attributes
Returns:
NULL if fails, pointer to DBusMessage if OK

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.

Parameters:
msg request message
Returns:
NULL if fails, pointer to response DBusMessage if OK

Referenced by server_filter().

static int set_tz ( const char *  tz  )  [static]

Set system timezone

Parameters:
tz Timezone
Returns:
0 if OK, !=0 if fails

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.

Parameters:
msg request message
Returns:
NULL if fails, pointer to response DBusMessage if OK

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)

Parameters:
msg signal message
Returns:
-1 if failed to update time (e.g. NITZ does not supported by carrier), otherwise 0

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

Parameters:
msg request message
Returns:
NULL if fails, pointer to response DBusMessage if OK

Referenced by server_filter().

static DBusMessage* server_get_default_tz ( DBusMessage *  msg  )  [static]

Handle D-Bus get_default_tz method

Parameters:
msg request message
Returns:
NULL if fails, pointer to response DBusMessage if OK

Referenced by server_filter().

static DBusMessage* server_get_time ( DBusMessage *  msg  )  [static]

Handle D-Bus get_time method

Parameters:
msg request message
Returns:
NULL if fails, pointer to response DBusMessage if OK

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.

Parameters:
msg request message
Returns:
NULL if fails, pointer to response DBusMessage if OK

Referenced by server_filter().

static DBusMessage* server_get_tz ( DBusMessage *  msg  )  [static]

Handle D-Bus get_tz method.

Parameters:
msg request message
Returns:
NULL if fails, pointer to response DBusMessage if OK

Referenced by server_filter().

static DBusMessage* server_is_net_time_changed ( DBusMessage *  msg  )  [static]

Handle D-Bus is_net_time_changed method

Parameters:
msg request message
Returns:
NULL if fails, pointer to response DBusMessage if OK

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.

Parameters:
msg request message
Returns:
NULL if fails, pointer to response DBusMessage if OK

Referenced by server_filter().

static DBusMessage* server_get_autosync ( DBusMessage *  msg  )  [static]

Handle D-Bus get_autosync method

Parameters:
msg request message
Returns:
NULL if fails, pointer to response DBusMessage if OK

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.

Parameters:
msg request message
Returns:
NULL if fails, pointer to response DBusMessage if OK

Referenced by server_filter().

static DBusMessage* server_have_opertime ( DBusMessage *  msg  )  [static]

Handle D-Bus have_opertime method

Parameters:
msg request message
Returns:
NULL if fails, pointer to response DBusMessage if OK

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.

Parameters:
line line from /usr/share/operator-wizard/mcc_mapping to parse
country NULL if fails, country name (localizable) if OK
Returns:
0 if fails, MCC (country code) 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.

Parameters:
mcc MCC to find
found_country NULL if fails, country name (localizable) if OK
Returns:
FALSE if not found, TRUE otherwise

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

Parameters:
city Entry in city info db
data TZCountryResultData used to provide country name (country) for searching and field to return found timezone (tz)
Returns:
FALSE to stop searching, TRUE otherwise

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.

Parameters:
country Country name to find timezone
found_tz NULL if not found or multiple timezones found, timezone name otherwise
Returns:
FALSE if not found or multiple timezones found, TRUE 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.

Parameters:
mcc Country code to find timezone
found_tz NULL if not found or multiple timezones found, timezone name otherwise
Returns:
FALSE if not found or multiple timezones found, TRUE 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

Parameters:
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

Parameters:
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.

Parameters:
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

Parameters:
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

Parameters:
conn D-Bus connection
msg D-Bus message
user_data User data (not used)
Returns:
DBusHandlerResult

Referenced by server_init(), and server_quit().

int server_init ( void   ) 

Init D-Bus server

The following is set up:

  • settings from environment (/etc/clockd/clockd-settings.default)
  • settings from configuration file (/home/user/.clockd.conf)
  • D-Bus connections
  • libosso init
  • timezone from /etc/localtime or /home/user/.clockd.conf

Returns:
0 if OK, -1 if error

Referenced by mainloop_run().

void server_quit ( void   ) 

Deinitialize D-Bus server

Referenced by mainloop_run().


Generated on Tue Feb 23 13:52:56 2010 for clockd by  doxygen 1.5.6