diff --git a/lib/libc/gen/Makefile.inc b/lib/libc/gen/Makefile.inc index 1f39abaf64fa..174bac2fc513 100644 --- a/lib/libc/gen/Makefile.inc +++ b/lib/libc/gen/Makefile.inc @@ -1,4 +1,4 @@ -# $NetBSD: Makefile.inc,v 1.79 1997/10/16 23:04:38 christos Exp $ +# $NetBSD: Makefile.inc,v 1.80 1997/10/20 15:50:22 christos Exp $ # @(#)Makefile.inc 8.3 (Berkeley) 4/16/94 # gen sources @@ -17,7 +17,7 @@ SRCS+= _errno.c alarm.c assert.c clock.c closedir.c confstr.c ctermid.c \ seekdir.c setdomainname.c sethostname.c setjmperr.c setmode.c \ setproctitle.c siginterrupt.c siglist.c signal.c signame.c \ sigsetops.c sleep.c stringlist.c sysconf.c sysctl.c syslog.c telldir.c \ - time.c times.c tolower_.c ttyname.c ttyslot.c toupper_.c \ + time.c times.c timezone.c tolower_.c ttyname.c ttyslot.c toupper_.c \ ualarm.c uname.c unvis.c usleep.c utime.c valloc.c vis.c wait.c \ wait3.c waitpid.c warn.c warnx.c vwarn.c vwarnx.c verr.c verrx.c @@ -43,7 +43,7 @@ MAN+= alarm.3 clock.3 confstr.3 ctermid.3 ctype.3 daemon.3 \ ldexp.3 modf.3 nice.3 nlist.3 pause.3 popen.3 psignal.3 pwcache.3 \ raise.3 scandir.3 setjmp.3 setmode.3 setproctitle.3 siginterrupt.3 \ signal.3 sigsetops.3 sleep.3 stringlist.3 sysconf.3 sysctl.3 syslog.3 \ - time.3 times.3 toascii.3 \ + time.3 times.3 timezone.3 toascii.3 \ tolower.3 toupper.3 ttyname.3 ualarm.3 uname.3 unvis.3 \ usleep.3 utime.3 valloc.3 vis.3 diff --git a/lib/libc/gen/timezone.3 b/lib/libc/gen/timezone.3 new file mode 100644 index 000000000000..0b2c1753479c --- /dev/null +++ b/lib/libc/gen/timezone.3 @@ -0,0 +1,72 @@ +.\" $NetBSD: timezone.3,v 1.7 1997/10/20 15:50:26 christos Exp $ +.\" +.\" Copyright (c) 1991, 1993 +.\" The Regents of the University of California. All rights reserved. +.\" +.\" Redistribution and use in source and binary forms, with or without +.\" modification, are permitted provided that the following conditions +.\" are met: +.\" 1. Redistributions of source code must retain the above copyright +.\" notice, this list of conditions and the following disclaimer. +.\" 2. Redistributions in binary form must reproduce the above copyright +.\" notice, this list of conditions and the following disclaimer in the +.\" documentation and/or other materials provided with the distribution. +.\" 3. All advertising materials mentioning features or use of this software +.\" must display the following acknowledgement: +.\" This product includes software developed by the University of +.\" California, Berkeley and its contributors. +.\" 4. Neither the name of the University nor the names of its contributors +.\" may be used to endorse or promote products derived from this software +.\" without specific prior written permission. +.\" +.\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND +.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +.\" ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE +.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS +.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) +.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY +.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF +.\" SUCH DAMAGE. +.\" +.\" @(#)timezone.3 8.2 (Berkeley) 4/19/94 +.\" +.Dd April 19, 1994 +.Dt TIMEZONE 3 +.Os +.Sh NAME +.Nm timezone +.Nd return the timezone abbreviation +.Sh SYNOPSIS +.Ft char * +.Fn timezone "int zone" "int dst" +.Sh DESCRIPTION +.Sh DESCRIPTION +.Bf -symbolic +.\" This interface is available from the compatibility library, libcompat; +This interface is available for compatibility; +it is impossible to reliably map timezone's arguments to a time zone +abbreviation. +See ctime(3). +.Ef +.Pp +The +.Fn timezone +function returns a pointer to a time zone abbreviation for the specified +.Ar zone +and +.Ar dst +values. +.Ar Zone +is the number of minutes west of GMT and +.Ar dst +is non-zero if daylight savings time is in effect. +.Sh SEE ALSO +.Xr ctime 3 +.Sh HISTORY +A +.Fn timezone +function appeared in +.At v7 . diff --git a/lib/libc/gen/timezone.c b/lib/libc/gen/timezone.c new file mode 100644 index 000000000000..1c25724c9f93 --- /dev/null +++ b/lib/libc/gen/timezone.c @@ -0,0 +1,147 @@ +/* $NetBSD: timezone.c,v 1.10 1997/10/20 15:50:29 christos Exp $ */ + +/* + * Copyright (c) 1987, 1993 + * The Regents of the University of California. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * This product includes software developed by the University of + * California, Berkeley and its contributors. + * 4. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +#include +#if defined(LIBC_SCCS) && !defined(lint) +#if 0 +static char sccsid[] = "@(#)timezone.c 8.1 (Berkeley) 6/4/93"; +#else +__RCSID("$NetBSD: timezone.c,v 1.10 1997/10/20 15:50:29 christos Exp $"); +#endif +#endif /* LIBC_SCCS and not lint */ + +#include "namespace.h" +#include +#include +#include +#include +#include +#include + +#ifdef __weak_alias +__weak_alias(timezone,_timezone); +#endif + +/* + * timezone -- + * The arguments are the number of minutes of time you are westward + * from Greenwich and whether DST is in effect. It returns a string + * giving the name of the local timezone. Should be replaced, in the + * application code, by a call to localtime. + */ + +char *_tztab __P((int, int)); + +static char czone[TZ_MAX_CHARS]; /* space for zone name */ + +char * +timezone(zone, dst) + int zone, + dst; +{ + register char *beg, + *end; + + if ((beg = getenv("TZNAME")) != NULL) { /* set in environment */ + if ((end = strchr(beg, ',')) != NULL) { /* "PST,PDT" */ + if (dst) + return(++end); + *end = '\0'; + (void)strncpy(czone,beg,sizeof(czone) - 1); + czone[sizeof(czone) - 1] = '\0'; + *end = ','; + return(czone); + } + return(beg); + } + return(_tztab(zone,dst)); /* default: table or created zone */ +} + +static struct zone { + int offset; + char *stdzone; + char *dlzone; +} zonetab[] = { + { -1*60, "MET", "MET DST" }, /* Middle European */ + { -2*60, "EET", "EET DST" }, /* Eastern European */ + { 4*60, "AST", "ADT" }, /* Atlantic */ + { 5*60, "EST", "EDT" }, /* Eastern */ + { 6*60, "CST", "CDT" }, /* Central */ + { 7*60, "MST", "MDT" }, /* Mountain */ + { 8*60, "PST", "PDT" }, /* Pacific */ +#ifdef notdef + /* there's no way to distinguish this from WET */ + { 0, "GMT", 0 }, /* Greenwich */ +#endif + { 0*60, "WET", "WET DST" }, /* Western European */ + { -10*60, "EST", "EST" }, /* Aust: Eastern */ + { -10*60+30, "CST", "CST" }, /* Aust: Central */ + { -8*60, "WST", 0 }, /* Aust: Western */ + { -1, NULL, NULL } +}; + +/* + * _tztab -- + * check static tables or create a new zone name; broken out so that + * we can make a guess as to what the zone is if the standard tables + * aren't in place in /etc. DO NOT USE THIS ROUTINE OUTSIDE OF THE + * STANDARD LIBRARY. + */ +char * +_tztab(zone,dst) + register int zone; + int dst; +{ + register struct zone *zp; + register char sign; + + for (zp = zonetab; zp->offset != -1;++zp) /* static tables */ + if (zp->offset == zone) { + if (dst && zp->dlzone) + return(zp->dlzone); + if (!dst && zp->stdzone) + return(zp->stdzone); + } + + if (zone < 0) { /* create one */ + zone = -zone; + sign = '+'; + } + else + sign = '-'; + (void)snprintf(czone, TZ_MAX_CHARS, "GMT%c%d:%02d", sign, zone / 60, + zone % 60); + return(czone); +}