diff options
| author | Wilmer van der Gaast <wilmer@gaast.net> | 2010-06-06 00:21:02 +0100 | 
|---|---|---|
| committer | Wilmer van der Gaast <wilmer@gaast.net> | 2010-06-06 00:21:02 +0100 | 
| commit | b308cf9bafbdf76da73a57607b65c4763aa3057b (patch) | |
| tree | c686906b479a0edd52b18a213e1d420f7343855d /lib/misc.c | |
| parent | 3ab1d317831a6c1830bb648a1a8d63a41c92f651 (diff) | |
| parent | e774815bc621af90bb64ca314b84367659c5a005 (diff) | |
Merging libpurple branch into killerbee. It's fairly usable already, and
Debian packaging is now properly separated. This also picks up a load of
stuff from mainline it seems.
Diffstat (limited to 'lib/misc.c')
| -rw-r--r-- | lib/misc.c | 38 | 
1 files changed, 36 insertions, 2 deletions
| @@ -78,6 +78,41 @@ time_t get_time(int year, int month, int day, int hour, int min, int sec)  	return mktime(&tm);  } +time_t mktime_utc( struct tm *tp ) +{ +	struct tm utc; +	time_t res, tres; +	 +	tp->tm_isdst = -1; +	res = mktime( tp ); +	/* Problem is, mktime() just gave us the GMT timestamp for the +	   given local time... While the given time WAS NOT local. So +	   we should fix this now. +	    +	   Now I could choose between messing with environment variables +	   (kludgy) or using timegm() (not portable)... Or doing the +	   following, which I actually prefer... +	    +	   tzset() may also work but in other places I actually want to +	   use local time. +	    +	   FFFFFFFFFFFFFFFFFFFFFUUUUUUUUUUUUUUUUUUUU!! */ +	gmtime_r( &res, &utc ); +	utc.tm_isdst = -1; +	if( utc.tm_hour == tp->tm_hour && utc.tm_min == tp->tm_min ) +		/* Sweet! We're in UTC right now... */ +		return res; +	 +	tres = mktime( &utc ); +	res += res - tres; +	 +	/* Yes, this is a hack. And it will go wrong around DST changes. +	   BUT this is more likely to be threadsafe than messing with +	   environment variables, and possibly more portable... */ +	 +	return res; +} +  typedef struct htmlentity  {  	char code[7]; @@ -270,8 +305,7 @@ void http_encode( char *s )  	for( i = j = 0; t[i]; i ++, j ++ )  	{ -		/* if( t[i] <= ' ' || ((unsigned char *)t)[i] >= 128 || t[i] == '%' ) */ -		if( !isalnum( t[i] ) ) +		if( !isalnum( t[i] ) && !strchr( "._-~", t[i] ) )  		{  			sprintf( s + j, "%%%02X", ((unsigned char*)t)[i] );  			j += 2; | 
