[net.news.b] news 2.10 Arpadate timezone bug

teus@mcvax.UUCP (Teus Hagen) (09/29/83)

The arpadate routine in funcs.c (if you have sendmail change arpadate.c as well)
does not check the string it gets from timezone. Probably in later UNIX systems
(as f.i. 4.2 BSD) the timezone routine might give some strange strings!
To be ARPA compatable we put the timezone one step back on daylight saving time.
Changes to the arpadate routine:

char *
arpadate(...)
{
	...
	if ( (strncmp(p,"GMT",3)==0 || strncmp(p,"gmt",3)==0) && p[3] != '\0')
	{
		/* hours from GMT */
		p += 3;
		*q++ = *p++;
		if (p[1] == ':')
			*q++ = '0';
		else
			*q++ = *p++;
		*q++ = *p++;
		p++;		/* skip ``:'' */
		*q++ = *p++;
		*q++ = *p++;
		*q = '\0';
	}
	else
	if( !fconvert(p,q) )
	{
		*q++ = ' ';
		*q++ = *p++;
		*q++ = *p++;
		*q++ = *p++;
		*q = '\0';
	}

	return (b);
}

/* convert foreign identifications to some ARPA interpretable form */
/* with dst we put the time zone one hour ahead */
struct foreign { 
	char *f_from; 
	char *f_to; 
} foreign[] = {
	{"eet", " -0200"}, /* eastern europe */
	{"met", " -0100"}, /* middle europe */
	{"wet", " gmt"},   /* western europe, and what for australia? */
	{"eet dst", " -0300"}, /* daylight saving times */
	{"met dst", " -0200"},
	{"wet dst", " -0100"},
	{NULL, NULL}
};

fconvert( a, b ) register char *a; char *b;
{	register struct foreign *euptr;
	register char *ptr;
	extern makelower();

/* for news:	for ( ptr = a; *ptr; ptr++ )
		if ( isupper(*ptr) )
			*ptr = tolower( *ptr );
*/
	makelower( a );
	for ( euptr = &foreign[0]; euptr->f_from != NULL; euptr++ )
		if ( strcmp(euptr->f_from, a) == 0 )
		{	ptr = euptr->f_to;
			while ( *ptr )
				*b++ = *ptr++;
			*b = '\0';
			return 1;
		}
	return 0;
}
-- 
	Teus Hagen	Center for Math., Comp. Science (CMCS)
			formerly Math. Centre (MC)
			mcvax!teus