loudmouth/lm-utils.c
author Senko Rasic <senko.rasic@collabora.co.uk>
Sun, 30 Nov 2008 10:20:08 +0100
changeset 575 daad23d59b56
parent 236 b4e5c1cb114e
child 407 4401f2aa0692
permissions -rw-r--r--
Don't check for sync dns problems when using asyncns [#33] lm_socket_create() checks for sync DNS failure, but the check is executed even if Loudmouth is using asyncns, in which case Loudmouth crashes. committer: Mikael Hallendal <micke@imendio.com>
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
1
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
     1
/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
     2
/*
99
81e9d035de02 2004-10-05 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents: 84
diff changeset
     3
 * Copyright (C) 2003 Imendio AB 
1
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
     4
 *
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
     5
 * This program is free software; you can redistribute it and/or
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
     6
 * modify it under the terms of the GNU Lesser General Public License as
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
     7
 * published by the Free Software Foundation; either version 2 of the
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
     8
 * License, or (at your option) any later version.
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
     9
 *
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
    10
 * This program is distributed in the hope that it will be useful,
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
    11
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
    12
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
    13
 * Lesser General Public License for more details.
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
    14
 *
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
    15
 * You should have received a copy of the GNU Lesser General Public
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
    16
 * License along with this program; if not, write to the
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
    17
 * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
    18
 * Boston, MA 02111-1307, USA.
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
    19
 */
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
    20
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
    21
#include <config.h>
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
    22
#include <string.h>
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
    23
#include <stdio.h>
155
d24c4392d4e3 2006-06-16 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents: 140
diff changeset
    24
#include <stdlib.h>
1
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
    25
#include <time.h>
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
    26
140
103227122f45 2006-04-19 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents: 99
diff changeset
    27
#include <glib.h>
103227122f45 2006-04-19 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents: 99
diff changeset
    28
103227122f45 2006-04-19 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents: 99
diff changeset
    29
#ifndef G_OS_WIN32
103227122f45 2006-04-19 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents: 99
diff changeset
    30
#include <unistd.h>
103227122f45 2006-04-19 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents: 99
diff changeset
    31
#endif
103227122f45 2006-04-19 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents: 99
diff changeset
    32
155
d24c4392d4e3 2006-06-16 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents: 140
diff changeset
    33
#ifdef HAVE_IDN
d24c4392d4e3 2006-06-16 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents: 140
diff changeset
    34
#include <stringprep.h>
d24c4392d4e3 2006-06-16 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents: 140
diff changeset
    35
#include <punycode.h>
d24c4392d4e3 2006-06-16 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents: 140
diff changeset
    36
#include <idna.h>
d24c4392d4e3 2006-06-16 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents: 140
diff changeset
    37
#endif
d24c4392d4e3 2006-06-16 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents: 140
diff changeset
    38
1
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
    39
#include "lm-internals.h"
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
    40
#include "lm-utils.h"
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
    41
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
    42
LmCallback *
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
    43
_lm_utils_new_callback (gpointer func, 
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
    44
			gpointer user_data,
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
    45
			GDestroyNotify notify)
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
    46
{
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
    47
	LmCallback *cb;
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
    48
	
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
    49
	cb = g_new0 (LmCallback, 1);
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
    50
	cb->func = func;
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
    51
	cb->user_data = user_data;
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
    52
	cb->notify = notify;
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
    53
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
    54
	return cb;
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
    55
}
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
    56
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
    57
void
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
    58
_lm_utils_free_callback (LmCallback *cb)
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
    59
{
64
dd835d5cee71 2004-01-06 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents: 57
diff changeset
    60
	if (!cb) {
dd835d5cee71 2004-01-06 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents: 57
diff changeset
    61
		return;
dd835d5cee71 2004-01-06 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents: 57
diff changeset
    62
	}
dd835d5cee71 2004-01-06 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents: 57
diff changeset
    63
1
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
    64
	if (cb->notify) {
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
    65
		(* cb->notify) (cb->user_data);
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
    66
	}
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
    67
	g_free (cb);
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
    68
}
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
    69
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
    70
gchar *
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
    71
_lm_utils_generate_id (void)
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
    72
{
177
3ef4992a4898 use time
hallski <hallski>
parents: 176
diff changeset
    73
	static guint  last_id = 0;
3ef4992a4898 use time
hallski <hallski>
parents: 176
diff changeset
    74
	GTimeVal      tv;
3ef4992a4898 use time
hallski <hallski>
parents: 176
diff changeset
    75
	glong         val;
1
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
    76
177
3ef4992a4898 use time
hallski <hallski>
parents: 176
diff changeset
    77
	g_get_current_time (&tv);
3ef4992a4898 use time
hallski <hallski>
parents: 176
diff changeset
    78
	val = (tv.tv_sec & tv.tv_usec) + last_id++;
3ef4992a4898 use time
hallski <hallski>
parents: 176
diff changeset
    79
		
3ef4992a4898 use time
hallski <hallski>
parents: 176
diff changeset
    80
	return g_strdup_printf ("%ld%ld", val, tv.tv_usec);
1
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
    81
}
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
    82
66
577d5059b718 2004-01-15 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents: 65
diff changeset
    83
gchar * 
577d5059b718 2004-01-15 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents: 65
diff changeset
    84
_lm_utils_base64_encode (const gchar *s)
577d5059b718 2004-01-15 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents: 65
diff changeset
    85
{
577d5059b718 2004-01-15 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents: 65
diff changeset
    86
	static const gchar *base64chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
577d5059b718 2004-01-15 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents: 65
diff changeset
    87
577d5059b718 2004-01-15 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents: 65
diff changeset
    88
	guint    i, j;
577d5059b718 2004-01-15 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents: 65
diff changeset
    89
	guint32  bits = 0;
577d5059b718 2004-01-15 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents: 65
diff changeset
    90
	guint    maxlen = (strlen(s) * 2) + 3;
577d5059b718 2004-01-15 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents: 65
diff changeset
    91
	gchar   *str;
577d5059b718 2004-01-15 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents: 65
diff changeset
    92
577d5059b718 2004-01-15 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents: 65
diff changeset
    93
	str = g_malloc(maxlen);
577d5059b718 2004-01-15 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents: 65
diff changeset
    94
577d5059b718 2004-01-15 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents: 65
diff changeset
    95
	j = 0;
577d5059b718 2004-01-15 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents: 65
diff changeset
    96
	for (i = 0; i < strlen(s); i++) {
577d5059b718 2004-01-15 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents: 65
diff changeset
    97
		bits <<= 8;
577d5059b718 2004-01-15 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents: 65
diff changeset
    98
		bits |= s[i] & 0xff;
577d5059b718 2004-01-15 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents: 65
diff changeset
    99
577d5059b718 2004-01-15 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents: 65
diff changeset
   100
		if (!((i+1) % 3)) {
577d5059b718 2004-01-15 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents: 65
diff changeset
   101
			guint indices[4];
577d5059b718 2004-01-15 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents: 65
diff changeset
   102
577d5059b718 2004-01-15 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents: 65
diff changeset
   103
			indices[0] = (bits >> 18) & 0x3f;
577d5059b718 2004-01-15 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents: 65
diff changeset
   104
			indices[1] = (bits >> 12) & 0x3f;
577d5059b718 2004-01-15 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents: 65
diff changeset
   105
			indices[2] = (bits >> 6) & 0x3f;
577d5059b718 2004-01-15 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents: 65
diff changeset
   106
			indices[3] = bits & 0x3f;
577d5059b718 2004-01-15 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents: 65
diff changeset
   107
			bits = 0;
577d5059b718 2004-01-15 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents: 65
diff changeset
   108
577d5059b718 2004-01-15 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents: 65
diff changeset
   109
			str[j++] = base64chars[(indices[0])];
577d5059b718 2004-01-15 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents: 65
diff changeset
   110
			str[j++] = base64chars[(indices[1])];
577d5059b718 2004-01-15 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents: 65
diff changeset
   111
			str[j++] = base64chars[(indices[2])];
577d5059b718 2004-01-15 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents: 65
diff changeset
   112
			str[j++] = base64chars[(indices[3])];
577d5059b718 2004-01-15 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents: 65
diff changeset
   113
		}
577d5059b718 2004-01-15 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents: 65
diff changeset
   114
	}
577d5059b718 2004-01-15 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents: 65
diff changeset
   115
577d5059b718 2004-01-15 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents: 65
diff changeset
   116
	if (j + 4 < maxlen) {
577d5059b718 2004-01-15 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents: 65
diff changeset
   117
		if ((i % 3) == 1) {
577d5059b718 2004-01-15 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents: 65
diff changeset
   118
			guint indices[2];
577d5059b718 2004-01-15 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents: 65
diff changeset
   119
577d5059b718 2004-01-15 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents: 65
diff changeset
   120
			indices[0] = (bits >> 2) & 0x3f;
577d5059b718 2004-01-15 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents: 65
diff changeset
   121
			indices[1] = (bits << 4) & 0x3f;
577d5059b718 2004-01-15 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents: 65
diff changeset
   122
577d5059b718 2004-01-15 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents: 65
diff changeset
   123
			str[j++] = base64chars[(indices[0])];
577d5059b718 2004-01-15 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents: 65
diff changeset
   124
			str[j++] = base64chars[(indices[1])];
577d5059b718 2004-01-15 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents: 65
diff changeset
   125
			str[j++] = '=';
577d5059b718 2004-01-15 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents: 65
diff changeset
   126
			str[j++] = '=';
577d5059b718 2004-01-15 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents: 65
diff changeset
   127
		} else if ((i % 3) == 2) {
577d5059b718 2004-01-15 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents: 65
diff changeset
   128
			guint indices[3];
577d5059b718 2004-01-15 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents: 65
diff changeset
   129
577d5059b718 2004-01-15 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents: 65
diff changeset
   130
			indices[0] = (bits >> 10) & 0x3f;
577d5059b718 2004-01-15 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents: 65
diff changeset
   131
			indices[1] = (bits >> 4) & 0x3f;
577d5059b718 2004-01-15 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents: 65
diff changeset
   132
			indices[2] = (bits << 2) & 0x3f;
577d5059b718 2004-01-15 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents: 65
diff changeset
   133
577d5059b718 2004-01-15 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents: 65
diff changeset
   134
			str[j++] = base64chars[(indices[0])];
577d5059b718 2004-01-15 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents: 65
diff changeset
   135
			str[j++] = base64chars[(indices[1])];
577d5059b718 2004-01-15 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents: 65
diff changeset
   136
			str[j++] = base64chars[(indices[2])];
577d5059b718 2004-01-15 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents: 65
diff changeset
   137
			str[j++] = '=';
577d5059b718 2004-01-15 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents: 65
diff changeset
   138
		}
577d5059b718 2004-01-15 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents: 65
diff changeset
   139
	}
577d5059b718 2004-01-15 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents: 65
diff changeset
   140
577d5059b718 2004-01-15 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents: 65
diff changeset
   141
	str[j] = '\0';
577d5059b718 2004-01-15 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents: 65
diff changeset
   142
577d5059b718 2004-01-15 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents: 65
diff changeset
   143
	return str;
577d5059b718 2004-01-15 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents: 65
diff changeset
   144
}
577d5059b718 2004-01-15 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents: 65
diff changeset
   145
155
d24c4392d4e3 2006-06-16 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents: 140
diff changeset
   146
gchar*
d24c4392d4e3 2006-06-16 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents: 140
diff changeset
   147
_lm_utils_hostname_to_punycode (const gchar *hostname)
d24c4392d4e3 2006-06-16 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents: 140
diff changeset
   148
{
d24c4392d4e3 2006-06-16 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents: 140
diff changeset
   149
#ifdef HAVE_IDN
d24c4392d4e3 2006-06-16 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents: 140
diff changeset
   150
	char *s;
d24c4392d4e3 2006-06-16 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents: 140
diff changeset
   151
	uint32_t *q;
d24c4392d4e3 2006-06-16 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents: 140
diff changeset
   152
	int rc;
d24c4392d4e3 2006-06-16 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents: 140
diff changeset
   153
	gchar *result;
d24c4392d4e3 2006-06-16 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents: 140
diff changeset
   154
d24c4392d4e3 2006-06-16 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents: 140
diff changeset
   155
	q = stringprep_utf8_to_ucs4 (hostname, -1, NULL);
d24c4392d4e3 2006-06-16 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents: 140
diff changeset
   156
	if (q == NULL) {
d24c4392d4e3 2006-06-16 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents: 140
diff changeset
   157
		return g_strdup (hostname);
d24c4392d4e3 2006-06-16 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents: 140
diff changeset
   158
	}
d24c4392d4e3 2006-06-16 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents: 140
diff changeset
   159
d24c4392d4e3 2006-06-16 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents: 140
diff changeset
   160
	rc = idna_to_ascii_4z (q, &s, IDNA_ALLOW_UNASSIGNED);
d24c4392d4e3 2006-06-16 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents: 140
diff changeset
   161
	free(q);
d24c4392d4e3 2006-06-16 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents: 140
diff changeset
   162
	if (rc != IDNA_SUCCESS) {
d24c4392d4e3 2006-06-16 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents: 140
diff changeset
   163
		return g_strdup (hostname);
d24c4392d4e3 2006-06-16 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents: 140
diff changeset
   164
	}
d24c4392d4e3 2006-06-16 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents: 140
diff changeset
   165
d24c4392d4e3 2006-06-16 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents: 140
diff changeset
   166
	/* insures result is allocated through glib */
d24c4392d4e3 2006-06-16 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents: 140
diff changeset
   167
	result = g_strdup(s);
d24c4392d4e3 2006-06-16 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents: 140
diff changeset
   168
	free(s);
d24c4392d4e3 2006-06-16 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents: 140
diff changeset
   169
d24c4392d4e3 2006-06-16 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents: 140
diff changeset
   170
	return result;
d24c4392d4e3 2006-06-16 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents: 140
diff changeset
   171
#else
d24c4392d4e3 2006-06-16 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents: 140
diff changeset
   172
	return g_strdup(hostname);
d24c4392d4e3 2006-06-16 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents: 140
diff changeset
   173
#endif
168
ac1affcd5d22 2006-09-01 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents: 155
diff changeset
   174
}
ac1affcd5d22 2006-09-01 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents: 155
diff changeset
   175
179
6cc952969ff1 doc work
hallski <hallski>
parents: 177
diff changeset
   176
/**
236
b4e5c1cb114e Some tweaks while trying to solve LM-52.
Mikael Hallendal <micke@imendio.com>
parents: 179
diff changeset
   177
 * lm_utils_get_localtime:
179
6cc952969ff1 doc work
hallski <hallski>
parents: 177
diff changeset
   178
 * @stamp: An XMPP timestamp
6cc952969ff1 doc work
hallski <hallski>
parents: 177
diff changeset
   179
 *
6cc952969ff1 doc work
hallski <hallski>
parents: 177
diff changeset
   180
 * Converts an XMPP timestamp to a struct tm showing local time.
6cc952969ff1 doc work
hallski <hallski>
parents: 177
diff changeset
   181
 * 
6cc952969ff1 doc work
hallski <hallski>
parents: 177
diff changeset
   182
 * Return value: The local time struct.
6cc952969ff1 doc work
hallski <hallski>
parents: 177
diff changeset
   183
 **/
168
ac1affcd5d22 2006-09-01 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents: 155
diff changeset
   184
struct tm *
1
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   185
lm_utils_get_localtime (const gchar *stamp)
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   186
{
65
e6871fda6fc9 2004-01-08 Richard Hult <richard@imendio.com>
rhult <rhult>
parents: 64
diff changeset
   187
	struct tm tm;
1
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   188
	time_t    t;
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   189
	gint      year, month;
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   190
	
168
ac1affcd5d22 2006-09-01 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents: 155
diff changeset
   191
	g_return_val_if_fail (stamp != NULL, NULL);
ac1affcd5d22 2006-09-01 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents: 155
diff changeset
   192
1
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   193
	/* 20021209T23:51:30 */
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   194
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   195
	sscanf (stamp, "%4d%2d%2dT%2d:%2d:%2d", 
65
e6871fda6fc9 2004-01-08 Richard Hult <richard@imendio.com>
rhult <rhult>
parents: 64
diff changeset
   196
		&year, &month, &tm.tm_mday, &tm.tm_hour,
e6871fda6fc9 2004-01-08 Richard Hult <richard@imendio.com>
rhult <rhult>
parents: 64
diff changeset
   197
		&tm.tm_min, &tm.tm_sec);
e6871fda6fc9 2004-01-08 Richard Hult <richard@imendio.com>
rhult <rhult>
parents: 64
diff changeset
   198
e6871fda6fc9 2004-01-08 Richard Hult <richard@imendio.com>
rhult <rhult>
parents: 64
diff changeset
   199
	tm.tm_year = year - 1900;
e6871fda6fc9 2004-01-08 Richard Hult <richard@imendio.com>
rhult <rhult>
parents: 64
diff changeset
   200
	tm.tm_mon = month - 1;
e6871fda6fc9 2004-01-08 Richard Hult <richard@imendio.com>
rhult <rhult>
parents: 64
diff changeset
   201
	tm.tm_isdst = -1;
e6871fda6fc9 2004-01-08 Richard Hult <richard@imendio.com>
rhult <rhult>
parents: 64
diff changeset
   202
e6871fda6fc9 2004-01-08 Richard Hult <richard@imendio.com>
rhult <rhult>
parents: 64
diff changeset
   203
 	t = mktime (&tm);
1
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   204
65
e6871fda6fc9 2004-01-08 Richard Hult <richard@imendio.com>
rhult <rhult>
parents: 64
diff changeset
   205
#if defined(HAVE_TM_GMTOFF)
e6871fda6fc9 2004-01-08 Richard Hult <richard@imendio.com>
rhult <rhult>
parents: 64
diff changeset
   206
	t += tm.tm_gmtoff;
e6871fda6fc9 2004-01-08 Richard Hult <richard@imendio.com>
rhult <rhult>
parents: 64
diff changeset
   207
#elif defined(HAVE_TIMEZONE)
e6871fda6fc9 2004-01-08 Richard Hult <richard@imendio.com>
rhult <rhult>
parents: 64
diff changeset
   208
	t -= timezone;
e6871fda6fc9 2004-01-08 Richard Hult <richard@imendio.com>
rhult <rhult>
parents: 64
diff changeset
   209
	if (tm.tm_isdst > 0) {
e6871fda6fc9 2004-01-08 Richard Hult <richard@imendio.com>
rhult <rhult>
parents: 64
diff changeset
   210
		t += 3600;
e6871fda6fc9 2004-01-08 Richard Hult <richard@imendio.com>
rhult <rhult>
parents: 64
diff changeset
   211
	}
e6871fda6fc9 2004-01-08 Richard Hult <richard@imendio.com>
rhult <rhult>
parents: 64
diff changeset
   212
#endif	
1
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   213
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   214
	return localtime (&t);
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   215
}
50e230cf7818 Initial revision
hallski <hallski>
parents:
diff changeset
   216
155
d24c4392d4e3 2006-06-16 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents: 140
diff changeset
   217