sync with OpenBSD -current

This commit is contained in:
purplerain 2024-10-03 15:29:20 +00:00
parent 00180dc79b
commit 074e641852
Signed by: purplerain
GPG key ID: F42C07F07E2E35B7
75 changed files with 2693 additions and 2103 deletions

View file

@ -1,4 +1,4 @@
/* $OpenBSD: crypto.h,v 1.75 2024/08/31 12:43:58 jsing Exp $ */ /* $OpenBSD: crypto.h,v 1.76 2024/10/03 03:47:40 tb Exp $ */
/* ==================================================================== /* ====================================================================
* Copyright (c) 1998-2006 The OpenSSL Project. All rights reserved. * Copyright (c) 1998-2006 The OpenSSL Project. All rights reserved.
* *
@ -416,6 +416,7 @@ int CRYPTO_memcmp(const void *a, const void *b, size_t len);
#define OPENSSL_INIT_reserved_internal _OPENSSL_INIT_FLAG_NOOP #define OPENSSL_INIT_reserved_internal _OPENSSL_INIT_FLAG_NOOP
#define OPENSSL_INIT_ATFORK _OPENSSL_INIT_FLAG_NOOP #define OPENSSL_INIT_ATFORK _OPENSSL_INIT_FLAG_NOOP
#define OPENSSL_INIT_ENGINE_ALL_BUILTIN _OPENSSL_INIT_FLAG_NOOP #define OPENSSL_INIT_ENGINE_ALL_BUILTIN _OPENSSL_INIT_FLAG_NOOP
#define OPENSSL_INIT_NO_ATEXIT _OPENSSL_INIT_FLAG_NOOP
int OPENSSL_init_crypto(uint64_t opts, const void *settings); int OPENSSL_init_crypto(uint64_t opts, const void *settings);
void OPENSSL_cleanup(void); void OPENSSL_cleanup(void);

View file

@ -1,4 +1,4 @@
/* $OpenBSD: ec_asn1.c,v 1.53 2024/04/17 23:24:18 tb Exp $ */ /* $OpenBSD: ec_asn1.c,v 1.57 2024/10/03 05:07:49 tb Exp $ */
/* /*
* Written by Nils Larsch for the OpenSSL project. * Written by Nils Larsch for the OpenSSL project.
*/ */
@ -405,7 +405,7 @@ static const ASN1_TEMPLATE ECPARAMETERS_seq_tt[] = {
}, },
}; };
const ASN1_ITEM ECPARAMETERS_it = { static const ASN1_ITEM ECPARAMETERS_it = {
.itype = ASN1_ITYPE_SEQUENCE, .itype = ASN1_ITYPE_SEQUENCE,
.utype = V_ASN1_SEQUENCE, .utype = V_ASN1_SEQUENCE,
.templates = ECPARAMETERS_seq_tt, .templates = ECPARAMETERS_seq_tt,
@ -451,7 +451,7 @@ static const ASN1_TEMPLATE ECPKPARAMETERS_ch_tt[] = {
}, },
}; };
const ASN1_ITEM ECPKPARAMETERS_it = { static const ASN1_ITEM ECPKPARAMETERS_it = {
.itype = ASN1_ITYPE_CHOICE, .itype = ASN1_ITYPE_CHOICE,
.utype = offsetof(ECPKPARAMETERS, type), .utype = offsetof(ECPKPARAMETERS, type),
.templates = ECPKPARAMETERS_ch_tt, .templates = ECPKPARAMETERS_ch_tt,
@ -760,20 +760,19 @@ ec_asn1_group2parameters(const EC_GROUP *group, ECPARAMETERS *param)
ECerror(ERR_R_ASN1_LIB); ECerror(ERR_R_ASN1_LIB);
goto err; goto err;
} }
/* set the order */
if (!EC_GROUP_get_order(group, tmp, NULL)) { if (!EC_GROUP_get_order(group, tmp, NULL)) {
ECerror(ERR_R_EC_LIB); ECerror(ERR_R_EC_LIB);
goto err; goto err;
} }
ret->order = BN_to_ASN1_INTEGER(tmp, ret->order); ASN1_INTEGER_free(ret->order);
if (ret->order == NULL) { if ((ret->order = BN_to_ASN1_INTEGER(tmp, NULL)) == NULL) {
ECerror(ERR_R_ASN1_LIB); ECerror(ERR_R_ASN1_LIB);
goto err; goto err;
} }
/* set the cofactor (optional) */ ASN1_INTEGER_free(ret->cofactor);
ret->cofactor = NULL;
if (EC_GROUP_get_cofactor(group, tmp, NULL)) { if (EC_GROUP_get_cofactor(group, tmp, NULL)) {
ret->cofactor = BN_to_ASN1_INTEGER(tmp, ret->cofactor); if ((ret->cofactor = BN_to_ASN1_INTEGER(tmp, NULL)) == NULL) {
if (ret->cofactor == NULL) {
ECerror(ERR_R_ASN1_LIB); ECerror(ERR_R_ASN1_LIB);
goto err; goto err;
} }
@ -842,9 +841,9 @@ ec_asn1_parameters2group(const ECPARAMETERS *params)
{ {
int ok = 0, tmp; int ok = 0, tmp;
EC_GROUP *ret = NULL; EC_GROUP *ret = NULL;
BIGNUM *p = NULL, *a = NULL, *b = NULL; BIGNUM *p = NULL, *a = NULL, *b = NULL, *order = NULL, *cofactor = NULL;
EC_POINT *point = NULL; EC_POINT *point = NULL;
long field_bits; int field_bits;
if (!params->fieldID || !params->fieldID->fieldType || if (!params->fieldID || !params->fieldID->fieldType ||
!params->fieldID->p.ptr) { !params->fieldID->p.ptr) {
@ -933,29 +932,26 @@ ec_asn1_parameters2group(const ECPARAMETERS *params)
ECerror(ERR_R_EC_LIB); ECerror(ERR_R_EC_LIB);
goto err; goto err;
} }
/* extract the order */ if ((order = ASN1_INTEGER_to_BN(params->order, NULL)) == NULL) {
if ((a = ASN1_INTEGER_to_BN(params->order, a)) == NULL) {
ECerror(ERR_R_ASN1_LIB); ECerror(ERR_R_ASN1_LIB);
goto err; goto err;
} }
if (BN_is_negative(a) || BN_is_zero(a)) { if (BN_is_negative(order) || BN_is_zero(order)) {
ECerror(EC_R_INVALID_GROUP_ORDER); ECerror(EC_R_INVALID_GROUP_ORDER);
goto err; goto err;
} }
if (BN_num_bits(a) > (int) field_bits + 1) { /* Hasse bound */ if (BN_num_bits(order) > field_bits + 1) { /* Hasse bound */
ECerror(EC_R_INVALID_GROUP_ORDER); ECerror(EC_R_INVALID_GROUP_ORDER);
goto err; goto err;
} }
/* extract the cofactor (optional) */ if (params->cofactor != NULL) {
if (params->cofactor == NULL) { if ((cofactor = ASN1_INTEGER_to_BN(params->cofactor,
BN_free(b); NULL)) == NULL) {
b = NULL;
} else if ((b = ASN1_INTEGER_to_BN(params->cofactor, b)) == NULL) {
ECerror(ERR_R_ASN1_LIB); ECerror(ERR_R_ASN1_LIB);
goto err; goto err;
} }
/* set the generator, order and cofactor (if present) */ }
if (!EC_GROUP_set_generator(ret, point, a, b)) { if (!EC_GROUP_set_generator(ret, point, order, cofactor)) {
ECerror(ERR_R_EC_LIB); ECerror(ERR_R_EC_LIB);
goto err; goto err;
} }
@ -969,8 +965,11 @@ ec_asn1_parameters2group(const ECPARAMETERS *params)
BN_free(p); BN_free(p);
BN_free(a); BN_free(a);
BN_free(b); BN_free(b);
BN_free(order);
BN_free(cofactor);
EC_POINT_free(point); EC_POINT_free(point);
return (ret);
return ret;
} }
EC_GROUP * EC_GROUP *

View file

@ -1,4 +1,4 @@
/* $OpenBSD: ec_local.h,v 1.27 2023/11/29 21:35:57 tb Exp $ */ /* $OpenBSD: ec_local.h,v 1.28 2024/10/03 06:24:07 tb Exp $ */
/* /*
* Originally written by Bodo Moeller for the OpenSSL project. * Originally written by Bodo Moeller for the OpenSSL project.
*/ */
@ -216,9 +216,6 @@ struct ec_group_st {
/* Montgomery context and values used by EC_GFp_mont_method. */ /* Montgomery context and values used by EC_GFp_mont_method. */
BN_MONT_CTX *mont_ctx; BN_MONT_CTX *mont_ctx;
BIGNUM *mont_one; BIGNUM *mont_one;
int (*field_mod_func)(BIGNUM *, const BIGNUM *, const BIGNUM *,
BN_CTX *);
} /* EC_GROUP */; } /* EC_GROUP */;
struct ec_key_st { struct ec_key_st {

File diff suppressed because it is too large Load diff

View file

@ -1,4 +1,4 @@
.\" $OpenBSD: X509V3_EXT_get_nid.3,v 1.4 2024/05/14 06:57:10 tb Exp $ .\" $OpenBSD: X509V3_EXT_get_nid.3,v 1.5 2024/10/03 03:31:47 tb Exp $
.\" .\"
.\" Copyright (c) 2024 Theo Buehler <tb@openbsd.org> .\" Copyright (c) 2024 Theo Buehler <tb@openbsd.org>
.\" .\"
@ -14,7 +14,7 @@
.\" ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF .\" ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
.\" OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. .\" OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
.\" .\"
.Dd $Mdocdate: May 14 2024 $ .Dd $Mdocdate: October 3 2024 $
.Dt X509V3_EXT_GET_NID 3 .Dt X509V3_EXT_GET_NID 3
.Os .Os
.Sh NAME .Sh NAME
@ -43,7 +43,7 @@ The library's
.Vt X509V3_EXT_METHOD .Vt X509V3_EXT_METHOD
type, type,
which is not yet documented in detail, which is not yet documented in detail,
contains a numeric identifier to represent the OID and various contains a numeric identifier (NID) to represent the OID and various
handlers for encoding, decoding, printing, and configuring the handlers for encoding, decoding, printing, and configuring the
extension's value. extension's value.
Criticality is handled separately, for example as an argument to Criticality is handled separately, for example as an argument to

View file

@ -1,4 +1,4 @@
# $OpenBSD: Makefile,v 1.59 2024/08/31 08:23:32 tb Exp $ # $OpenBSD: Makefile,v 1.60 2024/10/02 14:50:58 jsing Exp $
SUBDIR += aead SUBDIR += aead
SUBDIR += aes SUBDIR += aes
@ -23,6 +23,7 @@ SUBDIR += dsa
SUBDIR += ec SUBDIR += ec
SUBDIR += ecdh SUBDIR += ecdh
SUBDIR += ecdsa SUBDIR += ecdsa
SUBDIR += err
SUBDIR += evp SUBDIR += evp
SUBDIR += exdata SUBDIR += exdata
SUBDIR += free SUBDIR += free

View file

@ -0,0 +1,9 @@
# $OpenBSD: Makefile,v 1.1 2024/10/02 14:41:46 jsing Exp $
PROG = err_test
LDADD = -lcrypto
DPADD = ${LIBCRYPTO}
WARNINGS = Yes
CFLAGS += -DLIBRESSL_INTERNAL -Werror
.include <bsd.regress.mk>

View file

@ -0,0 +1,201 @@
/* $OpenBSD: err_test.c,v 1.1 2024/10/02 14:41:46 jsing Exp $ */
/*
* Copyright (c) 2024 Joel Sing <jsing@openbsd.org>
*
* Permission to use, copy, modify, and distribute this software for any
* purpose with or without fee is hereby granted, provided that the above
* copyright notice and this permission notice appear in all copies.
*
* THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
* WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
* MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
* ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
* WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
* ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
* OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
*/
#include <string.h>
#include <openssl/bn.h>
#include <openssl/crypto.h>
#include <openssl/err.h>
/*
* This should also test:
* - error handling with more than ERR_NUM_ERRORS.
* - multi-threaded use.
*/
static int
err_test(void)
{
const char *file, *s;
char buf[2048];
unsigned long err;
int line;
int failed = 1;
ERR_load_crypto_strings();
ERR_remove_state(0);
ERR_clear_error();
if ((err = ERR_peek_error()) != 0) {
fprintf(stderr, "FAIL: ERR_peek_error() = %lx, want "
"0x0\n", err);
goto failure;
}
if ((err = ERR_get_error()) != 0) {
fprintf(stderr, "FAIL: ERR_get_error() = %lx, want "
"0x0\n", err);
goto failure;
}
ERR_put_error(ERR_LIB_SYS, SYS_F_SOCKET, ERR_R_MALLOC_FAILURE,
"sys.c", 100);
ERR_put_error(ERR_LIB_BN, BN_F_BN_USUB, BN_R_DIV_BY_ZERO,
"bn.c", 200);
if ((err = ERR_peek_error()) != 0x2004041UL) {
fprintf(stderr, "FAIL: ERR_peek_error() = %lx, want "
"0x2004041UL\n", err);
goto failure;
}
if ((err = ERR_peek_error_line(&file, &line)) != 0x2004041UL) {
fprintf(stderr, "FAIL: ERR_peek_error_line() = %lx, want "
"0x2004041\n", err);
goto failure;
}
if (strcmp(file, "sys.c") != 0) {
fprintf(stderr, "FAIL: got file '%s', want 'sys.c'", file);
goto failure;
}
if (line != 100) {
fprintf(stderr, "FAIL: line = %d, want 100", line);
goto failure;
}
if ((err = ERR_peek_last_error()) != 0x3073067UL) {
fprintf(stderr, "FAIL: ERR_peek_error() = %lx, want "
"0x3073067\n", err);
goto failure;
}
if ((err = ERR_peek_last_error_line(&file, &line)) != 0x3073067UL) {
fprintf(stderr, "FAIL: ERR_peek_last_error_line() = %lx, want "
"0x3073067\n", err);
goto failure;
}
if (strcmp(file, "bn.c") != 0) {
fprintf(stderr, "FAIL: got file '%s', want 'bn.c'", file);
goto failure;
}
if (line != 200) {
fprintf(stderr, "FAIL: line = %d, want 200", line);
goto failure;
}
if ((err = ERR_get_error()) != 0x2004041UL) {
fprintf(stderr, "FAIL: ERR_get_error() = %lx, want "
"0x2004041\n", err);
goto failure;
}
if ((err = ERR_peek_error()) != 0x3073067UL) {
fprintf(stderr, "FAIL: ERR_peek_error() = %lx, want "
"0x3073067\n", err);
goto failure;
}
if ((err = ERR_get_error_line(&file, &line)) != 0x3073067UL) {
fprintf(stderr, "FAIL: ERR_get_error_line() = %lx, want "
"0x3073067\n", err);
goto failure;
}
if (strcmp(file, "bn.c") != 0) {
fprintf(stderr, "FAIL: got file '%s', want 'bn.c'", file);
goto failure;
}
if (line != 200) {
fprintf(stderr, "FAIL: line = %d, want 200", line);
goto failure;
}
if ((err = ERR_get_error()) != 0) {
fprintf(stderr, "FAIL: ERR_get_error() = %lx, want "
"0x0\n", err);
goto failure;
}
ERR_clear_error();
s = ERR_lib_error_string(0x3fff067UL);
if (strcmp(s, "bignum routines") != 0) {
fprintf(stderr, "FAIL: ERR_lib_error_string() = '%s', "
"want 'bignum routines'\n", s);
goto failure;
}
s = ERR_func_error_string(0x3fff067UL);
if (strcmp(s, "CRYPTO_internal") != 0) {
fprintf(stderr, "FAIL: ERR_func_error_string() = '%s', "
"want 'CRYPTO_internal'\n", s);
goto failure;
}
s = ERR_reason_error_string(0x3fff067UL);
if (strcmp(s, "div by zero") != 0) {
fprintf(stderr, "FAIL: ERR_reason_error_string() = '%s', "
"want 'div by zero'\n", s);
goto failure;
}
ERR_remove_state(0);
s = ERR_error_string(0x3fff067UL, NULL);
if (strcmp(s, "error:03FFF067:bignum routines:CRYPTO_internal:div by zero") != 0) {
fprintf(stderr, "FAIL: ERR_error_string() = '%s', "
"want 'error:03FFF067:bignum routines:CRYPTO_internal:div by zero'\n", s);
goto failure;
}
memset(buf, 0xdb, sizeof(buf));
s = ERR_error_string(0x3fff067UL, buf);
if (s != buf) {
fprintf(stderr, "FAIL: ERR_error_string() did not "
"return buffer\n");
goto failure;
}
if (strcmp(s, "error:03FFF067:bignum routines:CRYPTO_internal:div by zero") != 0) {
fprintf(stderr, "FAIL: ERR_error_string() = '%s', "
"want 'error:03FFF067:bignum routines:CRYPTO_internal:div by zero'\n", s);
goto failure;
}
memset(buf, 0xdb, sizeof(buf));
ERR_error_string_n(0x3fff067UL, buf, sizeof(buf));
if (strcmp(s, "error:03FFF067:bignum routines:CRYPTO_internal:div by zero") != 0) {
fprintf(stderr, "FAIL: ERR_error_string() = '%s', "
"want 'error:03FFF067:bignum routines:CRYPTO_internal:div by zero'\n", s);
goto failure;
}
failed = 0;
failure:
return failed;
}
int
main(int argc, char **argv)
{
int failed = 0;
failed |= err_test();
/* Force a clean up. */
OPENSSL_cleanup();
return failed;
}

View file

@ -1,4 +1,4 @@
/* $OpenBSD: exdata_test.c,v 1.2 2024/03/25 10:41:36 jsing Exp $ */ /* $OpenBSD: exdata_test.c,v 1.3 2024/10/02 14:12:21 jsing Exp $ */
/* /*
* Copyright (c) 2023 Joel Sing <jsing@openbsd.org> * Copyright (c) 2023 Joel Sing <jsing@openbsd.org>
* *
@ -231,8 +231,6 @@ ex_data_test(void)
return failed; return failed;
} }
#if 0
/* This insanity currently succeeds... */
static int static int
ex_new_index_test(void) ex_new_index_test(void)
{ {
@ -257,7 +255,6 @@ ex_new_index_test(void)
failure: failure:
return failed; return failed;
} }
#endif
int int
main(int argc, char **argv) main(int argc, char **argv)
@ -265,9 +262,7 @@ main(int argc, char **argv)
int failed = 0; int failed = 0;
failed |= ex_data_test(); failed |= ex_data_test();
#if 0
failed |= ex_new_index_test(); failed |= ex_new_index_test();
#endif
/* Force a clean up. */ /* Force a clean up. */
CRYPTO_cleanup_all_ex_data(); CRYPTO_cleanup_all_ex_data();

View file

@ -1,4 +1,4 @@
# $OpenBSD: africa,v 1.75 2024/02/05 17:07:23 millert Exp $ # $OpenBSD: africa,v 1.76 2024/10/02 17:08:47 millert Exp $
# tzdb data for Africa and environs # tzdb data for Africa and environs
# This file is in the public domain, so clarified as of # This file is in the public domain, so clarified as of
@ -139,17 +139,16 @@ Zone Africa/Douala 0:38:48 - LMT 1912
# Cape Verde / Cabo Verde # Cape Verde / Cabo Verde
# #
# From Paul Eggert (2018-02-16): # From Tim Parenti (2024-07-01), per Paul Eggert (2018-02-16):
# Shanks gives 1907 for the transition to +02. # For timestamps before independence, see commentary for Europe/Lisbon.
# For now, ignore that and follow the 1911-05-26 Portuguese decree # Shanks gives 1907 instead for the transition to -02.
# (see Europe/Lisbon).
# #
# Zone NAME STDOFF RULES FORMAT [UNTIL] # Zone NAME STDOFF RULES FORMAT [UNTIL]
Zone Atlantic/Cape_Verde -1:34:04 - LMT 1912 Jan 01 2:00u # Praia Zone Atlantic/Cape_Verde -1:34:04 - LMT 1912 Jan 01 2:00u # Praia
-2:00 - -02 1942 Sep -2:00 - %z 1942 Sep
-2:00 1:00 -01 1945 Oct 15 -2:00 1:00 %z 1945 Oct 15
-2:00 - -02 1975 Nov 25 2:00 -2:00 - %z 1975 Nov 25 2:00
-1:00 - -01 -1:00 - %z
# Central African Republic # Central African Republic
# Zone NAME STDOFF RULES FORMAT [UNTIL] # Zone NAME STDOFF RULES FORMAT [UNTIL]
@ -459,14 +458,12 @@ Zone Africa/Conakry -0:54:52 - LMT 1912
# Guinea-Bissau # Guinea-Bissau
# #
# From Paul Eggert (2018-02-16): # From Tim Parenti (2024-07-01), per Paul Eggert (2018-02-16):
# Shanks gives 1911-05-26 for the transition to WAT, # For timestamps before independence, see commentary for Europe/Lisbon.
# evidently confusing the date of the Portuguese decree
# (see Europe/Lisbon) with the date that it took effect.
# #
# Zone NAME STDOFF RULES FORMAT [UNTIL] # Zone NAME STDOFF RULES FORMAT [UNTIL]
Zone Africa/Bissau -1:02:20 - LMT 1912 Jan 1 1:00u Zone Africa/Bissau -1:02:20 - LMT 1912 Jan 1 1:00u
-1:00 - -01 1975 -1:00 - %z 1975
0:00 - GMT 0:00 - GMT
# Kenya # Kenya
@ -522,10 +519,10 @@ Zone Africa/Bissau -1:02:20 - LMT 1912 Jan 1 1:00u
# Zone NAME STDOFF RULES FORMAT [UNTIL] # Zone NAME STDOFF RULES FORMAT [UNTIL]
Zone Africa/Nairobi 2:27:16 - LMT 1908 May Zone Africa/Nairobi 2:27:16 - LMT 1908 May
2:30 - +0230 1928 Jun 30 24:00 2:30 - %z 1928 Jun 30 24:00
3:00 - EAT 1930 Jan 4 24:00 3:00 - EAT 1930 Jan 4 24:00
2:30 - +0230 1936 Dec 31 24:00 2:30 - %z 1936 Dec 31 24:00
2:45 - +0245 1942 Jul 31 24:00 2:45 - %z 1942 Jul 31 24:00
3:00 - EAT 3:00 - EAT
# Lesotho # Lesotho
@ -732,7 +729,7 @@ Rule Mauritius 2008 only - Oct lastSun 2:00 1:00 -
Rule Mauritius 2009 only - Mar lastSun 2:00 0 - Rule Mauritius 2009 only - Mar lastSun 2:00 0 -
# Zone NAME STDOFF RULES FORMAT [UNTIL] # Zone NAME STDOFF RULES FORMAT [UNTIL]
Zone Indian/Mauritius 3:50:00 - LMT 1907 # Port Louis Zone Indian/Mauritius 3:50:00 - LMT 1907 # Port Louis
4:00 Mauritius +04/+05 4:00 Mauritius %z
# Agalega Is, Rodriguez # Agalega Is, Rodriguez
# no information; probably like Indian/Mauritius # no information; probably like Indian/Mauritius
@ -1219,10 +1216,10 @@ Rule Morocco 2087 only - May 11 2:00 0 -
# Zone NAME STDOFF RULES FORMAT [UNTIL] # Zone NAME STDOFF RULES FORMAT [UNTIL]
Zone Africa/Casablanca -0:30:20 - LMT 1913 Oct 26 Zone Africa/Casablanca -0:30:20 - LMT 1913 Oct 26
0:00 Morocco +00/+01 1984 Mar 16 0:00 Morocco %z 1984 Mar 16
1:00 - +01 1986 1:00 - %z 1986
0:00 Morocco +00/+01 2018 Oct 28 3:00 0:00 Morocco %z 2018 Oct 28 3:00
1:00 Morocco +01/+00 1:00 Morocco %z
# Western Sahara # Western Sahara
# #
@ -1236,19 +1233,33 @@ Zone Africa/Casablanca -0:30:20 - LMT 1913 Oct 26
# since most of it was then controlled by Morocco. # since most of it was then controlled by Morocco.
Zone Africa/El_Aaiun -0:52:48 - LMT 1934 Jan # El Aaiún Zone Africa/El_Aaiun -0:52:48 - LMT 1934 Jan # El Aaiún
-1:00 - -01 1976 Apr 14 -1:00 - %z 1976 Apr 14
0:00 Morocco +00/+01 2018 Oct 28 3:00 0:00 Morocco %z 2018 Oct 28 3:00
1:00 Morocco +01/+00 1:00 Morocco %z
# Mozambique # Mozambique
# #
# Shanks gives 1903-03-01 for the transition to CAT. # From Tim Parenti (2024-07-01):
# Perhaps the 1911-05-26 Portuguese decree # For timestamps before Mozambique's independence, see commentary for
# https://dre.pt/pdf1sdip/1911/05/12500/23132313.pdf # Europe/Lisbon.
# merely made it official? #
# From Paul Eggert (2024-05-24):
# The London Gazette, 1903-04-03, page 2245, says that
# as of 1903-03-03 a time ball at the port of Lourenço Marques
# (as Maputo was then called) was dropped daily at 13:00:00 LMT,
# corresponding to 22:49:41.7 GMT, so local time was +02:10:18.3.
# Conversely, the newspaper South Africa, 1909-02-09, page 321,
# says the port had just installed an apparatus that communicated
# "from the controlling clock in the new Observatory at Reuben Point ...
# exact mean South African time, i.e., 30 deg., or 2 hours East of Greenwich".
# Although Shanks gives 1903-03-01 for the transition to CAT,
# evidently the port transitioned to CAT after 1903-03-03 but before
# the Portuguese legal transition of 1912-01-01 (see Europe/Lisbon commentary).
# For lack of better info, list 1909 as the transition date.
# #
# Zone NAME STDOFF RULES FORMAT [UNTIL] # Zone NAME STDOFF RULES FORMAT [UNTIL]
Zone Africa/Maputo 2:10:20 - LMT 1903 Mar #STDOFF 2:10:18.3
Zone Africa/Maputo 2:10:18 - LMT 1909
2:00 - CAT 2:00 - CAT
# Namibia # Namibia
@ -1313,7 +1324,7 @@ Rule Namibia 1995 2017 - Apr Sun>=1 2:00 -1:00 WAT
# Zone NAME STDOFF RULES FORMAT [UNTIL] # Zone NAME STDOFF RULES FORMAT [UNTIL]
Zone Africa/Windhoek 1:08:24 - LMT 1892 Feb 8 Zone Africa/Windhoek 1:08:24 - LMT 1892 Feb 8
1:30 - +0130 1903 Mar 1:30 - %z 1903 Mar
2:00 - SAST 1942 Sep 20 2:00 2:00 - SAST 1942 Sep 20 2:00
2:00 1:00 SAST 1943 Mar 21 2:00 2:00 1:00 SAST 1943 Mar 21 2:00
2:00 - SAST 1990 Mar 21 # independence 2:00 - SAST 1990 Mar 21 # independence
@ -1398,7 +1409,7 @@ Zone Africa/Niamey 0:08:28 - LMT 1912
Zone Africa/Lagos 0:13:35 - LMT 1905 Jul 1 Zone Africa/Lagos 0:13:35 - LMT 1905 Jul 1
0:00 - GMT 1908 Jul 1 0:00 - GMT 1908 Jul 1
0:13:35 - LMT 1914 Jan 1 0:13:35 - LMT 1914 Jan 1
0:30 - +0030 1919 Sep 1 0:30 - %z 1919 Sep 1
1:00 - WAT 1:00 - WAT
# Réunion # Réunion

View file

@ -1,4 +1,4 @@
# $OpenBSD: antarctica,v 1.48 2024/01/02 22:43:20 millert Exp $ # $OpenBSD: antarctica,v 1.49 2024/10/02 17:08:47 millert Exp $
# tzdb data for Antarctica and environs # tzdb data for Antarctica and environs
# This file is in the public domain, so clarified as of # This file is in the public domain, so clarified as of
@ -88,34 +88,34 @@
# Zone NAME STDOFF RULES FORMAT [UNTIL] # Zone NAME STDOFF RULES FORMAT [UNTIL]
Zone Antarctica/Casey 0 - -00 1969 Zone Antarctica/Casey 0 - -00 1969
8:00 - +08 2009 Oct 18 2:00 8:00 - %z 2009 Oct 18 2:00
11:00 - +11 2010 Mar 5 2:00 11:00 - %z 2010 Mar 5 2:00
8:00 - +08 2011 Oct 28 2:00 8:00 - %z 2011 Oct 28 2:00
11:00 - +11 2012 Feb 21 17:00u 11:00 - %z 2012 Feb 21 17:00u
8:00 - +08 2016 Oct 22 8:00 - %z 2016 Oct 22
11:00 - +11 2018 Mar 11 4:00 11:00 - %z 2018 Mar 11 4:00
8:00 - +08 2018 Oct 7 4:00 8:00 - %z 2018 Oct 7 4:00
11:00 - +11 2019 Mar 17 3:00 11:00 - %z 2019 Mar 17 3:00
8:00 - +08 2019 Oct 4 3:00 8:00 - %z 2019 Oct 4 3:00
11:00 - +11 2020 Mar 8 3:00 11:00 - %z 2020 Mar 8 3:00
8:00 - +08 2020 Oct 4 0:01 8:00 - %z 2020 Oct 4 0:01
11:00 - +11 2021 Mar 14 0:00 11:00 - %z 2021 Mar 14 0:00
8:00 - +08 2021 Oct 3 0:01 8:00 - %z 2021 Oct 3 0:01
11:00 - +11 2022 Mar 13 0:00 11:00 - %z 2022 Mar 13 0:00
8:00 - +08 2022 Oct 2 0:01 8:00 - %z 2022 Oct 2 0:01
11:00 - +11 2023 Mar 9 3:00 11:00 - %z 2023 Mar 9 3:00
8:00 - +08 8:00 - %z
Zone Antarctica/Davis 0 - -00 1957 Jan 13 Zone Antarctica/Davis 0 - -00 1957 Jan 13
7:00 - +07 1964 Nov 7:00 - %z 1964 Nov
0 - -00 1969 Feb 0 - -00 1969 Feb
7:00 - +07 2009 Oct 18 2:00 7:00 - %z 2009 Oct 18 2:00
5:00 - +05 2010 Mar 10 20:00u 5:00 - %z 2010 Mar 10 20:00u
7:00 - +07 2011 Oct 28 2:00 7:00 - %z 2011 Oct 28 2:00
5:00 - +05 2012 Feb 21 20:00u 5:00 - %z 2012 Feb 21 20:00u
7:00 - +07 7:00 - %z
Zone Antarctica/Mawson 0 - -00 1954 Feb 13 Zone Antarctica/Mawson 0 - -00 1954 Feb 13
6:00 - +06 2009 Oct 18 2:00 6:00 - %z 2009 Oct 18 2:00
5:00 - +05 5:00 - %z
# References: # References:
# Casey Weather (1998-02-26) # Casey Weather (1998-02-26)
# http://www.antdiv.gov.au/aad/exop/sfo/casey/casey_aws.html # http://www.antdiv.gov.au/aad/exop/sfo/casey/casey_aws.html
@ -304,10 +304,10 @@ Zone Antarctica/Troll 0 - -00 2005 Feb 12
# Zone NAME STDOFF RULES FORMAT [UNTIL] # Zone NAME STDOFF RULES FORMAT [UNTIL]
Zone Antarctica/Vostok 0 - -00 1957 Dec 16 Zone Antarctica/Vostok 0 - -00 1957 Dec 16
7:00 - +07 1994 Feb 7:00 - %z 1994 Feb
0 - -00 1994 Nov 0 - -00 1994 Nov
7:00 - +07 2023 Dec 18 2:00 7:00 - %z 2023 Dec 18 2:00
5:00 - +05 5:00 - %z
# S Africa - year-round bases # S Africa - year-round bases
# Marion Island, -4653+03752 # Marion Island, -4653+03752
@ -340,7 +340,7 @@ Zone Antarctica/Vostok 0 - -00 1957 Dec 16
# #
# Zone NAME STDOFF RULES FORMAT [UNTIL] # Zone NAME STDOFF RULES FORMAT [UNTIL]
Zone Antarctica/Rothera 0 - -00 1976 Dec 1 Zone Antarctica/Rothera 0 - -00 1976 Dec 1
-3:00 - -03 -3:00 - %z
# Uruguay - year round base # Uruguay - year round base
# Artigas, King George Island, -621104-0585107 # Artigas, King George Island, -621104-0585107

View file

@ -1,4 +1,4 @@
# $OpenBSD: asia,v 1.109 2024/02/05 17:07:23 millert Exp $ # $OpenBSD: asia,v 1.110 2024/10/02 17:08:47 millert Exp $
# tzdb data for Asia and environs # tzdb data for Asia and environs
# This file is in the public domain, so clarified as of # This file is in the public domain, so clarified as of
@ -84,8 +84,8 @@ Rule RussiaAsia 1996 2010 - Oct lastSun 2:00s 0 -
# Afghanistan # Afghanistan
# Zone NAME STDOFF RULES FORMAT [UNTIL] # Zone NAME STDOFF RULES FORMAT [UNTIL]
Zone Asia/Kabul 4:36:48 - LMT 1890 Zone Asia/Kabul 4:36:48 - LMT 1890
4:00 - +04 1945 4:00 - %z 1945
4:30 - +0430 4:30 - %z
# Armenia # Armenia
# From Paul Eggert (2006-03-22): # From Paul Eggert (2006-03-22):
@ -117,12 +117,12 @@ Rule Armenia 2011 only - Mar lastSun 2:00s 1:00 -
Rule Armenia 2011 only - Oct lastSun 2:00s 0 - Rule Armenia 2011 only - Oct lastSun 2:00s 0 -
# Zone NAME STDOFF RULES FORMAT [UNTIL] # Zone NAME STDOFF RULES FORMAT [UNTIL]
Zone Asia/Yerevan 2:58:00 - LMT 1924 May 2 Zone Asia/Yerevan 2:58:00 - LMT 1924 May 2
3:00 - +03 1957 Mar 3:00 - %z 1957 Mar
4:00 RussiaAsia +04/+05 1991 Mar 31 2:00s 4:00 RussiaAsia %z 1991 Mar 31 2:00s
3:00 RussiaAsia +03/+04 1995 Sep 24 2:00s 3:00 RussiaAsia %z 1995 Sep 24 2:00s
4:00 - +04 1997 4:00 - %z 1997
4:00 RussiaAsia +04/+05 2011 4:00 RussiaAsia %z 2011
4:00 Armenia +04/+05 4:00 Armenia %z
# Azerbaijan # Azerbaijan
@ -143,12 +143,12 @@ Rule Azer 1997 2015 - Mar lastSun 4:00 1:00 -
Rule Azer 1997 2015 - Oct lastSun 5:00 0 - Rule Azer 1997 2015 - Oct lastSun 5:00 0 -
# Zone NAME STDOFF RULES FORMAT [UNTIL] # Zone NAME STDOFF RULES FORMAT [UNTIL]
Zone Asia/Baku 3:19:24 - LMT 1924 May 2 Zone Asia/Baku 3:19:24 - LMT 1924 May 2
3:00 - +03 1957 Mar 3:00 - %z 1957 Mar
4:00 RussiaAsia +04/+05 1991 Mar 31 2:00s 4:00 RussiaAsia %z 1991 Mar 31 2:00s
3:00 RussiaAsia +03/+04 1992 Sep lastSun 2:00s 3:00 RussiaAsia %z 1992 Sep lastSun 2:00s
4:00 - +04 1996 4:00 - %z 1996
4:00 EUAsia +04/+05 1997 4:00 EUAsia %z 1997
4:00 Azer +04/+05 4:00 Azer %z
# Bahrain # Bahrain
# Zone NAME STDOFF RULES FORMAT [UNTIL] # Zone NAME STDOFF RULES FORMAT [UNTIL]
@ -236,17 +236,17 @@ Rule Dhaka 2009 only - Dec 31 24:00 0 -
# Zone NAME STDOFF RULES FORMAT [UNTIL] # Zone NAME STDOFF RULES FORMAT [UNTIL]
Zone Asia/Dhaka 6:01:40 - LMT 1890 Zone Asia/Dhaka 6:01:40 - LMT 1890
5:53:20 - HMT 1941 Oct # Howrah Mean Time? 5:53:20 - HMT 1941 Oct # Howrah Mean Time?
6:30 - +0630 1942 May 15 6:30 - %z 1942 May 15
5:30 - +0530 1942 Sep 5:30 - %z 1942 Sep
6:30 - +0630 1951 Sep 30 6:30 - %z 1951 Sep 30
6:00 - +06 2009 6:00 - %z 2009
6:00 Dhaka +06/+07 6:00 Dhaka %z
# Bhutan # Bhutan
# Zone NAME STDOFF RULES FORMAT [UNTIL] # Zone NAME STDOFF RULES FORMAT [UNTIL]
Zone Asia/Thimphu 5:58:36 - LMT 1947 Aug 15 # or Thimbu Zone Asia/Thimphu 5:58:36 - LMT 1947 Aug 15 # or Thimbu
5:30 - +0530 1987 Oct 5:30 - %z 1987 Oct
6:00 - +06 6:00 - %z
# British Indian Ocean Territory # British Indian Ocean Territory
# Whitman and the 1995 CIA time zone map say 5:00, but the # Whitman and the 1995 CIA time zone map say 5:00, but the
@ -256,8 +256,8 @@ Zone Asia/Thimphu 5:58:36 - LMT 1947 Aug 15 # or Thimbu
# then contained the Chagos Archipelago). # then contained the Chagos Archipelago).
# Zone NAME STDOFF RULES FORMAT [UNTIL] # Zone NAME STDOFF RULES FORMAT [UNTIL]
Zone Indian/Chagos 4:49:40 - LMT 1907 Zone Indian/Chagos 4:49:40 - LMT 1907
5:00 - +05 1996 5:00 - %z 1996
6:00 - +06 6:00 - %z
# Brunei # Brunei
# Zone NAME STDOFF RULES FORMAT [UNTIL] # Zone NAME STDOFF RULES FORMAT [UNTIL]
@ -278,9 +278,9 @@ Zone Asia/Brunei 7:39:40 - LMT 1926 Mar # Bandar Seri Begawan
# Zone NAME STDOFF RULES FORMAT [UNTIL] # Zone NAME STDOFF RULES FORMAT [UNTIL]
Zone Asia/Yangon 6:24:47 - LMT 1880 # or Rangoon Zone Asia/Yangon 6:24:47 - LMT 1880 # or Rangoon
6:24:47 - RMT 1920 # Rangoon local time 6:24:47 - RMT 1920 # Rangoon local time
6:30 - +0630 1942 May 6:30 - %z 1942 May
9:00 - +09 1945 May 3 9:00 - %z 1945 May 3
6:30 - +0630 6:30 - %z
# Cambodia # Cambodia
# Zone NAME STDOFF RULES FORMAT [UNTIL] # Zone NAME STDOFF RULES FORMAT [UNTIL]
@ -678,7 +678,7 @@ Zone Asia/Shanghai 8:05:43 - LMT 1901
# Xinjiang time, used by many in western China; represented by Ürümqi / Ürümchi # Xinjiang time, used by many in western China; represented by Ürümqi / Ürümchi
# / Wulumuqi. (Please use Asia/Shanghai if you prefer Beijing time.) # / Wulumuqi. (Please use Asia/Shanghai if you prefer Beijing time.)
Zone Asia/Urumqi 5:50:20 - LMT 1928 Zone Asia/Urumqi 5:50:20 - LMT 1928
6:00 - +06 6:00 - %z
# Hong Kong # Hong Kong
@ -1136,7 +1136,7 @@ Rule Macau 1979 only - Oct Sun>=16 03:30 0 S
# Zone NAME STDOFF RULES FORMAT [UNTIL] # Zone NAME STDOFF RULES FORMAT [UNTIL]
Zone Asia/Macau 7:34:10 - LMT 1904 Oct 30 Zone Asia/Macau 7:34:10 - LMT 1904 Oct 30
8:00 - CST 1941 Dec 21 23:00 8:00 - CST 1941 Dec 21 23:00
9:00 Macau +09/+10 1945 Sep 30 24:00 9:00 Macau %z 1945 Sep 30 24:00
8:00 Macau C%sT 8:00 Macau C%sT
@ -1179,7 +1179,7 @@ Zone Asia/Nicosia 2:13:28 - LMT 1921 Nov 14
Zone Asia/Famagusta 2:15:48 - LMT 1921 Nov 14 Zone Asia/Famagusta 2:15:48 - LMT 1921 Nov 14
2:00 Cyprus EE%sT 1998 Sep 2:00 Cyprus EE%sT 1998 Sep
2:00 EUAsia EE%sT 2016 Sep 8 2:00 EUAsia EE%sT 2016 Sep 8
3:00 - +03 2017 Oct 29 1:00u 3:00 - %z 2017 Oct 29 1:00u
2:00 EUAsia EE%sT 2:00 EUAsia EE%sT
# Georgia # Georgia
@ -1220,18 +1220,25 @@ Zone Asia/Famagusta 2:15:48 - LMT 1921 Nov 14
# Zone NAME STDOFF RULES FORMAT [UNTIL] # Zone NAME STDOFF RULES FORMAT [UNTIL]
Zone Asia/Tbilisi 2:59:11 - LMT 1880 Zone Asia/Tbilisi 2:59:11 - LMT 1880
2:59:11 - TBMT 1924 May 2 # Tbilisi Mean Time 2:59:11 - TBMT 1924 May 2 # Tbilisi Mean Time
3:00 - +03 1957 Mar 3:00 - %z 1957 Mar
4:00 RussiaAsia +04/+05 1991 Mar 31 2:00s 4:00 RussiaAsia %z 1991 Mar 31 2:00s
3:00 RussiaAsia +03/+04 1992 3:00 RussiaAsia %z 1992
3:00 E-EurAsia +03/+04 1994 Sep lastSun 3:00 E-EurAsia %z 1994 Sep lastSun
4:00 E-EurAsia +04/+05 1996 Oct lastSun 4:00 E-EurAsia %z 1996 Oct lastSun
4:00 1:00 +05 1997 Mar lastSun 4:00 1:00 %z 1997 Mar lastSun
4:00 E-EurAsia +04/+05 2004 Jun 27 4:00 E-EurAsia %z 2004 Jun 27
3:00 RussiaAsia +03/+04 2005 Mar lastSun 2:00 3:00 RussiaAsia %z 2005 Mar lastSun 2:00
4:00 - +04 4:00 - %z
# East Timor # East Timor
# From Tim Parenti (2024-07-01):
# The 1912-01-01 transition occurred at 00:00 new time, per the 1911-05-24
# Portuguese decree (see Europe/Lisbon). A provision in article 5(c) of the
# decree prescribed that Timor "will keep counting time in harmony with
# neighboring foreign colonies, [for] as long as they do not adopt the time
# that belongs to them in [the Washington Convention] system."
# See Indonesia for the 1945 transition. # See Indonesia for the 1945 transition.
# From João Carrascalão, brother of the former governor of East Timor, in # From João Carrascalão, brother of the former governor of East Timor, in
@ -1255,11 +1262,11 @@ Zone Asia/Tbilisi 2:59:11 - LMT 1880
# midnight on Saturday, September 16. # midnight on Saturday, September 16.
# Zone NAME STDOFF RULES FORMAT [UNTIL] # Zone NAME STDOFF RULES FORMAT [UNTIL]
Zone Asia/Dili 8:22:20 - LMT 1912 Jan 1 Zone Asia/Dili 8:22:20 - LMT 1911 Dec 31 16:00u
8:00 - +08 1942 Feb 21 23:00 8:00 - %z 1942 Feb 21 23:00
9:00 - +09 1976 May 3 9:00 - %z 1976 May 3
8:00 - +08 2000 Sep 17 0:00 8:00 - %z 2000 Sep 17 0:00
9:00 - +09 9:00 - %z
# India # India
@ -1325,9 +1332,9 @@ Zone Asia/Kolkata 5:53:28 - LMT 1854 Jun 28 # Kolkata
5:53:20 - HMT 1870 # Howrah Mean Time? 5:53:20 - HMT 1870 # Howrah Mean Time?
5:21:10 - MMT 1906 Jan 1 # Madras local time 5:21:10 - MMT 1906 Jan 1 # Madras local time
5:30 - IST 1941 Oct 5:30 - IST 1941 Oct
5:30 1:00 +0630 1942 May 15 5:30 1:00 %z 1942 May 15
5:30 - IST 1942 Sep 5:30 - IST 1942 Sep
5:30 1:00 +0630 1945 Oct 15 5:30 1:00 %z 1945 Oct 15
5:30 - IST 5:30 - IST
# Since 1970 the following are like Asia/Kolkata: # Since 1970 the following are like Asia/Kolkata:
# Andaman Is # Andaman Is
@ -1379,33 +1386,33 @@ Zone Asia/Jakarta 7:07:12 - LMT 1867 Aug 10
# Shanks & Pottenger say the next transition was at 1924 Jan 1 0:13, # Shanks & Pottenger say the next transition was at 1924 Jan 1 0:13,
# but this must be a typo. # but this must be a typo.
7:07:12 - BMT 1923 Dec 31 16:40u # Batavia 7:07:12 - BMT 1923 Dec 31 16:40u # Batavia
7:20 - +0720 1932 Nov 7:20 - %z 1932 Nov
7:30 - +0730 1942 Mar 23 7:30 - %z 1942 Mar 23
9:00 - +09 1945 Sep 23 9:00 - %z 1945 Sep 23
7:30 - +0730 1948 May 7:30 - %z 1948 May
8:00 - +08 1950 May 8:00 - %z 1950 May
7:30 - +0730 1964 7:30 - %z 1964
7:00 - WIB 7:00 - WIB
# west and central Borneo # west and central Borneo
Zone Asia/Pontianak 7:17:20 - LMT 1908 May Zone Asia/Pontianak 7:17:20 - LMT 1908 May
7:17:20 - PMT 1932 Nov # Pontianak MT 7:17:20 - PMT 1932 Nov # Pontianak MT
7:30 - +0730 1942 Jan 29 7:30 - %z 1942 Jan 29
9:00 - +09 1945 Sep 23 9:00 - %z 1945 Sep 23
7:30 - +0730 1948 May 7:30 - %z 1948 May
8:00 - +08 1950 May 8:00 - %z 1950 May
7:30 - +0730 1964 7:30 - %z 1964
8:00 - WITA 1988 Jan 1 8:00 - WITA 1988 Jan 1
7:00 - WIB 7:00 - WIB
# Sulawesi, Lesser Sundas, east and south Borneo # Sulawesi, Lesser Sundas, east and south Borneo
Zone Asia/Makassar 7:57:36 - LMT 1920 Zone Asia/Makassar 7:57:36 - LMT 1920
7:57:36 - MMT 1932 Nov # Macassar MT 7:57:36 - MMT 1932 Nov # Macassar MT
8:00 - +08 1942 Feb 9 8:00 - %z 1942 Feb 9
9:00 - +09 1945 Sep 23 9:00 - %z 1945 Sep 23
8:00 - WITA 8:00 - WITA
# Maluku Islands, West Papua, Papua # Maluku Islands, West Papua, Papua
Zone Asia/Jayapura 9:22:48 - LMT 1932 Nov Zone Asia/Jayapura 9:22:48 - LMT 1932 Nov
9:00 - +09 1944 Sep 1 9:00 - %z 1944 Sep 1
9:30 - +0930 1964 9:30 - %z 1964
9:00 - WIT 9:00 - WIT
# Iran # Iran
@ -1641,9 +1648,9 @@ Rule Iran 2021 2022 - Sep 21 24:00 0 -
# Zone NAME STDOFF RULES FORMAT [UNTIL] # Zone NAME STDOFF RULES FORMAT [UNTIL]
Zone Asia/Tehran 3:25:44 - LMT 1916 Zone Asia/Tehran 3:25:44 - LMT 1916
3:25:44 - TMT 1935 Jun 13 # Tehran Mean Time 3:25:44 - TMT 1935 Jun 13 # Tehran Mean Time
3:30 Iran +0330/+0430 1977 Oct 20 24:00 3:30 Iran %z 1977 Oct 20 24:00
4:00 Iran +04/+05 1979 4:00 Iran %z 1979
3:30 Iran +0330/+0430 3:30 Iran %z
# Iraq # Iraq
@ -1686,8 +1693,8 @@ Rule Iraq 1991 2007 - Oct 1 3:00s 0 -
# Zone NAME STDOFF RULES FORMAT [UNTIL] # Zone NAME STDOFF RULES FORMAT [UNTIL]
Zone Asia/Baghdad 2:57:40 - LMT 1890 Zone Asia/Baghdad 2:57:40 - LMT 1890
2:57:36 - BMT 1918 # Baghdad Mean Time? 2:57:36 - BMT 1918 # Baghdad Mean Time?
3:00 - +03 1982 May 3:00 - %z 1982 May
3:00 Iraq +03/+04 3:00 Iraq %z
############################################################################### ###############################################################################
@ -2284,7 +2291,7 @@ Rule Jordan 2022 only - Feb lastThu 24:00 1:00 S
# Zone NAME STDOFF RULES FORMAT [UNTIL] # Zone NAME STDOFF RULES FORMAT [UNTIL]
Zone Asia/Amman 2:23:44 - LMT 1931 Zone Asia/Amman 2:23:44 - LMT 1931
2:00 Jordan EE%sT 2022 Oct 28 0:00s 2:00 Jordan EE%sT 2022 Oct 28 0:00s
3:00 - +03 3:00 - %z
# Kazakhstan # Kazakhstan
@ -2495,88 +2502,88 @@ Zone Asia/Amman 2:23:44 - LMT 1931
# Almaty (formerly Alma-Ata), representing most locations in Kazakhstan # Almaty (formerly Alma-Ata), representing most locations in Kazakhstan
# This includes Abai/Abay (ISO 3166-2 code KZ-10), Aqmola/Akmola (KZ-11), # This includes Abai/Abay (ISO 3166-2 code KZ-10), Aqmola/Akmola (KZ-11),
# Almaty (KZ-19), Almaty city (KZ-75), Astana city (KZ-71), # Almaty (KZ-19), Almaty city (KZ-75), Astana city (KZ-71),
# East Kazkhstan (KZ-63), Jambyl/Zhambyl (KZ-31), Jetisu/Zhetysu (KZ-33), # East Kazakhstan (KZ-63), Jambyl/Zhambyl (KZ-31), Jetisu/Zhetysu (KZ-33),
# Karaganda (KZ-35), North Kazakhstan (KZ-59), Pavlodar (KZ-55), # Karaganda (KZ-35), North Kazakhstan (KZ-59), Pavlodar (KZ-55),
# Shyumkent city (KZ-79), Turkistan (KZ-61), and Ulytau (KZ-62). # Shymkent city (KZ-79), Turkistan (KZ-61), and Ulytau (KZ-62).
Zone Asia/Almaty 5:07:48 - LMT 1924 May 2 # or Alma-Ata Zone Asia/Almaty 5:07:48 - LMT 1924 May 2 # or Alma-Ata
5:00 - +05 1930 Jun 21 5:00 - %z 1930 Jun 21
6:00 RussiaAsia +06/+07 1991 Mar 31 2:00s 6:00 RussiaAsia %z 1991 Mar 31 2:00s
5:00 RussiaAsia +05/+06 1992 Jan 19 2:00s 5:00 RussiaAsia %z 1992 Jan 19 2:00s
6:00 RussiaAsia +06/+07 2004 Oct 31 2:00s 6:00 RussiaAsia %z 2004 Oct 31 2:00s
6:00 - +06 2024 Mar 1 0:00 6:00 - %z 2024 Mar 1 0:00
5:00 - +05 5:00 - %z
# Qyzylorda (aka Kyzylorda, Kizilorda, Kzyl-Orda, etc.) (KZ-43) # Qyzylorda (aka Kyzylorda, Kizilorda, Kzyl-Orda, etc.) (KZ-43)
Zone Asia/Qyzylorda 4:21:52 - LMT 1924 May 2 Zone Asia/Qyzylorda 4:21:52 - LMT 1924 May 2
4:00 - +04 1930 Jun 21 4:00 - %z 1930 Jun 21
5:00 - +05 1981 Apr 1 5:00 - %z 1981 Apr 1
5:00 1:00 +06 1981 Oct 1 5:00 1:00 %z 1981 Oct 1
6:00 - +06 1982 Apr 1 6:00 - %z 1982 Apr 1
5:00 RussiaAsia +05/+06 1991 Mar 31 2:00s 5:00 RussiaAsia %z 1991 Mar 31 2:00s
4:00 RussiaAsia +04/+05 1991 Sep 29 2:00s 4:00 RussiaAsia %z 1991 Sep 29 2:00s
5:00 RussiaAsia +05/+06 1992 Jan 19 2:00s 5:00 RussiaAsia %z 1992 Jan 19 2:00s
6:00 RussiaAsia +06/+07 1992 Mar 29 2:00s 6:00 RussiaAsia %z 1992 Mar 29 2:00s
5:00 RussiaAsia +05/+06 2004 Oct 31 2:00s 5:00 RussiaAsia %z 2004 Oct 31 2:00s
6:00 - +06 2018 Dec 21 0:00 6:00 - %z 2018 Dec 21 0:00
5:00 - +05 5:00 - %z
# Qostanay (aka Kostanay, Kustanay) (KZ-39) # Qostanay (aka Kostanay, Kustanay) (KZ-39)
# The 1991/2 rules are unclear partly because of the 1997 Turgai # The 1991/2 rules are unclear partly because of the 1997 Turgai
# reorganization. # reorganization.
Zone Asia/Qostanay 4:14:28 - LMT 1924 May 2 Zone Asia/Qostanay 4:14:28 - LMT 1924 May 2
4:00 - +04 1930 Jun 21 4:00 - %z 1930 Jun 21
5:00 - +05 1981 Apr 1 5:00 - %z 1981 Apr 1
5:00 1:00 +06 1981 Oct 1 5:00 1:00 %z 1981 Oct 1
6:00 - +06 1982 Apr 1 6:00 - %z 1982 Apr 1
5:00 RussiaAsia +05/+06 1991 Mar 31 2:00s 5:00 RussiaAsia %z 1991 Mar 31 2:00s
4:00 RussiaAsia +04/+05 1992 Jan 19 2:00s 4:00 RussiaAsia %z 1992 Jan 19 2:00s
5:00 RussiaAsia +05/+06 2004 Oct 31 2:00s 5:00 RussiaAsia %z 2004 Oct 31 2:00s
6:00 - +06 2024 Mar 1 0:00 6:00 - %z 2024 Mar 1 0:00
5:00 - +05 5:00 - %z
# Aqtöbe (aka Aktobe, formerly Aktyubinsk) (KZ-15) # Aqtöbe (aka Aktobe, formerly Aktyubinsk) (KZ-15)
Zone Asia/Aqtobe 3:48:40 - LMT 1924 May 2 Zone Asia/Aqtobe 3:48:40 - LMT 1924 May 2
4:00 - +04 1930 Jun 21 4:00 - %z 1930 Jun 21
5:00 - +05 1981 Apr 1 5:00 - %z 1981 Apr 1
5:00 1:00 +06 1981 Oct 1 5:00 1:00 %z 1981 Oct 1
6:00 - +06 1982 Apr 1 6:00 - %z 1982 Apr 1
5:00 RussiaAsia +05/+06 1991 Mar 31 2:00s 5:00 RussiaAsia %z 1991 Mar 31 2:00s
4:00 RussiaAsia +04/+05 1992 Jan 19 2:00s 4:00 RussiaAsia %z 1992 Jan 19 2:00s
5:00 RussiaAsia +05/+06 2004 Oct 31 2:00s 5:00 RussiaAsia %z 2004 Oct 31 2:00s
5:00 - +05 5:00 - %z
# Mangghystaū (KZ-47) # Mangghystaū (KZ-47)
# Aqtau was not founded until 1963, but it represents an inhabited region, # Aqtau was not founded until 1963, but it represents an inhabited region,
# so include timestamps before 1963. # so include timestamps before 1963.
Zone Asia/Aqtau 3:21:04 - LMT 1924 May 2 Zone Asia/Aqtau 3:21:04 - LMT 1924 May 2
4:00 - +04 1930 Jun 21 4:00 - %z 1930 Jun 21
5:00 - +05 1981 Oct 1 5:00 - %z 1981 Oct 1
6:00 - +06 1982 Apr 1 6:00 - %z 1982 Apr 1
5:00 RussiaAsia +05/+06 1991 Mar 31 2:00s 5:00 RussiaAsia %z 1991 Mar 31 2:00s
4:00 RussiaAsia +04/+05 1992 Jan 19 2:00s 4:00 RussiaAsia %z 1992 Jan 19 2:00s
5:00 RussiaAsia +05/+06 1994 Sep 25 2:00s 5:00 RussiaAsia %z 1994 Sep 25 2:00s
4:00 RussiaAsia +04/+05 2004 Oct 31 2:00s 4:00 RussiaAsia %z 2004 Oct 31 2:00s
5:00 - +05 5:00 - %z
# Atyraū (KZ-23) is like Mangghystaū except it switched from # Atyraū (KZ-23) is like Mangghystaū except it switched from
# +04/+05 to +05/+06 in spring 1999, not fall 1994. # +04/+05 to +05/+06 in spring 1999, not fall 1994.
Zone Asia/Atyrau 3:27:44 - LMT 1924 May 2 Zone Asia/Atyrau 3:27:44 - LMT 1924 May 2
3:00 - +03 1930 Jun 21 3:00 - %z 1930 Jun 21
5:00 - +05 1981 Oct 1 5:00 - %z 1981 Oct 1
6:00 - +06 1982 Apr 1 6:00 - %z 1982 Apr 1
5:00 RussiaAsia +05/+06 1991 Mar 31 2:00s 5:00 RussiaAsia %z 1991 Mar 31 2:00s
4:00 RussiaAsia +04/+05 1992 Jan 19 2:00s 4:00 RussiaAsia %z 1992 Jan 19 2:00s
5:00 RussiaAsia +05/+06 1999 Mar 28 2:00s 5:00 RussiaAsia %z 1999 Mar 28 2:00s
4:00 RussiaAsia +04/+05 2004 Oct 31 2:00s 4:00 RussiaAsia %z 2004 Oct 31 2:00s
5:00 - +05 5:00 - %z
# West Kazakhstan (KZ-27) # West Kazakhstan (KZ-27)
# From Paul Eggert (2016-03-18): # From Paul Eggert (2016-03-18):
# The 1989 transition is from USSR act No. 227 (1989-03-14). # The 1989 transition is from USSR act No. 227 (1989-03-14).
Zone Asia/Oral 3:25:24 - LMT 1924 May 2 # or Ural'sk Zone Asia/Oral 3:25:24 - LMT 1924 May 2 # or Ural'sk
3:00 - +03 1930 Jun 21 3:00 - %z 1930 Jun 21
5:00 - +05 1981 Apr 1 5:00 - %z 1981 Apr 1
5:00 1:00 +06 1981 Oct 1 5:00 1:00 %z 1981 Oct 1
6:00 - +06 1982 Apr 1 6:00 - %z 1982 Apr 1
5:00 RussiaAsia +05/+06 1989 Mar 26 2:00s 5:00 RussiaAsia %z 1989 Mar 26 2:00s
4:00 RussiaAsia +04/+05 1992 Jan 19 2:00s 4:00 RussiaAsia %z 1992 Jan 19 2:00s
5:00 RussiaAsia +05/+06 1992 Mar 29 2:00s 5:00 RussiaAsia %z 1992 Mar 29 2:00s
4:00 RussiaAsia +04/+05 2004 Oct 31 2:00s 4:00 RussiaAsia %z 2004 Oct 31 2:00s
5:00 - +05 5:00 - %z
# Kyrgyzstan (Kirgizstan) # Kyrgyzstan (Kirgizstan)
# Transitions through 1991 are from Shanks & Pottenger. # Transitions through 1991 are from Shanks & Pottenger.
@ -2597,11 +2604,11 @@ Rule Kyrgyz 1997 2005 - Mar lastSun 2:30 1:00 -
Rule Kyrgyz 1997 2004 - Oct lastSun 2:30 0 - Rule Kyrgyz 1997 2004 - Oct lastSun 2:30 0 -
# Zone NAME STDOFF RULES FORMAT [UNTIL] # Zone NAME STDOFF RULES FORMAT [UNTIL]
Zone Asia/Bishkek 4:58:24 - LMT 1924 May 2 Zone Asia/Bishkek 4:58:24 - LMT 1924 May 2
5:00 - +05 1930 Jun 21 5:00 - %z 1930 Jun 21
6:00 RussiaAsia +06/+07 1991 Mar 31 2:00s 6:00 RussiaAsia %z 1991 Mar 31 2:00s
5:00 RussiaAsia +05/+06 1991 Aug 31 2:00 5:00 RussiaAsia %z 1991 Aug 31 2:00
5:00 Kyrgyz +05/+06 2005 Aug 12 5:00 Kyrgyz %z 2005 Aug 12
6:00 - +06 6:00 - %z
############################################################################### ###############################################################################
@ -2832,16 +2839,16 @@ Zone Asia/Kuala_Lumpur 6:46:46 - LMT 1901 Jan 1
# and 1982 transition dates are from Mok Ly Yng. # and 1982 transition dates are from Mok Ly Yng.
# Zone NAME STDOFF RULES FORMAT [UNTIL] # Zone NAME STDOFF RULES FORMAT [UNTIL]
Zone Asia/Kuching 7:21:20 - LMT 1926 Mar Zone Asia/Kuching 7:21:20 - LMT 1926 Mar
7:30 - +0730 1933 7:30 - %z 1933
8:00 NBorneo +08/+0820 1942 Feb 16 8:00 NBorneo %z 1942 Feb 16
9:00 - +09 1945 Sep 12 9:00 - %z 1945 Sep 12
8:00 - +08 8:00 - %z
# Maldives # Maldives
# Zone NAME STDOFF RULES FORMAT [UNTIL] # Zone NAME STDOFF RULES FORMAT [UNTIL]
Zone Indian/Maldives 4:54:00 - LMT 1880 # Malé Zone Indian/Maldives 4:54:00 - LMT 1880 # Malé
4:54:00 - MMT 1960 # Malé Mean Time 4:54:00 - MMT 1960 # Malé Mean Time
5:00 - +05 5:00 - %z
# Mongolia # Mongolia
@ -2943,9 +2950,37 @@ Zone Indian/Maldives 4:54:00 - LMT 1880 # Malé
# From Arthur David Olson (2008-05-19): # From Arthur David Olson (2008-05-19):
# Assume that Choibalsan is indeed offset by 8:00. # Assume that Choibalsan is indeed offset by 8:00.
# XXX--in the absence of better information, assume that transition
# was at the start of 2008-03-31 (the day of Steffen Thorsen's report); # From Heitor David Pinto (2024-06-23):
# this is almost surely wrong. # Sources about time zones in Mongolia seem to list one of two conflicting
# configurations. The first configuration, mentioned in a comment to the TZ
# database in 1999, citing a Mongolian government website, lists the provinces
# of Bayan-Ölgii, Khovd and Uvs in UTC+7, and the rest of the country in
# UTC+8. The second configuration, mentioned in a comment to the database in
# 2001, lists Bayan-Ölgii, Khovd, Uvs, Govi-Altai and Zavkhan in UTC+7, Dornod
# and Sükhbaatar in UTC+9, and the rest of the country in UTC+8.
#
# The first configuration is still mentioned by several Mongolian travel
# agencies:
# https://www.adventurerider.mn/en/page/about_mongolia
# http://www.naturetours.mn/nt/mongolia.php
# https://www.newjuulchin.mn/web/content/7506?unique=fa24a0f6e96e022a3578ee5195ac879638c734ce
#
# It also matches these flight schedules in 2013:
# http://web.archive.org/web/20130722023600/https://www.hunnuair.com/en/timetabled
# The flight times imply that the airports of Uliastai (Zavkhan), Choibalsan
# (Dornod) and Altai (Govi-Altai) are in the same time zone as Ulaanbaatar,
# and Khovd is one hour behind....
#
# The second configuration was mentioned by an official of the Mongolian
# standards agency in an interview in 2014: https://ikon.mn/n/9v6
# And it's still listed by the Mongolian aviation agency:
# https://ais.mn/files/aip/eAIP/2023-12-25/html/eSUP/ZM-eSUP-23-04-en-MN.html
#
# ... I believe that the first configuration is what is actually observed in
# Mongolia and has been so all along, at least since 1999. The second
# configuration closely matches the ideal time zone boundaries at 97.5° E and
# 112.5° E but it doesn't seem to be used in practice.
# From Ganbold Tsagaankhuu (2015-03-10): # From Ganbold Tsagaankhuu (2015-03-10):
# It seems like yesterday Mongolian Government meeting has concluded to use # It seems like yesterday Mongolian Government meeting has concluded to use
@ -2984,25 +3019,18 @@ Rule Mongol 2015 2016 - Sep lastSat 0:00 0 -
# Zone NAME STDOFF RULES FORMAT [UNTIL] # Zone NAME STDOFF RULES FORMAT [UNTIL]
# Hovd, a.k.a. Chovd, Dund-Us, Dzhargalant, Khovd, Jirgalanta # Hovd, a.k.a. Chovd, Dund-Us, Dzhargalant, Khovd, Jirgalanta
Zone Asia/Hovd 6:06:36 - LMT 1905 Aug Zone Asia/Hovd 6:06:36 - LMT 1905 Aug
6:00 - +06 1978 6:00 - %z 1978
7:00 Mongol +07/+08 7:00 Mongol %z
# Ulaanbaatar, a.k.a. Ulan Bataar, Ulan Bator, Urga # Ulaanbaatar, a.k.a. Ulan Bataar, Ulan Bator, Urga
Zone Asia/Ulaanbaatar 7:07:32 - LMT 1905 Aug Zone Asia/Ulaanbaatar 7:07:32 - LMT 1905 Aug
7:00 - +07 1978 7:00 - %z 1978
8:00 Mongol +08/+09 8:00 Mongol %z
# Choibalsan, a.k.a. Bajan Tümen, Bajan Tumen, Chojbalsan,
# Choybalsan, Sanbejse, Tchoibalsan
Zone Asia/Choibalsan 7:38:00 - LMT 1905 Aug
7:00 - +07 1978
8:00 - +08 1983 Apr
9:00 Mongol +09/+10 2008 Mar 31
8:00 Mongol +08/+09
# Nepal # Nepal
# Zone NAME STDOFF RULES FORMAT [UNTIL] # Zone NAME STDOFF RULES FORMAT [UNTIL]
Zone Asia/Kathmandu 5:41:16 - LMT 1920 Zone Asia/Kathmandu 5:41:16 - LMT 1920
5:30 - +0530 1986 5:30 - %z 1986
5:45 - +0545 5:45 - %z
# Oman # Oman
# Zone NAME STDOFF RULES FORMAT [UNTIL] # Zone NAME STDOFF RULES FORMAT [UNTIL]
@ -3153,10 +3181,10 @@ Rule Pakistan 2009 only - Apr 15 0:00 1:00 S
# Zone NAME STDOFF RULES FORMAT [UNTIL] # Zone NAME STDOFF RULES FORMAT [UNTIL]
Zone Asia/Karachi 4:28:12 - LMT 1907 Zone Asia/Karachi 4:28:12 - LMT 1907
5:30 - +0530 1942 Sep 5:30 - %z 1942 Sep
5:30 1:00 +0630 1945 Oct 15 5:30 1:00 %z 1945 Oct 15
5:30 - +0530 1951 Sep 30 5:30 - %z 1951 Sep 30
5:00 - +05 1971 Mar 26 5:00 - %z 1971 Mar 26
5:00 Pakistan PK%sT # Pakistan Time 5:00 Pakistan PK%sT # Pakistan Time
# Palestine # Palestine
@ -3704,14 +3732,14 @@ Zone Asia/Hebron 2:20:23 - LMT 1900 Oct
# Philippine Star 2014-08-05 # Philippine Star 2014-08-05
# http://www.philstar.com/headlines/2014/08/05/1354152/pnoy-urged-declare-use-daylight-saving-time # http://www.philstar.com/headlines/2014/08/05/1354152/pnoy-urged-declare-use-daylight-saving-time
# From Paul Goyette (2018-06-15): # From Paul Goyette (2018-06-15) with URLs updated by Guy Harris (2024-02-15):
# In the Philippines, there is a national law, Republic Act No. 10535 # In the Philippines, there is a national law, Republic Act No. 10535
# which declares the official time here as "Philippine Standard Time". # which declares the official time here as "Philippine Standard Time".
# The act [1] even specifies use of PST as the abbreviation, although # The act [1] even specifies use of PST as the abbreviation, although
# the FAQ provided by PAGASA [2] uses the "acronym PhST to distinguish # the FAQ provided by PAGASA [2] uses the "acronym PhST to distinguish
# it from the Pacific Standard Time (PST)." # it from the Pacific Standard Time (PST)."
# [1] http://www.officialgazette.gov.ph/2013/05/15/republic-act-no-10535/ # [1] https://www.officialgazette.gov.ph/2013/05/15/republic-act-no-10535/
# [2] https://www1.pagasa.dost.gov.ph/index.php/astronomy/philippine-standard-time#republic-act-10535 # [2] https://prsd.pagasa.dost.gov.ph/index.php/28-astronomy/302-philippine-standard-time
# #
# From Paul Eggert (2018-06-19): # From Paul Eggert (2018-06-19):
# I surveyed recent news reports, and my impression is that "PST" is # I surveyed recent news reports, and my impression is that "PST" is
@ -3743,8 +3771,8 @@ Zone Asia/Manila -15:56:00 - LMT 1844 Dec 31
# Qatar # Qatar
# Zone NAME STDOFF RULES FORMAT [UNTIL] # Zone NAME STDOFF RULES FORMAT [UNTIL]
Zone Asia/Qatar 3:26:08 - LMT 1920 # Al Dawhah / Doha Zone Asia/Qatar 3:26:08 - LMT 1920 # Al Dawhah / Doha
4:00 - +04 1972 Jun 4:00 - %z 1972 Jun
3:00 - +03 3:00 - %z
# Saudi Arabia # Saudi Arabia
# #
@ -3792,7 +3820,7 @@ Zone Asia/Qatar 3:26:08 - LMT 1920 # Al Dawhah / Doha
# #
# Zone NAME STDOFF RULES FORMAT [UNTIL] # Zone NAME STDOFF RULES FORMAT [UNTIL]
Zone Asia/Riyadh 3:06:52 - LMT 1947 Mar 14 Zone Asia/Riyadh 3:06:52 - LMT 1947 Mar 14
3:00 - +03 3:00 - %z
# Singapore # Singapore
# taken from Mok Ly Yng (2003-10-30) # taken from Mok Ly Yng (2003-10-30)
@ -3800,13 +3828,13 @@ Zone Asia/Riyadh 3:06:52 - LMT 1947 Mar 14
# Zone NAME STDOFF RULES FORMAT [UNTIL] # Zone NAME STDOFF RULES FORMAT [UNTIL]
Zone Asia/Singapore 6:55:25 - LMT 1901 Jan 1 Zone Asia/Singapore 6:55:25 - LMT 1901 Jan 1
6:55:25 - SMT 1905 Jun 1 # Singapore M.T. 6:55:25 - SMT 1905 Jun 1 # Singapore M.T.
7:00 - +07 1933 Jan 1 7:00 - %z 1933 Jan 1
7:00 0:20 +0720 1936 Jan 1 7:00 0:20 %z 1936 Jan 1
7:20 - +0720 1941 Sep 1 7:20 - %z 1941 Sep 1
7:30 - +0730 1942 Feb 16 7:30 - %z 1942 Feb 16
9:00 - +09 1945 Sep 12 9:00 - %z 1945 Sep 12
7:30 - +0730 1981 Dec 31 16:00u 7:30 - %z 1981 Dec 31 16:00u
8:00 - +08 8:00 - %z
# Spratly Is # Spratly Is
# no information # no information
@ -3864,13 +3892,13 @@ Zone Asia/Singapore 6:55:25 - LMT 1901 Jan 1
# Zone NAME STDOFF RULES FORMAT [UNTIL] # Zone NAME STDOFF RULES FORMAT [UNTIL]
Zone Asia/Colombo 5:19:24 - LMT 1880 Zone Asia/Colombo 5:19:24 - LMT 1880
5:19:32 - MMT 1906 # Moratuwa Mean Time 5:19:32 - MMT 1906 # Moratuwa Mean Time
5:30 - +0530 1942 Jan 5 5:30 - %z 1942 Jan 5
5:30 0:30 +06 1942 Sep 5:30 0:30 %z 1942 Sep
5:30 1:00 +0630 1945 Oct 16 2:00 5:30 1:00 %z 1945 Oct 16 2:00
5:30 - +0530 1996 May 25 0:00 5:30 - %z 1996 May 25 0:00
6:30 - +0630 1996 Oct 26 0:30 6:30 - %z 1996 Oct 26 0:30
6:00 - +06 2006 Apr 15 0:30 6:00 - %z 2006 Apr 15 0:30
5:30 - +0530 5:30 - %z
# Syria # Syria
# Rule NAME FROM TO - IN ON AT SAVE LETTER/S # Rule NAME FROM TO - IN ON AT SAVE LETTER/S
@ -4041,56 +4069,56 @@ Rule Syria 2009 2022 - Oct lastFri 0:00 0 -
# Zone NAME STDOFF RULES FORMAT [UNTIL] # Zone NAME STDOFF RULES FORMAT [UNTIL]
Zone Asia/Damascus 2:25:12 - LMT 1920 # Dimashq Zone Asia/Damascus 2:25:12 - LMT 1920 # Dimashq
2:00 Syria EE%sT 2022 Oct 28 0:00 2:00 Syria EE%sT 2022 Oct 28 0:00
3:00 - +03 3:00 - %z
# Tajikistan # Tajikistan
# From Shanks & Pottenger. # From Shanks & Pottenger.
# Zone NAME STDOFF RULES FORMAT [UNTIL] # Zone NAME STDOFF RULES FORMAT [UNTIL]
Zone Asia/Dushanbe 4:35:12 - LMT 1924 May 2 Zone Asia/Dushanbe 4:35:12 - LMT 1924 May 2
5:00 - +05 1930 Jun 21 5:00 - %z 1930 Jun 21
6:00 RussiaAsia +06/+07 1991 Mar 31 2:00s 6:00 RussiaAsia %z 1991 Mar 31 2:00s
5:00 1:00 +06 1991 Sep 9 2:00s 5:00 1:00 %z 1991 Sep 9 2:00s
5:00 - +05 5:00 - %z
# Thailand # Thailand
# Zone NAME STDOFF RULES FORMAT [UNTIL] # Zone NAME STDOFF RULES FORMAT [UNTIL]
Zone Asia/Bangkok 6:42:04 - LMT 1880 Zone Asia/Bangkok 6:42:04 - LMT 1880
6:42:04 - BMT 1920 Apr # Bangkok Mean Time 6:42:04 - BMT 1920 Apr # Bangkok Mean Time
7:00 - +07 7:00 - %z
# Turkmenistan # Turkmenistan
# From Shanks & Pottenger. # From Shanks & Pottenger.
# Zone NAME STDOFF RULES FORMAT [UNTIL] # Zone NAME STDOFF RULES FORMAT [UNTIL]
Zone Asia/Ashgabat 3:53:32 - LMT 1924 May 2 # or Ashkhabad Zone Asia/Ashgabat 3:53:32 - LMT 1924 May 2 # or Ashkhabad
4:00 - +04 1930 Jun 21 4:00 - %z 1930 Jun 21
5:00 RussiaAsia +05/+06 1991 Mar 31 2:00 5:00 RussiaAsia %z 1991 Mar 31 2:00
4:00 RussiaAsia +04/+05 1992 Jan 19 2:00 4:00 RussiaAsia %z 1992 Jan 19 2:00
5:00 - +05 5:00 - %z
# United Arab Emirates # United Arab Emirates
# #
# The Crozet Is also observe Réunion time; see the 'antarctica' file. # The Crozet Is also observe Réunion time; see the 'antarctica' file.
# Zone NAME STDOFF RULES FORMAT [UNTIL] # Zone NAME STDOFF RULES FORMAT [UNTIL]
Zone Asia/Dubai 3:41:12 - LMT 1920 Zone Asia/Dubai 3:41:12 - LMT 1920
4:00 - +04 4:00 - %z
# Uzbekistan # Uzbekistan
# Byalokoz 1919 says Uzbekistan was 4:27:53. # Byalokoz 1919 says Uzbekistan was 4:27:53.
# Zone NAME STDOFF RULES FORMAT [UNTIL] # Zone NAME STDOFF RULES FORMAT [UNTIL]
Zone Asia/Samarkand 4:27:53 - LMT 1924 May 2 Zone Asia/Samarkand 4:27:53 - LMT 1924 May 2
4:00 - +04 1930 Jun 21 4:00 - %z 1930 Jun 21
5:00 - +05 1981 Apr 1 5:00 - %z 1981 Apr 1
5:00 1:00 +06 1981 Oct 1 5:00 1:00 %z 1981 Oct 1
6:00 - +06 1982 Apr 1 6:00 - %z 1982 Apr 1
5:00 RussiaAsia +05/+06 1992 5:00 RussiaAsia %z 1992
5:00 - +05 5:00 - %z
# Milne says Tashkent was 4:37:10.8. # Milne says Tashkent was 4:37:10.8.
#STDOFF 4:37:10.8 #STDOFF 4:37:10.8
Zone Asia/Tashkent 4:37:11 - LMT 1924 May 2 Zone Asia/Tashkent 4:37:11 - LMT 1924 May 2
5:00 - +05 1930 Jun 21 5:00 - %z 1930 Jun 21
6:00 RussiaAsia +06/+07 1991 Mar 31 2:00 6:00 RussiaAsia %z 1991 Mar 31 2:00
5:00 RussiaAsia +05/+06 1992 5:00 RussiaAsia %z 1992
5:00 - +05 5:00 - %z
# Vietnam (southern) # Vietnam (southern)
@ -4148,7 +4176,7 @@ Zone Asia/Tashkent 4:37:11 - LMT 1924 May 2
# Võ Nguyên Giáp, Việt Nam Dân Quốc Công Báo, No. 1 (1945-09-29), page 13 # Võ Nguyên Giáp, Việt Nam Dân Quốc Công Báo, No. 1 (1945-09-29), page 13
# http://baochi.nlv.gov.vn/baochi/cgi-bin/baochi?a=d&d=JwvzO19450929.2.5&dliv=none # http://baochi.nlv.gov.vn/baochi/cgi-bin/baochi?a=d&d=JwvzO19450929.2.5&dliv=none
# It says that on 1945-09-01 at 24:00, Vietnam moved back two hours, to +07. # It says that on 1945-09-01 at 24:00, Vietnam moved back two hours, to +07.
# It also mentions a 1945-03-29 decree (by a Japanese Goveror-General) # It also mentions a 1945-03-29 decree (by a Japanese Governor-General)
# to set the time zone to +09, but does not say whether that decree # to set the time zone to +09, but does not say whether that decree
# merely legalized an earlier change to +09. # merely legalized an earlier change to +09.
# #
@ -4169,14 +4197,14 @@ Zone Asia/Tashkent 4:37:11 - LMT 1924 May 2
#STDOFF 7:06:30.13 #STDOFF 7:06:30.13
Zone Asia/Ho_Chi_Minh 7:06:30 - LMT 1906 Jul 1 Zone Asia/Ho_Chi_Minh 7:06:30 - LMT 1906 Jul 1
7:06:30 - PLMT 1911 May 1 # Phù Liễn MT 7:06:30 - PLMT 1911 May 1 # Phù Liễn MT
7:00 - +07 1942 Dec 31 23:00 7:00 - %z 1942 Dec 31 23:00
8:00 - +08 1945 Mar 14 23:00 8:00 - %z 1945 Mar 14 23:00
9:00 - +09 1945 Sep 1 24:00 9:00 - %z 1945 Sep 1 24:00
7:00 - +07 1947 Apr 1 7:00 - %z 1947 Apr 1
8:00 - +08 1955 Jul 1 01:00 8:00 - %z 1955 Jul 1 01:00
7:00 - +07 1959 Dec 31 23:00 7:00 - %z 1959 Dec 31 23:00
8:00 - +08 1975 Jun 13 8:00 - %z 1975 Jun 13
7:00 - +07 7:00 - %z
# From Paul Eggert (2019-02-19): # From Paul Eggert (2019-02-19):
# #

View file

@ -1,4 +1,4 @@
# $OpenBSD: australasia,v 1.79 2024/02/05 17:07:23 millert Exp $ # $OpenBSD: australasia,v 1.80 2024/10/02 17:08:47 millert Exp $
# tzdb data for Australasia and environs, and for much of the Pacific # tzdb data for Australasia and environs, and for much of the Pacific
# This file is in the public domain, so clarified as of # This file is in the public domain, so clarified as of
@ -44,8 +44,8 @@ Zone Australia/Perth 7:43:24 - LMT 1895 Dec
8:00 Aus AW%sT 1943 Jul 8:00 Aus AW%sT 1943 Jul
8:00 AW AW%sT 8:00 AW AW%sT
Zone Australia/Eucla 8:35:28 - LMT 1895 Dec Zone Australia/Eucla 8:35:28 - LMT 1895 Dec
8:45 Aus +0845/+0945 1943 Jul 8:45 Aus %z 1943 Jul
8:45 AW +0845/+0945 8:45 AW %z
# Queensland # Queensland
# #
@ -210,8 +210,8 @@ Rule LH 2008 max - Apr Sun>=1 2:00 0 -
Rule LH 2008 max - Oct Sun>=1 2:00 0:30 - Rule LH 2008 max - Oct Sun>=1 2:00 0:30 -
Zone Australia/Lord_Howe 10:36:20 - LMT 1895 Feb Zone Australia/Lord_Howe 10:36:20 - LMT 1895 Feb
10:00 - AEST 1981 Mar 10:00 - AEST 1981 Mar
10:30 LH +1030/+1130 1985 Jul 10:30 LH %z 1985 Jul
10:30 LH +1030/+11 10:30 LH %z
# Australian miscellany # Australian miscellany
# #
@ -427,16 +427,16 @@ Rule Fiji 2019 only - Nov Sun>=8 2:00 1:00 -
Rule Fiji 2020 only - Dec 20 2:00 1:00 - Rule Fiji 2020 only - Dec 20 2:00 1:00 -
# Zone NAME STDOFF RULES FORMAT [UNTIL] # Zone NAME STDOFF RULES FORMAT [UNTIL]
Zone Pacific/Fiji 11:55:44 - LMT 1915 Oct 26 # Suva Zone Pacific/Fiji 11:55:44 - LMT 1915 Oct 26 # Suva
12:00 Fiji +12/+13 12:00 Fiji %z
# French Polynesia # French Polynesia
# Zone NAME STDOFF RULES FORMAT [UNTIL] # Zone NAME STDOFF RULES FORMAT [UNTIL]
Zone Pacific/Gambier -8:59:48 - LMT 1912 Oct 1 # Rikitea Zone Pacific/Gambier -8:59:48 - LMT 1912 Oct 1 # Rikitea
-9:00 - -09 -9:00 - %z
Zone Pacific/Marquesas -9:18:00 - LMT 1912 Oct 1 Zone Pacific/Marquesas -9:18:00 - LMT 1912 Oct 1
-9:30 - -0930 -9:30 - %z
Zone Pacific/Tahiti -9:58:16 - LMT 1912 Oct 1 # Papeete Zone Pacific/Tahiti -9:58:16 - LMT 1912 Oct 1 # Papeete
-10:00 - -10 -10:00 - %z
# Clipperton (near North America) is administered from French Polynesia; # Clipperton (near North America) is administered from French Polynesia;
# it is uninhabited. # it is uninhabited.
@ -478,7 +478,7 @@ Rule Guam 1977 only - Aug 28 2:00 0 S
Zone Pacific/Guam -14:21:00 - LMT 1844 Dec 31 Zone Pacific/Guam -14:21:00 - LMT 1844 Dec 31
9:39:00 - LMT 1901 # Agana 9:39:00 - LMT 1901 # Agana
10:00 - GST 1941 Dec 10 # Guam 10:00 - GST 1941 Dec 10 # Guam
9:00 - +09 1944 Jul 31 9:00 - %z 1944 Jul 31
10:00 Guam G%sT 2000 Dec 23 10:00 Guam G%sT 2000 Dec 23
10:00 - ChST # Chamorro Standard Time 10:00 - ChST # Chamorro Standard Time
@ -486,18 +486,18 @@ Zone Pacific/Guam -14:21:00 - LMT 1844 Dec 31
# Kiribati (Gilbert Is) # Kiribati (Gilbert Is)
# Zone NAME STDOFF RULES FORMAT [UNTIL] # Zone NAME STDOFF RULES FORMAT [UNTIL]
Zone Pacific/Tarawa 11:32:04 - LMT 1901 # Bairiki Zone Pacific/Tarawa 11:32:04 - LMT 1901 # Bairiki
12:00 - +12 12:00 - %z
# Kiribati (except Gilbert Is) # Kiribati (except Gilbert Is)
# Zone NAME STDOFF RULES FORMAT [UNTIL] # Zone NAME STDOFF RULES FORMAT [UNTIL]
Zone Pacific/Kanton 0 - -00 1937 Aug 31 Zone Pacific/Kanton 0 - -00 1937 Aug 31
-12:00 - -12 1979 Oct -12:00 - %z 1979 Oct
-11:00 - -11 1994 Dec 31 -11:00 - %z 1994 Dec 31
13:00 - +13 13:00 - %z
Zone Pacific/Kiritimati -10:29:20 - LMT 1901 Zone Pacific/Kiritimati -10:29:20 - LMT 1901
-10:40 - -1040 1979 Oct -10:40 - %z 1979 Oct
-10:00 - -10 1994 Dec 31 -10:00 - %z 1994 Dec 31
14:00 - +14 14:00 - %z
# N Mariana Is # N Mariana Is
# Zone NAME STDOFF RULES FORMAT [UNTIL] # Zone NAME STDOFF RULES FORMAT [UNTIL]
@ -520,12 +520,12 @@ Zone Pacific/Majuro 11:24:48 - LMT 1901
# Zone NAME STDOFF RULES FORMAT [UNTIL] # Zone NAME STDOFF RULES FORMAT [UNTIL]
Zone Pacific/Kwajalein 11:09:20 - LMT 1901 Zone Pacific/Kwajalein 11:09:20 - LMT 1901
11:00 - +11 1937 11:00 - %z 1937
10:00 - +10 1941 Apr 1 10:00 - %z 1941 Apr 1
9:00 - +09 1944 Feb 6 9:00 - %z 1944 Feb 6
11:00 - +11 1969 Oct 11:00 - %z 1969 Oct
-12:00 - -12 1993 Aug 20 24:00 -12:00 - %z 1993 Aug 20 24:00
12:00 - +12 12:00 - %z
# Micronesia # Micronesia
# Zone NAME STDOFF RULES FORMAT [UNTIL] # Zone NAME STDOFF RULES FORMAT [UNTIL]
@ -550,22 +550,22 @@ Zone Pacific/Pohnpei -13:27:08 - LMT 1844 Dec 31 # Kolonia
# Zone NAME STDOFF RULES FORMAT [UNTIL] # Zone NAME STDOFF RULES FORMAT [UNTIL]
Zone Pacific/Kosrae -13:08:04 - LMT 1844 Dec 31 Zone Pacific/Kosrae -13:08:04 - LMT 1844 Dec 31
10:51:56 - LMT 1901 10:51:56 - LMT 1901
11:00 - +11 1914 Oct 11:00 - %z 1914 Oct
9:00 - +09 1919 Feb 1 9:00 - %z 1919 Feb 1
11:00 - +11 1937 11:00 - %z 1937
10:00 - +10 1941 Apr 1 10:00 - %z 1941 Apr 1
9:00 - +09 1945 Aug 9:00 - %z 1945 Aug
11:00 - +11 1969 Oct 11:00 - %z 1969 Oct
12:00 - +12 1999 12:00 - %z 1999
11:00 - +11 11:00 - %z
# Nauru # Nauru
# Zone NAME STDOFF RULES FORMAT [UNTIL] # Zone NAME STDOFF RULES FORMAT [UNTIL]
Zone Pacific/Nauru 11:07:40 - LMT 1921 Jan 15 # Uaobe Zone Pacific/Nauru 11:07:40 - LMT 1921 Jan 15 # Uaobe
11:30 - +1130 1942 Aug 29 11:30 - %z 1942 Aug 29
9:00 - +09 1945 Sep 8 9:00 - %z 1945 Sep 8
11:30 - +1130 1979 Feb 10 2:00 11:30 - %z 1979 Feb 10 2:00
12:00 - +12 12:00 - %z
# New Caledonia # New Caledonia
# Rule NAME FROM TO - IN ON AT SAVE LETTER/S # Rule NAME FROM TO - IN ON AT SAVE LETTER/S
@ -576,7 +576,7 @@ Rule NC 1996 only - Dec 1 2:00s 1:00 -
Rule NC 1997 only - Mar 2 2:00s 0 - Rule NC 1997 only - Mar 2 2:00s 0 -
# Zone NAME STDOFF RULES FORMAT [UNTIL] # Zone NAME STDOFF RULES FORMAT [UNTIL]
Zone Pacific/Noumea 11:05:48 - LMT 1912 Jan 13 # Nouméa Zone Pacific/Noumea 11:05:48 - LMT 1912 Jan 13 # Nouméa
11:00 NC +11/+12 11:00 NC %z
############################################################################### ###############################################################################
@ -624,8 +624,8 @@ Zone Antarctica/McMurdo 0 - -00 1956
12:00 NZ NZ%sT 12:00 NZ NZ%sT
Zone Pacific/Chatham 12:13:48 - LMT 1868 Nov 2 Zone Pacific/Chatham 12:13:48 - LMT 1868 Nov 2
12:15 - +1215 1946 Jan 1 12:15 - %z 1946 Jan 1
12:45 Chatham +1245/+1345 12:45 Chatham %z
# Auckland Is # Auckland Is
# uninhabited; Māori and Moriori, colonial settlers, pastoralists, sealers, # uninhabited; Māori and Moriori, colonial settlers, pastoralists, sealers,
@ -678,8 +678,8 @@ Rule Cook 1979 1990 - Oct lastSun 0:00 0:30 -
# Zone NAME STDOFF RULES FORMAT [UNTIL] # Zone NAME STDOFF RULES FORMAT [UNTIL]
Zone Pacific/Rarotonga 13:20:56 - LMT 1899 Dec 26 # Avarua Zone Pacific/Rarotonga 13:20:56 - LMT 1899 Dec 26 # Avarua
-10:39:04 - LMT 1952 Oct 16 -10:39:04 - LMT 1952 Oct 16
-10:30 - -1030 1978 Nov 12 -10:30 - %z 1978 Nov 12
-10:00 Cook -10/-0930 -10:00 Cook %z
############################################################################### ###############################################################################
@ -696,30 +696,30 @@ Zone Pacific/Rarotonga 13:20:56 - LMT 1899 Dec 26 # Avarua
# Zone NAME STDOFF RULES FORMAT [UNTIL] # Zone NAME STDOFF RULES FORMAT [UNTIL]
Zone Pacific/Niue -11:19:40 - LMT 1952 Oct 16 # Alofi Zone Pacific/Niue -11:19:40 - LMT 1952 Oct 16 # Alofi
-11:20 - -1120 1964 Jul -11:20 - %z 1964 Jul
-11:00 - -11 -11:00 - %z
# Norfolk # Norfolk
# Zone NAME STDOFF RULES FORMAT [UNTIL] # Zone NAME STDOFF RULES FORMAT [UNTIL]
Zone Pacific/Norfolk 11:11:52 - LMT 1901 # Kingston Zone Pacific/Norfolk 11:11:52 - LMT 1901 # Kingston
11:12 - +1112 1951 11:12 - %z 1951
11:30 - +1130 1974 Oct 27 02:00s 11:30 - %z 1974 Oct 27 02:00s
11:30 1:00 +1230 1975 Mar 2 02:00s 11:30 1:00 %z 1975 Mar 2 02:00s
11:30 - +1130 2015 Oct 4 02:00s 11:30 - %z 2015 Oct 4 02:00s
11:00 - +11 2019 Jul 11:00 - %z 2019 Jul
11:00 AN +11/+12 11:00 AN %z
# Palau (Belau) # Palau (Belau)
# Zone NAME STDOFF RULES FORMAT [UNTIL] # Zone NAME STDOFF RULES FORMAT [UNTIL]
Zone Pacific/Palau -15:02:04 - LMT 1844 Dec 31 # Koror Zone Pacific/Palau -15:02:04 - LMT 1844 Dec 31 # Koror
8:57:56 - LMT 1901 8:57:56 - LMT 1901
9:00 - +09 9:00 - %z
# Papua New Guinea # Papua New Guinea
# Zone NAME STDOFF RULES FORMAT [UNTIL] # Zone NAME STDOFF RULES FORMAT [UNTIL]
Zone Pacific/Port_Moresby 9:48:40 - LMT 1880 Zone Pacific/Port_Moresby 9:48:40 - LMT 1880
9:48:32 - PMMT 1895 # Port Moresby Mean Time 9:48:32 - PMMT 1895 # Port Moresby Mean Time
10:00 - +10 10:00 - %z
# #
# From Paul Eggert (2014-10-13): # From Paul Eggert (2014-10-13):
# Base the Bougainville entry on the Arawa-Kieta region, which appears to have # Base the Bougainville entry on the Arawa-Kieta region, which appears to have
@ -740,16 +740,16 @@ Zone Pacific/Port_Moresby 9:48:40 - LMT 1880
# #
Zone Pacific/Bougainville 10:22:16 - LMT 1880 Zone Pacific/Bougainville 10:22:16 - LMT 1880
9:48:32 - PMMT 1895 9:48:32 - PMMT 1895
10:00 - +10 1942 Jul 10:00 - %z 1942 Jul
9:00 - +09 1945 Aug 21 9:00 - %z 1945 Aug 21
10:00 - +10 2014 Dec 28 2:00 10:00 - %z 2014 Dec 28 2:00
11:00 - +11 11:00 - %z
# Pitcairn # Pitcairn
# Zone NAME STDOFF RULES FORMAT [UNTIL] # Zone NAME STDOFF RULES FORMAT [UNTIL]
Zone Pacific/Pitcairn -8:40:20 - LMT 1901 # Adamstown Zone Pacific/Pitcairn -8:40:20 - LMT 1901 # Adamstown
-8:30 - -0830 1998 Apr 27 0:00 -8:30 - %z 1998 Apr 27 0:00
-8:00 - -08 -8:00 - %z
# American Samoa # American Samoa
Zone Pacific/Pago_Pago 12:37:12 - LMT 1892 Jul 5 Zone Pacific/Pago_Pago 12:37:12 - LMT 1892 Jul 5
@ -837,15 +837,15 @@ Rule WS 2012 2020 - Sep lastSun 3:00 1 -
# Zone NAME STDOFF RULES FORMAT [UNTIL] # Zone NAME STDOFF RULES FORMAT [UNTIL]
Zone Pacific/Apia 12:33:04 - LMT 1892 Jul 5 Zone Pacific/Apia 12:33:04 - LMT 1892 Jul 5
-11:26:56 - LMT 1911 -11:26:56 - LMT 1911
-11:30 - -1130 1950 -11:30 - %z 1950
-11:00 WS -11/-10 2011 Dec 29 24:00 -11:00 WS %z 2011 Dec 29 24:00
13:00 WS +13/+14 13:00 WS %z
# Solomon Is # Solomon Is
# excludes Bougainville, for which see Papua New Guinea # excludes Bougainville, for which see Papua New Guinea
# Zone NAME STDOFF RULES FORMAT [UNTIL] # Zone NAME STDOFF RULES FORMAT [UNTIL]
Zone Pacific/Guadalcanal 10:39:48 - LMT 1912 Oct 1 # Honiara Zone Pacific/Guadalcanal 10:39:48 - LMT 1912 Oct 1 # Honiara
11:00 - +11 11:00 - %z
# Tokelau # Tokelau
# #
@ -868,8 +868,8 @@ Zone Pacific/Guadalcanal 10:39:48 - LMT 1912 Oct 1 # Honiara
# Zone NAME STDOFF RULES FORMAT [UNTIL] # Zone NAME STDOFF RULES FORMAT [UNTIL]
Zone Pacific/Fakaofo -11:24:56 - LMT 1901 Zone Pacific/Fakaofo -11:24:56 - LMT 1901
-11:00 - -11 2011 Dec 30 -11:00 - %z 2011 Dec 30
13:00 - +13 13:00 - %z
# Tonga # Tonga
# Rule NAME FROM TO - IN ON AT SAVE LETTER/S # Rule NAME FROM TO - IN ON AT SAVE LETTER/S
@ -881,9 +881,9 @@ Rule Tonga 2016 only - Nov Sun>=1 2:00 1:00 -
Rule Tonga 2017 only - Jan Sun>=15 3:00 0 - Rule Tonga 2017 only - Jan Sun>=15 3:00 0 -
# Zone NAME STDOFF RULES FORMAT [UNTIL] # Zone NAME STDOFF RULES FORMAT [UNTIL]
Zone Pacific/Tongatapu 12:19:12 - LMT 1945 Sep 10 Zone Pacific/Tongatapu 12:19:12 - LMT 1945 Sep 10
12:20 - +1220 1961 12:20 - %z 1961
13:00 - +13 1999 13:00 - %z 1999
13:00 Tonga +13/+14 13:00 Tonga %z
# Tuvalu # Tuvalu
# Zone NAME STDOFF RULES FORMAT [UNTIL] # Zone NAME STDOFF RULES FORMAT [UNTIL]
@ -987,7 +987,7 @@ Rule Vanuatu 1992 1993 - Jan Sat>=22 24:00 0 -
Rule Vanuatu 1992 only - Oct Sat>=22 24:00 1:00 - Rule Vanuatu 1992 only - Oct Sat>=22 24:00 1:00 -
# Zone NAME STDOFF RULES FORMAT [UNTIL] # Zone NAME STDOFF RULES FORMAT [UNTIL]
Zone Pacific/Efate 11:13:16 - LMT 1912 Jan 13 # Vila Zone Pacific/Efate 11:13:16 - LMT 1912 Jan 13 # Vila
11:00 Vanuatu +11/+12 11:00 Vanuatu %z
# Wallis and Futuna # Wallis and Futuna
# Zone NAME STDOFF RULES FORMAT [UNTIL] # Zone NAME STDOFF RULES FORMAT [UNTIL]

View file

@ -1,10 +1,11 @@
# $OpenBSD: backward,v 1.45 2023/03/23 16:12:10 millert Exp $ # $OpenBSD: backward,v 1.46 2024/10/02 17:08:47 millert Exp $
# tzdb links for backward compatibility # Links and zones for backward compatibility
# This file is in the public domain, so clarified as of # This file is in the public domain, so clarified as of
# 2009-05-17 by Arthur David Olson. # 2009-05-17 by Arthur David Olson.
# This file provides links from old or merged timezone names to current ones. # This file provides links from old or merged timezone names to current ones.
# It also provides a few zone entries for old naming conventions.
# Many names changed in 1993 and in 1995, and many merged names moved here # Many names changed in 1993 and in 1995, and many merged names moved here
# in the period from 2013 through 2022. Several of these names are # in the period from 2013 through 2022. Several of these names are
# also present in the file 'backzone', which has data important only # also present in the file 'backzone', which has data important only
@ -45,6 +46,8 @@ Link America/Rio_Branco Brazil/Acre #= America/Porto_Acre
Link America/Noronha Brazil/DeNoronha Link America/Noronha Brazil/DeNoronha
Link America/Sao_Paulo Brazil/East Link America/Sao_Paulo Brazil/East
Link America/Manaus Brazil/West Link America/Manaus Brazil/West
Link Europe/Brussels CET
Link America/Chicago CST6CDT
Link America/Halifax Canada/Atlantic Link America/Halifax Canada/Atlantic
Link America/Winnipeg Canada/Central Link America/Winnipeg Canada/Central
# This line is commented out, as the name exceeded the 14-character limit # This line is commented out, as the name exceeded the 14-character limit
@ -59,6 +62,9 @@ Link America/Whitehorse Canada/Yukon
Link America/Santiago Chile/Continental Link America/Santiago Chile/Continental
Link Pacific/Easter Chile/EasterIsland Link Pacific/Easter Chile/EasterIsland
Link America/Havana Cuba Link America/Havana Cuba
Link Europe/Athens EET
Link America/Panama EST
Link America/New_York EST5EDT
Link Africa/Cairo Egypt Link Africa/Cairo Egypt
Link Europe/Dublin Eire Link Europe/Dublin Eire
# Vanguard section, for most .zi parsers. # Vanguard section, for most .zi parsers.
@ -97,6 +103,9 @@ Link America/Jamaica Jamaica
Link Asia/Tokyo Japan Link Asia/Tokyo Japan
Link Pacific/Kwajalein Kwajalein Link Pacific/Kwajalein Kwajalein
Link Africa/Tripoli Libya Link Africa/Tripoli Libya
Link Europe/Brussels MET
Link America/Phoenix MST
Link America/Denver MST7MDT
Link America/Tijuana Mexico/BajaNorte Link America/Tijuana Mexico/BajaNorte
Link America/Mazatlan Mexico/BajaSur Link America/Mazatlan Mexico/BajaSur
Link America/Mexico_City Mexico/General Link America/Mexico_City Mexico/General
@ -170,6 +179,7 @@ Link America/Denver America/Shiprock
Link America/Toronto America/Thunder_Bay Link America/Toronto America/Thunder_Bay
Link America/Edmonton America/Yellowknife Link America/Edmonton America/Yellowknife
Link Antarctica/McMurdo Antarctica/South_Pole Link Antarctica/McMurdo Antarctica/South_Pole
Link Asia/Ulaanbaatar Asia/Choibalsan
Link Asia/Shanghai Asia/Chongqing Link Asia/Shanghai Asia/Chongqing
Link Asia/Shanghai Asia/Harbin Link Asia/Shanghai Asia/Harbin
Link Asia/Urumqi Asia/Kashgar Link Asia/Urumqi Asia/Kashgar
@ -184,6 +194,7 @@ Link Europe/Kyiv Europe/Zaporozhye
Link Pacific/Kanton Pacific/Enderbury Link Pacific/Kanton Pacific/Enderbury
Link Pacific/Honolulu Pacific/Johnston Link Pacific/Honolulu Pacific/Johnston
Link Pacific/Chuuk Pacific/Yap Link Pacific/Chuuk Pacific/Yap
Link Europe/Lisbon WET
# Alternate names for the same location # Alternate names for the same location
@ -209,5 +220,7 @@ Link Europe/Kyiv Europe/Kiev
# Classically, Cyprus is in Asia; e.g. see Herodotus, Histories, I.72. # Classically, Cyprus is in Asia; e.g. see Herodotus, Histories, I.72.
# However, for various reasons many users expect to find it under Europe. # However, for various reasons many users expect to find it under Europe.
Link Asia/Nicosia Europe/Nicosia Link Asia/Nicosia Europe/Nicosia
Link Pacific/Honolulu HST
Link America/Los_Angeles PST8PDT
Link Pacific/Pohnpei Pacific/Ponape Link Pacific/Pohnpei Pacific/Ponape
Link Pacific/Chuuk Pacific/Truk Link Pacific/Chuuk Pacific/Truk

View file

@ -1,4 +1,4 @@
# $OpenBSD: etcetera,v 1.22 2024/02/05 17:07:23 millert Exp $ # $OpenBSD: etcetera,v 1.23 2024/10/02 17:08:47 millert Exp $
# tzdb data for ships at sea and other miscellany # tzdb data for ships at sea and other miscellany
# This file is in the public domain, so clarified as of # This file is in the public domain, so clarified as of
@ -6,7 +6,7 @@
# These entries are for uses not otherwise covered by the tz database. # These entries are for uses not otherwise covered by the tz database.
# Their main practical use is for platforms like Android that lack # Their main practical use is for platforms like Android that lack
# support for POSIX.1-2017-style TZ strings. On such platforms these entries # support for POSIX proleptic TZ strings. On such platforms these entries
# can be useful if the timezone database is wrong or if a ship or # can be useful if the timezone database is wrong or if a ship or
# aircraft at sea is not in a timezone. # aircraft at sea is not in a timezone.
@ -52,29 +52,29 @@ Link Etc/GMT GMT
# so we moved the names into the Etc subdirectory. # so we moved the names into the Etc subdirectory.
# Also, the time zone abbreviations are now compatible with %z. # Also, the time zone abbreviations are now compatible with %z.
Zone Etc/GMT-14 14 - +14 Zone Etc/GMT-14 14 - %z
Zone Etc/GMT-13 13 - +13 Zone Etc/GMT-13 13 - %z
Zone Etc/GMT-12 12 - +12 Zone Etc/GMT-12 12 - %z
Zone Etc/GMT-11 11 - +11 Zone Etc/GMT-11 11 - %z
Zone Etc/GMT-10 10 - +10 Zone Etc/GMT-10 10 - %z
Zone Etc/GMT-9 9 - +09 Zone Etc/GMT-9 9 - %z
Zone Etc/GMT-8 8 - +08 Zone Etc/GMT-8 8 - %z
Zone Etc/GMT-7 7 - +07 Zone Etc/GMT-7 7 - %z
Zone Etc/GMT-6 6 - +06 Zone Etc/GMT-6 6 - %z
Zone Etc/GMT-5 5 - +05 Zone Etc/GMT-5 5 - %z
Zone Etc/GMT-4 4 - +04 Zone Etc/GMT-4 4 - %z
Zone Etc/GMT-3 3 - +03 Zone Etc/GMT-3 3 - %z
Zone Etc/GMT-2 2 - +02 Zone Etc/GMT-2 2 - %z
Zone Etc/GMT-1 1 - +01 Zone Etc/GMT-1 1 - %z
Zone Etc/GMT+1 -1 - -01 Zone Etc/GMT+1 -1 - %z
Zone Etc/GMT+2 -2 - -02 Zone Etc/GMT+2 -2 - %z
Zone Etc/GMT+3 -3 - -03 Zone Etc/GMT+3 -3 - %z
Zone Etc/GMT+4 -4 - -04 Zone Etc/GMT+4 -4 - %z
Zone Etc/GMT+5 -5 - -05 Zone Etc/GMT+5 -5 - %z
Zone Etc/GMT+6 -6 - -06 Zone Etc/GMT+6 -6 - %z
Zone Etc/GMT+7 -7 - -07 Zone Etc/GMT+7 -7 - %z
Zone Etc/GMT+8 -8 - -08 Zone Etc/GMT+8 -8 - %z
Zone Etc/GMT+9 -9 - -09 Zone Etc/GMT+9 -9 - %z
Zone Etc/GMT+10 -10 - -10 Zone Etc/GMT+10 -10 - %z
Zone Etc/GMT+11 -11 - -11 Zone Etc/GMT+11 -11 - %z
Zone Etc/GMT+12 -12 - -12 Zone Etc/GMT+12 -12 - %z

View file

@ -1,4 +1,4 @@
# $OpenBSD: europe,v 1.92 2024/02/05 17:07:23 millert Exp $ # $OpenBSD: europe,v 1.93 2024/10/02 17:08:47 millert Exp $
# tzdb data for Europe and environs # tzdb data for Europe and environs
# This file is in the public domain, so clarified as of # This file is in the public domain, so clarified as of
@ -754,14 +754,6 @@ Rule Russia 1996 2010 - Oct lastSun 2:00s 0 -
# Take "abolishing daylight saving time" to mean that time is now considered # Take "abolishing daylight saving time" to mean that time is now considered
# to be standard. # to be standard.
# These are for backward compatibility with older versions.
# Zone NAME STDOFF RULES FORMAT [UNTIL]
Zone WET 0:00 EU WE%sT
Zone CET 1:00 C-Eur CE%sT
Zone MET 1:00 C-Eur ME%sT
Zone EET 2:00 EU EE%sT
# Previous editions of this database used abbreviations like MET DST # Previous editions of this database used abbreviations like MET DST
# for Central European Summer Time, but this didn't agree with common usage. # for Central European Summer Time, but this didn't agree with common usage.
@ -895,7 +887,7 @@ Zone Europe/Minsk 1:50:16 - LMT 1880
3:00 Russia MSK/MSD 1990 3:00 Russia MSK/MSD 1990
3:00 - MSK 1991 Mar 31 2:00s 3:00 - MSK 1991 Mar 31 2:00s
2:00 Russia EE%sT 2011 Mar 27 2:00s 2:00 Russia EE%sT 2011 Mar 27 2:00s
3:00 - +03 3:00 - %z
# Belgium # Belgium
# #
@ -1238,22 +1230,22 @@ Rule Thule 2007 max - Nov Sun>=1 2:00 0 S
# #
# Zone NAME STDOFF RULES FORMAT [UNTIL] # Zone NAME STDOFF RULES FORMAT [UNTIL]
Zone America/Danmarkshavn -1:14:40 - LMT 1916 Jul 28 Zone America/Danmarkshavn -1:14:40 - LMT 1916 Jul 28
-3:00 - -03 1980 Apr 6 2:00 -3:00 - %z 1980 Apr 6 2:00
-3:00 EU -03/-02 1996 -3:00 EU %z 1996
0:00 - GMT 0:00 - GMT
# #
# Use the old name Scoresbysund, as the current name Ittoqqortoormiit # Use the old name Scoresbysund, as the current name Ittoqqortoormiit
# exceeds tzdb's 14-letter limit and has no common English abbreviation. # exceeds tzdb's 14-letter limit and has no common English abbreviation.
Zone America/Scoresbysund -1:27:52 - LMT 1916 Jul 28 # Ittoqqortoormiit Zone America/Scoresbysund -1:27:52 - LMT 1916 Jul 28 # Ittoqqortoormiit
-2:00 - -02 1980 Apr 6 2:00 -2:00 - %z 1980 Apr 6 2:00
-2:00 C-Eur -02/-01 1981 Mar 29 -2:00 C-Eur %z 1981 Mar 29
-1:00 EU -01/+00 2024 Mar 31 -1:00 EU %z 2024 Mar 31
-2:00 EU -02/-01 -2:00 EU %z
Zone America/Nuuk -3:26:56 - LMT 1916 Jul 28 # Godthåb Zone America/Nuuk -3:26:56 - LMT 1916 Jul 28 # Godthåb
-3:00 - -03 1980 Apr 6 2:00 -3:00 - %z 1980 Apr 6 2:00
-3:00 EU -03/-02 2023 Mar 26 1:00u -3:00 EU %z 2023 Mar 26 1:00u
-2:00 - -02 2023 Oct 29 1:00u -2:00 - %z 2023 Oct 29 1:00u
-2:00 EU -02/-01 -2:00 EU %z
Zone America/Thule -4:35:08 - LMT 1916 Jul 28 # Pituffik Zone America/Thule -4:35:08 - LMT 1916 Jul 28 # Pituffik
-4:00 Thule A%sT -4:00 Thule A%sT
@ -2266,10 +2258,39 @@ Zone Europe/Warsaw 1:24:00 - LMT 1880
# Portugal # Portugal
# From Paul Eggert (2014-08-11), after a heads-up from Stephen Colebourne: # From Tim Parenti (2024-07-01), per Alois Treindl (2021-02-07) and Michael
# According to a Portuguese decree (1911-05-26) # Deckers (2021-02-10):
# https://dre.pt/application/dir/pdf1sdip/1911/05/12500/23132313.pdf # http://oal.ul.pt/documentos/2018/01/hl1911a2018.pdf/
# Lisbon was at -0:36:44.68, but switched to GMT on 1912-01-01 at 00:00. # The Astronomical Observatory of Lisbon has published a list detailing the
# historical transitions in legal time within continental Portugal. It
# directly references many decrees and ordinances which are, in turn,
# referenced below. They can be viewed in the public archives of the Diário da
# República (until 1976-04-09 known as the Diário do Govêrno) at
# https://dre.pt/ (in Portuguese).
#
# Most of the Rules below have been updated simply to match the Observatory's
# listing for continental (mainland) Portugal. Although there are over 50
# referenced decrees and ordinances, only the handful with comments below have
# been verified against the text, typically to provide additional confidence
# wherever dates provided by Whitman and Shanks & Pottenger had disagreed.
# See further below for the Azores and Madeira.
# From Tim Parenti (2024-07-01), per Paul Eggert (2014-08-11), after a
# heads-up from Stephen Colebourne:
# According to a 1911-05-24 Portuguese decree, Lisbon was at -0:36:44.68, but
# switched to GMT on 1912-01-01 at 00:00.
# https://dre.pt/dr/detalhe/decreto/593090
# https://dre.pt/application/conteudo/593090
# The decree made legal time throughout Portugal and her possessions
# "subordinate to the Greenwich meridian, according to the principle adopted at
# the Washington Convention in 1884" and eliminated the "difference of five
# minutes between the internal and external clocks of railway stations".
#
# The decree was gazetted in the 1911-05-30 issue of Diário do Govêrno, and is
# considered to be dated 1911-05-24 by that issue's summary; however, the text
# of the decree itself is dated 1911-05-26. The Diário da República website
# notes the discrepancy, but later laws and the Observatory all seem to refer
# to this decree by the 1911-05-24 date.
# #
# From Michael Deckers (2018-02-15): # From Michael Deckers (2018-02-15):
# article 5 [of the 1911 decree; Deckers's translation] ...: # article 5 [of the 1911 decree; Deckers's translation] ...:
@ -2277,37 +2298,62 @@ Zone Europe/Warsaw 1:24:00 - LMT 1880
# according to the 2nd article, the civil day January 1, 1912 begins, # according to the 2nd article, the civil day January 1, 1912 begins,
# all clocks therefore having to be advanced or set back correspondingly ... # all clocks therefore having to be advanced or set back correspondingly ...
# From Rui Pedro Salgueiro (1992-11-12):
# Portugal has recently (September, 27) changed timezone
# (from WET to MET or CET) to harmonize with EEC.
#
# Martin Bruckmann (1996-02-29) reports via Peter Ilieve
# that Portugal is reverting to 0:00 by not moving its clocks this spring.
# The new Prime Minister was fed up with getting up in the dark in the winter.
#
# From Paul Eggert (1996-11-12):
# IATA SSIM (1991-09) reports several 1991-09 and 1992-09 transitions
# at 02:00u, not 01:00u. Assume that these are typos.
# IATA SSIM (1991/1992) reports that the Azores were at -1:00.
# IATA SSIM (1993-02) says +0:00; later issues (through 1996-09) say -1:00.
# Guess that the Azores changed to EU rules in 1992 (since that's when Portugal
# harmonized with EU rules), and that they stayed +0:00 that winter.
#
# Rule NAME FROM TO - IN ON AT SAVE LETTER/S # Rule NAME FROM TO - IN ON AT SAVE LETTER/S
# DSH writes that despite Decree 1,469 (1915), the change to the clocks was not # From Tim Parenti (2024-07-01), per Paul Eggert (1999-01-30):
# done every year, depending on what Spain did, because of railroad schedules. # DSH writes in their history that Decreto 1469 of 1915-03-30 established
# Go with Shanks & Pottenger. # summer time and that, "despite" this, the change to the clocks was not done
# every year, depending on what Spain did, because of railroad schedules.
# In fact, that decree had nothing to do with DST; rather, it regulated the
# sending of time signals. But we do see linkage to Spain in the 1920s below.
# https://dre.pt/dr/detalhe/decreto/1469-1915-285721
# https://dre.pt/application/conteudo/285721
#
# According to the Observatory, standard time was first advanced by Decreto
# 2433 of 1916-06-09 and restored by Decreto 2712 of 1916-10-28. While Whitman
# gives 1916-10-31 for the latter transition, Shanks & Pottenger agrees more
# closely with the decree, which stated that its provision "will start sixty
# minutes after the end of 31 October, according to the current time," i.e.,
# 01:00 on 1 November.
# https://dre.pt/dr/detalhe/decreto/2433-1916-267192
# https://dre.pt/application/conteudo/267192
# https://dre.pt/dr/detalhe/decreto/2712-1916-590937
# https://dre.pt/application/conteudo/590937
Rule Port 1916 only - Jun 17 23:00 1:00 S Rule Port 1916 only - Jun 17 23:00 1:00 S
# Whitman gives 1916 Oct 31; go with Shanks & Pottenger.
Rule Port 1916 only - Nov 1 1:00 0 - Rule Port 1916 only - Nov 1 1:00 0 -
Rule Port 1917 only - Feb 28 23:00s 1:00 S # From Tim Parenti (2024-07-01):
Rule Port 1917 1921 - Oct 14 23:00s 0 - # Article 7 of Decreto 2922 of 1916-12-30 stated that "the legal time will be
Rule Port 1918 only - Mar 1 23:00s 1:00 S # advanced by sixty minutes from 1 March to 31 October." Per Article 15, this
Rule Port 1919 only - Feb 28 23:00s 1:00 S # came into force from 1917-01-01. Just before the first fall back, Decreto
Rule Port 1920 only - Feb 29 23:00s 1:00 S # 3446 of 1917-10-11 changed the annual end date to 14 October.
Rule Port 1921 only - Feb 28 23:00s 1:00 S # https://dre.pt/dr/detalhe/decreto/2922-1916-261894
# https://dre.pt/application/conteudo/261894
# https://dre.pt/dr/detalhe/decreto/3446-1917-495161
# https://dre.pt/application/conteudo/495161
# This annual change was revoked by Decreto 8038 of 1922-02-18.
# https://dre.pt/dr/detalhe/decreto/8038-1922-569751
# https://dre.pt/application/conteudo/569751
Rule Port 1917 1921 - Mar 1 0:00 1:00 S
Rule Port 1917 1921 - Oct 14 24:00 0 -
# From Tim Parenti (2024-07-01):
# Decreto 9592 of 1924-04-14 noted that "France maintains the advance of legal
# time in the summer and Spain has now adopted it for the first time" and
# considered "that the absence of similar measures would cause serious
# difficulties for international rail connections with consequent repercussions
# on domestic service hours..." along with "inconvenient analogues...for postal
# and telegraph services." Summer time would be in effect from 17 April to 4
# October, with the spring change explicitly specified by bringing clocks
# forward from 16 April 23:00.
# https://dre.pt/dr/detalhe/decreto/9592-1924-652133
# https://dre.pt/application/conteudo/652133
#
# Decreto 10700, issued 1925-04-16, noted that Spain had not continued summer
# time, declared that "the current legal hour prior to 17 April remains
# unchanged from that day forward", and revoked legislation to the contrary,
# just a day before summer time would have otherwise resumed.
# https://dre.pt/dr/detalhe/decreto/10700-1925-437826
# https://dre.pt/application/conteudo/437826
Rule Port 1924 only - Apr 16 23:00s 1:00 S Rule Port 1924 only - Apr 16 23:00s 1:00 S
Rule Port 1924 only - Oct 14 23:00s 0 - Rule Port 1924 only - Oct 4 23:00s 0 -
Rule Port 1926 only - Apr 17 23:00s 1:00 S Rule Port 1926 only - Apr 17 23:00s 1:00 S
Rule Port 1926 1929 - Oct Sat>=1 23:00s 0 - Rule Port 1926 1929 - Oct Sat>=1 23:00s 0 -
Rule Port 1927 only - Apr 9 23:00s 1:00 S Rule Port 1927 only - Apr 9 23:00s 1:00 S
@ -2319,6 +2365,8 @@ Rule Port 1931 1932 - Oct Sat>=1 23:00s 0 -
Rule Port 1932 only - Apr 2 23:00s 1:00 S Rule Port 1932 only - Apr 2 23:00s 1:00 S
Rule Port 1934 only - Apr 7 23:00s 1:00 S Rule Port 1934 only - Apr 7 23:00s 1:00 S
# Whitman gives 1934 Oct 5; go with Shanks & Pottenger. # Whitman gives 1934 Oct 5; go with Shanks & Pottenger.
# Note: The 1935 law specified 10-06 00:00, not 10-05 24:00, but the following
# is equivalent and more succinct.
Rule Port 1934 1938 - Oct Sat>=1 23:00s 0 - Rule Port 1934 1938 - Oct Sat>=1 23:00s 0 -
# Shanks & Pottenger give 1935 Apr 30; go with Whitman. # Shanks & Pottenger give 1935 Apr 30; go with Whitman.
Rule Port 1935 only - Mar 30 23:00s 1:00 S Rule Port 1935 only - Mar 30 23:00s 1:00 S
@ -2329,10 +2377,19 @@ Rule Port 1938 only - Mar 26 23:00s 1:00 S
Rule Port 1939 only - Apr 15 23:00s 1:00 S Rule Port 1939 only - Apr 15 23:00s 1:00 S
# Whitman gives 1939 Oct 7; go with Shanks & Pottenger. # Whitman gives 1939 Oct 7; go with Shanks & Pottenger.
Rule Port 1939 only - Nov 18 23:00s 0 - Rule Port 1939 only - Nov 18 23:00s 0 -
# From Tim Parenti (2024-07-01):
# Portaria 9465 of 1940-02-17 advanced clocks from Saturday 1940-02-24 23:00.
# The clocks were restored by Portaria 9658, issued Monday 1940-10-07,
# effective from 24:00 that very night, which agrees with Shanks & Pottenger;
# Whitman gives Saturday 1940-10-05 instead.
# https://dre.pt/dr/detalhe/portaria/9465-1940-189096
# https://dre.pt/application/conteudo/189096
# https://dre.pt/dr/detalhe/portaria/9658-1940-196729
# https://dre.pt/application/conteudo/196729
Rule Port 1940 only - Feb 24 23:00s 1:00 S Rule Port 1940 only - Feb 24 23:00s 1:00 S
# Shanks & Pottenger give 1940 Oct 7; go with Whitman. Rule Port 1940 only - Oct 7 23:00s 0 -
Rule Port 1940 1941 - Oct 5 23:00s 0 -
Rule Port 1941 only - Apr 5 23:00s 1:00 S Rule Port 1941 only - Apr 5 23:00s 1:00 S
Rule Port 1941 only - Oct 5 23:00s 0 -
Rule Port 1942 1945 - Mar Sat>=8 23:00s 1:00 S Rule Port 1942 1945 - Mar Sat>=8 23:00s 1:00 S
Rule Port 1942 only - Apr 25 22:00s 2:00 M # Midsummer Rule Port 1942 only - Apr 25 22:00s 2:00 M # Midsummer
Rule Port 1942 only - Aug 15 22:00s 1:00 S Rule Port 1942 only - Aug 15 22:00s 1:00 S
@ -2342,66 +2399,195 @@ Rule Port 1943 1945 - Aug Sat>=25 22:00s 1:00 S
Rule Port 1944 1945 - Apr Sat>=21 22:00s 2:00 M Rule Port 1944 1945 - Apr Sat>=21 22:00s 2:00 M
Rule Port 1946 only - Apr Sat>=1 23:00s 1:00 S Rule Port 1946 only - Apr Sat>=1 23:00s 1:00 S
Rule Port 1946 only - Oct Sat>=1 23:00s 0 - Rule Port 1946 only - Oct Sat>=1 23:00s 0 -
# Whitman says DST was not observed in 1950; go with Shanks & Pottenger. # From Tim Parenti (2024-07-01), per Alois Treindl (2021-02-07):
# Whitman gives Oct lastSun for 1952 on; go with Shanks & Pottenger. # The Astronomical Observatory of Lisbon cites Portaria 11767 of 1947-03-28 for
Rule Port 1947 1965 - Apr Sun>=1 2:00s 1:00 S # 1947 and Portaria 12286 of 1948-02-19 for 1948.
# https://dre.pt/dr/detalhe/portaria/11767-1947-414787
# https://dre.pt/application/conteudo/414787
# https://dre.pt/dr/detalhe/portaria/12286-1948-152953
# https://dre.pt/application/conteudo/152953
#
# Although the latter ordinance explicitly had the 1948-10-03 transition
# scheduled for 02:00 rather than 03:00 as had been used in 1947, Decreto-Lei
# 37048 of 1948-09-07 recognized "that it is advisable to definitely set...the
# 'summer time' regime", and fixed the fall transition at 03:00 moving forward.
# https://dre.pt/dr/detalhe/decreto-lei/37048-1948-373810
# https://dre.pt/application/conteudo/373810
# While the Observatory only cites this act for 1949-1965 and not for 1948, it
# does not appear to have had any provision delaying its effect, so assume that
# it overrode the prior ordinance for 1948-10-03.
#
# Whitman says DST was not observed in 1950 and gives Oct lastSun for 1952 on.
# The Observatory, however, agrees with Shanks & Pottenger that 1950 was not an
# exception and that Oct Sun>=1 was maintained through 1965.
Rule Port 1947 1966 - Apr Sun>=1 2:00s 1:00 S
Rule Port 1947 1965 - Oct Sun>=1 2:00s 0 - Rule Port 1947 1965 - Oct Sun>=1 2:00s 0 -
Rule Port 1977 only - Mar 27 0:00s 1:00 S # From Tim Parenti (2024-07-01):
Rule Port 1977 only - Sep 25 0:00s 0 - # Decreto-Lei 47233 of 1966-10-01 considered that the "duality" in time was
Rule Port 1978 1979 - Apr Sun>=1 0:00s 1:00 S # "the cause of serious disturbances" and noted that "the countries with which
Rule Port 1978 only - Oct 1 0:00s 0 - # we have the most frequent contacts...have already adopted" a solution
Rule Port 1979 1982 - Sep lastSun 1:00s 0 - # coinciding with the extant "summer time". It established that the former
Rule Port 1980 only - Mar lastSun 0:00s 1:00 S # "summer time" would apply year-round on the mainland and adjacent islands
Rule Port 1981 1982 - Mar lastSun 1:00s 1:00 S # with immediate effect, as the fall back would have otherwise occurred later
Rule Port 1983 only - Mar lastSun 2:00s 1:00 S # that evening.
# https://dre.pt/dr/detalhe/decreto-lei/47233-1966-293729
# Model this by changing zones without changing clocks at the
# previously-appointed fall back time.
#
# Decreto-Lei 309/76 of 1976-04-27 acknowledged that those international
# contacts had returned to adopting seasonal times, and considered that the
# year-round advancement "entails considerable sacrifices for the vast majority
# of the working population during the winter months", including morning
# visibility concerns for schoolchildren. It specified, beginning 1976-09-26
# 01:00, an annual return to UT+00 on the mainland from 00:00 UT on Sep lastSun
# to 00:00 UT on Mar lastSun (unless the latter date fell on Easter, in which
# case it was to be brought forward to the preceding Sunday). It also assigned
# the Permanent Time Commission to study and propose revisions for the Azores
# and Madeira, neither of which resumed DST until 1982 (as described further
# below).
# https://dre.pt/dr/detalhe/decreto-lei/309-1976-502063
Rule Port 1976 only - Sep lastSun 1:00 0 -
Rule Port 1977 only - Mar lastSun 0:00s 1:00 S
Rule Port 1977 only - Sep lastSun 0:00s 0 -
# From Tim Parenti (2024-07-01):
# Beginning in 1978, rather than triggering the Easter rule of the 1976 decree
# (Easter fell on 1978-03-26), Article 5 was used instead, which allowed DST
# dates to be changed by order of the Minister of Education and Scientific
# Research, upon consultation with the Permanent Time Commission, "whenever
# considered convenient." As such, a series of one-off ordinances were
# promulgated for the mainland in 1978 through 1980, after which the 1976
# decree naturally came back into force from 1981.
Rule Port 1978 1980 - Apr Sun>=1 1:00s 1:00 S
Rule Port 1978 only - Oct 1 1:00s 0 -
Rule Port 1979 1980 - Sep lastSun 1:00s 0 -
Rule Port 1981 1986 - Mar lastSun 0:00s 1:00 S
Rule Port 1981 1985 - Sep lastSun 0:00s 0 -
# From Tim Parenti (2024-07-01):
# Decreto-Lei 44-B/86 of 1986-03-07 switched mainland Portugal's transition
# times from 0:00s to 1:00u to harmonize with the EEC from 1986-03-30.
# https://dre.pt/dr/detalhe/decreto-lei/44-b-1986-628280
# (Transitions of 1:00s as previously reported and used by the W-Eur rules,
# though equivalent, appear to have been fiction here.) Madeira continued to
# use 0:00s for spring 1986 before joining with the mainland using 1:00u in the
# fall; meanwhile, in the Azores the two were equivalent, so the law specifying
# 0:00s wasn't touched until 1992. (See below for more on the islands.)
#
# From Rui Pedro Salgueiro (1992-11-12):
# Portugal has recently (September, 27) changed timezone
# (from WET to MET or CET) to harmonize with EEC.
#
# Martin Bruckmann (1996-02-29) reports via Peter Ilieve
# that Portugal is reverting to 0:00 by not moving its clocks this spring.
# The new Prime Minister was fed up with getting up in the dark in the winter.
#
# From Paul Eggert (1996-11-12):
# IATA SSIM (1991-09) reports several 1991-09 and 1992-09 transitions
# at 02:00u, not 01:00u. Assume that these are typos.
# #
# Zone NAME STDOFF RULES FORMAT [UNTIL] # Zone NAME STDOFF RULES FORMAT [UNTIL]
#STDOFF -0:36:44.68 #STDOFF -0:36:44.68
Zone Europe/Lisbon -0:36:45 - LMT 1884 Zone Europe/Lisbon -0:36:45 - LMT 1884
-0:36:45 - LMT 1912 Jan 1 0:00u # Lisbon MT -0:36:45 - LMT 1912 Jan 1 0:00u # Lisbon MT
0:00 Port WE%sT 1966 Apr 3 2:00 0:00 Port WE%sT 1966 Oct 2 2:00s
1:00 - CET 1976 Sep 26 1:00 1:00 - CET 1976 Sep 26 1:00
0:00 Port WE%sT 1983 Sep 25 1:00s 0:00 Port WE%sT 1986
0:00 W-Eur WE%sT 1992 Sep 27 1:00s 0:00 EU WE%sT 1992 Sep 27 1:00u
1:00 EU CE%sT 1996 Mar 31 1:00u 1:00 EU CE%sT 1996 Mar 31 1:00u
0:00 EU WE%sT 0:00 EU WE%sT
# From Tim Parenti (2024-07-01):
# For the Azores and Madeira, legislation was followed from the laws currently
# in force as listed at:
# https://oal.ul.pt/hora-legal/legislacao/
# working backward through references of revocation and abrogation to
# Decreto-Lei 47233 of 1966-10-01, the last time DST was abolished across the
# mainland and its adjacent islands. Because of that reference, it is
# therefore assumed that DST rules in the islands prior to 1966 were like that
# of the mainland, though most legislation of the time didn't explicitly
# specify DST practices for the islands.
Zone Atlantic/Azores -1:42:40 - LMT 1884 # Ponta Delgada Zone Atlantic/Azores -1:42:40 - LMT 1884 # Ponta Delgada
-1:54:32 - HMT 1912 Jan 1 2:00u # Horta MT -1:54:32 - HMT 1912 Jan 1 2:00u # Horta MT
# Vanguard section, for zic and other parsers that support %z. # Vanguard section, for zic and other parsers that support %z.
# -2:00 Port %z 1966 Apr 3 2:00 -2:00 Port %z 1966 Oct 2 2:00s
# -1:00 Port %z 1983 Sep 25 1:00s # From Tim Parenti (2024-07-01):
# -1:00 W-Eur %z 1992 Sep 27 1:00s # While Decreto-Lei 309/76 of 1976-04-27 reintroduced DST on the mainland by
# falling back on 1976-09-26, it assigned the Permanent Time Commission to
# study and propose revisions for the Azores and Madeira. Decreto Regional
# 9/77/A of 1977-05-17 affirmed that "the legal time remained unchanged in the
# Azores" at UT-1, and would remain there year-round.
# https://dre.pt/dr/detalhe/decreto-regional/9-1977-252066
#
# Decreto Regional 2/82/A, published 1982-03-02, adopted DST in the same
# fashion as the mainland used at the time.
# https://dre.pt/dr/detalhe/decreto-regional/2-1982-599965
# Though transitions in the Azores officially remained at 0:00s through 1992,
# this was equivalent to the EU-style 1:00u adopted by the mainland in 1986, so
# model it as such.
-1:00 - %z 1982 Mar 28 0:00s
-1:00 Port %z 1986
# Rearguard section, for parsers lacking %z; see ziguard.awk. # Rearguard section, for parsers lacking %z; see ziguard.awk.
-2:00 Port -02/-01 1942 Apr 25 22:00s # -2:00 Port -02/-01 1942 Apr 25 22:00s
-2:00 Port +00 1942 Aug 15 22:00s # -2:00 Port +00 1942 Aug 15 22:00s
-2:00 Port -02/-01 1943 Apr 17 22:00s # -2:00 Port -02/-01 1943 Apr 17 22:00s
-2:00 Port +00 1943 Aug 28 22:00s # -2:00 Port +00 1943 Aug 28 22:00s
-2:00 Port -02/-01 1944 Apr 22 22:00s # -2:00 Port -02/-01 1944 Apr 22 22:00s
-2:00 Port +00 1944 Aug 26 22:00s # -2:00 Port +00 1944 Aug 26 22:00s
-2:00 Port -02/-01 1945 Apr 21 22:00s # -2:00 Port -02/-01 1945 Apr 21 22:00s
-2:00 Port +00 1945 Aug 25 22:00s # -2:00 Port +00 1945 Aug 25 22:00s
-2:00 Port -02/-01 1966 Apr 3 2:00 # -2:00 Port -02/-01 1966 Oct 2 2:00s
-1:00 Port -01/+00 1983 Sep 25 1:00s # -1:00 - -01 1982 Mar 28 0:00s
-1:00 W-Eur -01/+00 1992 Sep 27 1:00s # -1:00 Port -01/+00 1986
# End of rearguard section. # End of rearguard section.
0:00 EU WE%sT 1993 Mar 28 1:00u #
-1:00 EU -01/+00 # From Paul Eggert (1996-11-12):
# IATA SSIM (1991/1992) reports that the Azores were at -1:00.
# IATA SSIM (1993-02) says +0:00; later issues (through 1996-09) say -1:00.
#
# From Tim Parenti (2024-07-01):
# After mainland Portugal had shifted forward an hour from 1992-09-27, Decreto
# Legislativo Regional 29/92/A of 1992-12-23 sought to "reduce the time
# difference" by shifting the Azores forward as well from 1992-12-27. Just six
# months later, this was revoked by Decreto Legislativo Regional 9/93/A, citing
# "major changes in work habits and way of life." Though the revocation didn't
# give a transition time, it was signed Wednesday 1993-06-16; assume it took
# effect later that evening, and that an EU-style spring forward (to +01) was
# still observed in the interim on 1993-03-28.
# https://dre.pt/dr/detalhe/decreto-legislativo-regional/29-1992-621553
# https://dre.pt/dr/detalhe/decreto-legislativo-regional/9-1993-389633
-1:00 EU %z 1992 Dec 27 1:00s
0:00 EU WE%sT 1993 Jun 17 1:00u
-1:00 EU %z
Zone Atlantic/Madeira -1:07:36 - LMT 1884 # Funchal Zone Atlantic/Madeira -1:07:36 - LMT 1884 # Funchal
-1:07:36 - FMT 1912 Jan 1 1:00u # Funchal MT -1:07:36 - FMT 1912 Jan 1 1:00u # Funchal MT
# Vanguard section, for zic and other parsers that support %z. # Vanguard section, for zic and other parsers that support %z.
# -1:00 Port %z 1966 Apr 3 2:00 -1:00 Port %z 1966 Oct 2 2:00s
# Rearguard section, for parsers lacking %z; see ziguard.awk. # Rearguard section, for parsers lacking %z; see ziguard.awk.
-1:00 Port -01/+00 1942 Apr 25 22:00s # -1:00 Port -01/+00 1942 Apr 25 22:00s
-1:00 Port +01 1942 Aug 15 22:00s # -1:00 Port +01 1942 Aug 15 22:00s
-1:00 Port -01/+00 1943 Apr 17 22:00s # -1:00 Port -01/+00 1943 Apr 17 22:00s
-1:00 Port +01 1943 Aug 28 22:00s # -1:00 Port +01 1943 Aug 28 22:00s
-1:00 Port -01/+00 1944 Apr 22 22:00s # -1:00 Port -01/+00 1944 Apr 22 22:00s
-1:00 Port +01 1944 Aug 26 22:00s # -1:00 Port +01 1944 Aug 26 22:00s
-1:00 Port -01/+00 1945 Apr 21 22:00s # -1:00 Port -01/+00 1945 Apr 21 22:00s
-1:00 Port +01 1945 Aug 25 22:00s # -1:00 Port +01 1945 Aug 25 22:00s
-1:00 Port -01/+00 1966 Apr 3 2:00 # -1:00 Port -01/+00 1966 Oct 2 2:00s
# End of rearguard section. # End of rearguard section.
0:00 Port WE%sT 1983 Sep 25 1:00s #
# From Tim Parenti (2024-07-01):
# Decreto Regional 5/82/M, published 1982-04-03, established DST transitions at
# 0:00u, which for Madeira is equivalent to the mainland's rules (0:00s) at the
# time. It came into effect the day following its publication, Sunday
# 1982-04-04, thus resuming Madeira's DST practice about a week later than the
# mainland and the Azores.
# https://dre.pt/dr/detalhe/decreto-regional/5-1982-608273
#
# Decreto Legislativo Regional 18/86/M, published 1986-10-01, adopted EU-style
# rules (1:00u) and entered into immediate force after being signed on
# 1986-07-31.
# https://dre.pt/dr/detalhe/decreto-legislativo-regional/18-1986-221705
0:00 - WET 1982 Apr 4
0:00 Port WE%sT 1986 Jul 31
0:00 EU WE%sT 0:00 EU WE%sT
# Romania # Romania
@ -2613,7 +2799,7 @@ Zone Europe/Kaliningrad 1:22:00 - LMT 1893 Apr
2:00 Poland EE%sT 1946 Apr 7 2:00 Poland EE%sT 1946 Apr 7
3:00 Russia MSK/MSD 1989 Mar 26 2:00s 3:00 Russia MSK/MSD 1989 Mar 26 2:00s
2:00 Russia EE%sT 2011 Mar 27 2:00s 2:00 Russia EE%sT 2011 Mar 27 2:00s
3:00 - +03 2014 Oct 26 2:00s 3:00 - %z 2014 Oct 26 2:00s
2:00 - EET 2:00 - EET
@ -2863,14 +3049,14 @@ Zone Europe/Simferopol 2:16:24 - LMT 1880
# http://publication.pravo.gov.ru/Document/View/0001201602150056 # http://publication.pravo.gov.ru/Document/View/0001201602150056
Zone Europe/Astrakhan 3:12:12 - LMT 1924 May Zone Europe/Astrakhan 3:12:12 - LMT 1924 May
3:00 - +03 1930 Jun 21 3:00 - %z 1930 Jun 21
4:00 Russia +04/+05 1989 Mar 26 2:00s 4:00 Russia %z 1989 Mar 26 2:00s
3:00 Russia +03/+04 1991 Mar 31 2:00s 3:00 Russia %z 1991 Mar 31 2:00s
4:00 - +04 1992 Mar 29 2:00s 4:00 - %z 1992 Mar 29 2:00s
3:00 Russia +03/+04 2011 Mar 27 2:00s 3:00 Russia %z 2011 Mar 27 2:00s
4:00 - +04 2014 Oct 26 2:00s 4:00 - %z 2014 Oct 26 2:00s
3:00 - +03 2016 Mar 27 2:00s 3:00 - %z 2016 Mar 27 2:00s
4:00 - +04 4:00 - %z
# From Paul Eggert (2016-11-11): # From Paul Eggert (2016-11-11):
# Europe/Volgograd covers: # Europe/Volgograd covers:
@ -2900,15 +3086,15 @@ Zone Europe/Astrakhan 3:12:12 - LMT 1924 May
# http://publication.pravo.gov.ru/Document/View/0001202012220002 # http://publication.pravo.gov.ru/Document/View/0001202012220002
Zone Europe/Volgograd 2:57:40 - LMT 1920 Jan 3 Zone Europe/Volgograd 2:57:40 - LMT 1920 Jan 3
3:00 - +03 1930 Jun 21 3:00 - %z 1930 Jun 21
4:00 - +04 1961 Nov 11 4:00 - %z 1961 Nov 11
4:00 Russia +04/+05 1988 Mar 27 2:00s 4:00 Russia %z 1988 Mar 27 2:00s
3:00 Russia MSK/MSD 1991 Mar 31 2:00s 3:00 Russia MSK/MSD 1991 Mar 31 2:00s
4:00 - +04 1992 Mar 29 2:00s 4:00 - %z 1992 Mar 29 2:00s
3:00 Russia MSK/MSD 2011 Mar 27 2:00s 3:00 Russia MSK/MSD 2011 Mar 27 2:00s
4:00 - MSK 2014 Oct 26 2:00s 4:00 - MSK 2014 Oct 26 2:00s
3:00 - MSK 2018 Oct 28 2:00s 3:00 - MSK 2018 Oct 28 2:00s
4:00 - +04 2020 Dec 27 2:00s 4:00 - %z 2020 Dec 27 2:00s
3:00 - MSK 3:00 - MSK
# From Paul Eggert (2016-11-11): # From Paul Eggert (2016-11-11):
@ -2923,14 +3109,14 @@ Zone Europe/Volgograd 2:57:40 - LMT 1920 Jan 3
# http://publication.pravo.gov.ru/Document/View/0001201611220031 # http://publication.pravo.gov.ru/Document/View/0001201611220031
Zone Europe/Saratov 3:04:18 - LMT 1919 Jul 1 0:00u Zone Europe/Saratov 3:04:18 - LMT 1919 Jul 1 0:00u
3:00 - +03 1930 Jun 21 3:00 - %z 1930 Jun 21
4:00 Russia +04/+05 1988 Mar 27 2:00s 4:00 Russia %z 1988 Mar 27 2:00s
3:00 Russia +03/+04 1991 Mar 31 2:00s 3:00 Russia %z 1991 Mar 31 2:00s
4:00 - +04 1992 Mar 29 2:00s 4:00 - %z 1992 Mar 29 2:00s
3:00 Russia +03/+04 2011 Mar 27 2:00s 3:00 Russia %z 2011 Mar 27 2:00s
4:00 - +04 2014 Oct 26 2:00s 4:00 - %z 2014 Oct 26 2:00s
3:00 - +03 2016 Dec 4 2:00s 3:00 - %z 2016 Dec 4 2:00s
4:00 - +04 4:00 - %z
# From Paul Eggert (2016-03-18): # From Paul Eggert (2016-03-18):
# Europe/Kirov covers: # Europe/Kirov covers:
@ -2938,10 +3124,10 @@ Zone Europe/Saratov 3:04:18 - LMT 1919 Jul 1 0:00u
# The 1989 transition is from USSR act No. 227 (1989-03-14). # The 1989 transition is from USSR act No. 227 (1989-03-14).
# #
Zone Europe/Kirov 3:18:48 - LMT 1919 Jul 1 0:00u Zone Europe/Kirov 3:18:48 - LMT 1919 Jul 1 0:00u
3:00 - +03 1930 Jun 21 3:00 - %z 1930 Jun 21
4:00 Russia +04/+05 1989 Mar 26 2:00s 4:00 Russia %z 1989 Mar 26 2:00s
3:00 Russia MSK/MSD 1991 Mar 31 2:00s 3:00 Russia MSK/MSD 1991 Mar 31 2:00s
4:00 - +04 1992 Mar 29 2:00s 4:00 - %z 1992 Mar 29 2:00s
3:00 Russia MSK/MSD 2011 Mar 27 2:00s 3:00 Russia MSK/MSD 2011 Mar 27 2:00s
4:00 - MSK 2014 Oct 26 2:00s 4:00 - MSK 2014 Oct 26 2:00s
3:00 - MSK 3:00 - MSK
@ -2956,15 +3142,15 @@ Zone Europe/Kirov 3:18:48 - LMT 1919 Jul 1 0:00u
# The 1989 transition is from USSR act No. 227 (1989-03-14). # The 1989 transition is from USSR act No. 227 (1989-03-14).
Zone Europe/Samara 3:20:20 - LMT 1919 Jul 1 0:00u Zone Europe/Samara 3:20:20 - LMT 1919 Jul 1 0:00u
3:00 - +03 1930 Jun 21 3:00 - %z 1930 Jun 21
4:00 - +04 1935 Jan 27 4:00 - %z 1935 Jan 27
4:00 Russia +04/+05 1989 Mar 26 2:00s 4:00 Russia %z 1989 Mar 26 2:00s
3:00 Russia +03/+04 1991 Mar 31 2:00s 3:00 Russia %z 1991 Mar 31 2:00s
2:00 Russia +02/+03 1991 Sep 29 2:00s 2:00 Russia %z 1991 Sep 29 2:00s
3:00 - +03 1991 Oct 20 3:00 3:00 - %z 1991 Oct 20 3:00
4:00 Russia +04/+05 2010 Mar 28 2:00s 4:00 Russia %z 2010 Mar 28 2:00s
3:00 Russia +03/+04 2011 Mar 27 2:00s 3:00 Russia %z 2011 Mar 27 2:00s
4:00 - +04 4:00 - %z
# From Paul Eggert (2016-03-18): # From Paul Eggert (2016-03-18):
# Europe/Ulyanovsk covers: # Europe/Ulyanovsk covers:
@ -2980,14 +3166,14 @@ Zone Europe/Samara 3:20:20 - LMT 1919 Jul 1 0:00u
# http://publication.pravo.gov.ru/Document/View/0001201603090051 # http://publication.pravo.gov.ru/Document/View/0001201603090051
Zone Europe/Ulyanovsk 3:13:36 - LMT 1919 Jul 1 0:00u Zone Europe/Ulyanovsk 3:13:36 - LMT 1919 Jul 1 0:00u
3:00 - +03 1930 Jun 21 3:00 - %z 1930 Jun 21
4:00 Russia +04/+05 1989 Mar 26 2:00s 4:00 Russia %z 1989 Mar 26 2:00s
3:00 Russia +03/+04 1991 Mar 31 2:00s 3:00 Russia %z 1991 Mar 31 2:00s
2:00 Russia +02/+03 1992 Jan 19 2:00s 2:00 Russia %z 1992 Jan 19 2:00s
3:00 Russia +03/+04 2011 Mar 27 2:00s 3:00 Russia %z 2011 Mar 27 2:00s
4:00 - +04 2014 Oct 26 2:00s 4:00 - %z 2014 Oct 26 2:00s
3:00 - +03 2016 Mar 27 2:00s 3:00 - %z 2016 Mar 27 2:00s
4:00 - +04 4:00 - %z
# From Tim Parenti (2014-07-03), per Oscar van Vlijmen (2001-08-25): # From Tim Parenti (2014-07-03), per Oscar van Vlijmen (2001-08-25):
# Asia/Yekaterinburg covers... # Asia/Yekaterinburg covers...
@ -3012,12 +3198,12 @@ Zone Europe/Ulyanovsk 3:13:36 - LMT 1919 Jul 1 0:00u
#STDOFF 4:02:32.9 #STDOFF 4:02:32.9
Zone Asia/Yekaterinburg 4:02:33 - LMT 1916 Jul 3 Zone Asia/Yekaterinburg 4:02:33 - LMT 1916 Jul 3
3:45:05 - PMT 1919 Jul 15 4:00 3:45:05 - PMT 1919 Jul 15 4:00
4:00 - +04 1930 Jun 21 4:00 - %z 1930 Jun 21
5:00 Russia +05/+06 1991 Mar 31 2:00s 5:00 Russia %z 1991 Mar 31 2:00s
4:00 Russia +04/+05 1992 Jan 19 2:00s 4:00 Russia %z 1992 Jan 19 2:00s
5:00 Russia +05/+06 2011 Mar 27 2:00s 5:00 Russia %z 2011 Mar 27 2:00s
6:00 - +06 2014 Oct 26 2:00s 6:00 - %z 2014 Oct 26 2:00s
5:00 - +05 5:00 - %z
# From Tim Parenti (2014-07-03), per Oscar van Vlijmen (2001-08-25): # From Tim Parenti (2014-07-03), per Oscar van Vlijmen (2001-08-25):
@ -3027,12 +3213,12 @@ Zone Asia/Yekaterinburg 4:02:33 - LMT 1916 Jul 3
# Byalokoz 1919 says Omsk was 4:53:30. # Byalokoz 1919 says Omsk was 4:53:30.
Zone Asia/Omsk 4:53:30 - LMT 1919 Nov 14 Zone Asia/Omsk 4:53:30 - LMT 1919 Nov 14
5:00 - +05 1930 Jun 21 5:00 - %z 1930 Jun 21
6:00 Russia +06/+07 1991 Mar 31 2:00s 6:00 Russia %z 1991 Mar 31 2:00s
5:00 Russia +05/+06 1992 Jan 19 2:00s 5:00 Russia %z 1992 Jan 19 2:00s
6:00 Russia +06/+07 2011 Mar 27 2:00s 6:00 Russia %z 2011 Mar 27 2:00s
7:00 - +07 2014 Oct 26 2:00s 7:00 - %z 2014 Oct 26 2:00s
6:00 - +06 6:00 - %z
# From Paul Eggert (2016-02-22): # From Paul Eggert (2016-02-22):
# Asia/Barnaul covers: # Asia/Barnaul covers:
@ -3065,14 +3251,14 @@ Zone Asia/Omsk 4:53:30 - LMT 1919 Nov 14
# http://publication.pravo.gov.ru/Document/View/0001201603090038 # http://publication.pravo.gov.ru/Document/View/0001201603090038
Zone Asia/Barnaul 5:35:00 - LMT 1919 Dec 10 Zone Asia/Barnaul 5:35:00 - LMT 1919 Dec 10
6:00 - +06 1930 Jun 21 6:00 - %z 1930 Jun 21
7:00 Russia +07/+08 1991 Mar 31 2:00s 7:00 Russia %z 1991 Mar 31 2:00s
6:00 Russia +06/+07 1992 Jan 19 2:00s 6:00 Russia %z 1992 Jan 19 2:00s
7:00 Russia +07/+08 1995 May 28 7:00 Russia %z 1995 May 28
6:00 Russia +06/+07 2011 Mar 27 2:00s 6:00 Russia %z 2011 Mar 27 2:00s
7:00 - +07 2014 Oct 26 2:00s 7:00 - %z 2014 Oct 26 2:00s
6:00 - +06 2016 Mar 27 2:00s 6:00 - %z 2016 Mar 27 2:00s
7:00 - +07 7:00 - %z
# From Paul Eggert (2016-03-18): # From Paul Eggert (2016-03-18):
# Asia/Novosibirsk covers: # Asia/Novosibirsk covers:
@ -3086,14 +3272,14 @@ Zone Asia/Barnaul 5:35:00 - LMT 1919 Dec 10
# http://publication.pravo.gov.ru/Document/View/0001201607040064 # http://publication.pravo.gov.ru/Document/View/0001201607040064
Zone Asia/Novosibirsk 5:31:40 - LMT 1919 Dec 14 6:00 Zone Asia/Novosibirsk 5:31:40 - LMT 1919 Dec 14 6:00
6:00 - +06 1930 Jun 21 6:00 - %z 1930 Jun 21
7:00 Russia +07/+08 1991 Mar 31 2:00s 7:00 Russia %z 1991 Mar 31 2:00s
6:00 Russia +06/+07 1992 Jan 19 2:00s 6:00 Russia %z 1992 Jan 19 2:00s
7:00 Russia +07/+08 1993 May 23 # say Shanks & P. 7:00 Russia %z 1993 May 23 # say Shanks & P.
6:00 Russia +06/+07 2011 Mar 27 2:00s 6:00 Russia %z 2011 Mar 27 2:00s
7:00 - +07 2014 Oct 26 2:00s 7:00 - %z 2014 Oct 26 2:00s
6:00 - +06 2016 Jul 24 2:00s 6:00 - %z 2016 Jul 24 2:00s
7:00 - +07 7:00 - %z
# From Paul Eggert (2016-03-18): # From Paul Eggert (2016-03-18):
# Asia/Tomsk covers: # Asia/Tomsk covers:
@ -3138,14 +3324,14 @@ Zone Asia/Novosibirsk 5:31:40 - LMT 1919 Dec 14 6:00
# http://publication.pravo.gov.ru/Document/View/0001201604260048 # http://publication.pravo.gov.ru/Document/View/0001201604260048
Zone Asia/Tomsk 5:39:51 - LMT 1919 Dec 22 Zone Asia/Tomsk 5:39:51 - LMT 1919 Dec 22
6:00 - +06 1930 Jun 21 6:00 - %z 1930 Jun 21
7:00 Russia +07/+08 1991 Mar 31 2:00s 7:00 Russia %z 1991 Mar 31 2:00s
6:00 Russia +06/+07 1992 Jan 19 2:00s 6:00 Russia %z 1992 Jan 19 2:00s
7:00 Russia +07/+08 2002 May 1 3:00 7:00 Russia %z 2002 May 1 3:00
6:00 Russia +06/+07 2011 Mar 27 2:00s 6:00 Russia %z 2011 Mar 27 2:00s
7:00 - +07 2014 Oct 26 2:00s 7:00 - %z 2014 Oct 26 2:00s
6:00 - +06 2016 May 29 2:00s 6:00 - %z 2016 May 29 2:00s
7:00 - +07 7:00 - %z
# From Tim Parenti (2014-07-03): # From Tim Parenti (2014-07-03):
@ -3176,12 +3362,12 @@ Zone Asia/Tomsk 5:39:51 - LMT 1919 Dec 22
# realigning itself with KRAT. # realigning itself with KRAT.
Zone Asia/Novokuznetsk 5:48:48 - LMT 1924 May 1 Zone Asia/Novokuznetsk 5:48:48 - LMT 1924 May 1
6:00 - +06 1930 Jun 21 6:00 - %z 1930 Jun 21
7:00 Russia +07/+08 1991 Mar 31 2:00s 7:00 Russia %z 1991 Mar 31 2:00s
6:00 Russia +06/+07 1992 Jan 19 2:00s 6:00 Russia %z 1992 Jan 19 2:00s
7:00 Russia +07/+08 2010 Mar 28 2:00s 7:00 Russia %z 2010 Mar 28 2:00s
6:00 Russia +06/+07 2011 Mar 27 2:00s 6:00 Russia %z 2011 Mar 27 2:00s
7:00 - +07 7:00 - %z
# From Tim Parenti (2014-07-03), per Oscar van Vlijmen (2001-08-25): # From Tim Parenti (2014-07-03), per Oscar van Vlijmen (2001-08-25):
# Asia/Krasnoyarsk covers... # Asia/Krasnoyarsk covers...
@ -3195,12 +3381,12 @@ Zone Asia/Novokuznetsk 5:48:48 - LMT 1924 May 1
# Byalokoz 1919 says Krasnoyarsk was 6:11:26. # Byalokoz 1919 says Krasnoyarsk was 6:11:26.
Zone Asia/Krasnoyarsk 6:11:26 - LMT 1920 Jan 6 Zone Asia/Krasnoyarsk 6:11:26 - LMT 1920 Jan 6
6:00 - +06 1930 Jun 21 6:00 - %z 1930 Jun 21
7:00 Russia +07/+08 1991 Mar 31 2:00s 7:00 Russia %z 1991 Mar 31 2:00s
6:00 Russia +06/+07 1992 Jan 19 2:00s 6:00 Russia %z 1992 Jan 19 2:00s
7:00 Russia +07/+08 2011 Mar 27 2:00s 7:00 Russia %z 2011 Mar 27 2:00s
8:00 - +08 2014 Oct 26 2:00s 8:00 - %z 2014 Oct 26 2:00s
7:00 - +07 7:00 - %z
# From Tim Parenti (2014-07-03), per Oscar van Vlijmen (2001-08-25): # From Tim Parenti (2014-07-03), per Oscar van Vlijmen (2001-08-25):
@ -3217,12 +3403,12 @@ Zone Asia/Krasnoyarsk 6:11:26 - LMT 1920 Jan 6
Zone Asia/Irkutsk 6:57:05 - LMT 1880 Zone Asia/Irkutsk 6:57:05 - LMT 1880
6:57:05 - IMT 1920 Jan 25 # Irkutsk Mean Time 6:57:05 - IMT 1920 Jan 25 # Irkutsk Mean Time
7:00 - +07 1930 Jun 21 7:00 - %z 1930 Jun 21
8:00 Russia +08/+09 1991 Mar 31 2:00s 8:00 Russia %z 1991 Mar 31 2:00s
7:00 Russia +07/+08 1992 Jan 19 2:00s 7:00 Russia %z 1992 Jan 19 2:00s
8:00 Russia +08/+09 2011 Mar 27 2:00s 8:00 Russia %z 2011 Mar 27 2:00s
9:00 - +09 2014 Oct 26 2:00s 9:00 - %z 2014 Oct 26 2:00s
8:00 - +08 8:00 - %z
# From Tim Parenti (2014-07-06): # From Tim Parenti (2014-07-06):
@ -3239,13 +3425,13 @@ Zone Asia/Irkutsk 6:57:05 - LMT 1880
# http://publication.pravo.gov.ru/Document/View/0001201512300107 # http://publication.pravo.gov.ru/Document/View/0001201512300107
Zone Asia/Chita 7:33:52 - LMT 1919 Dec 15 Zone Asia/Chita 7:33:52 - LMT 1919 Dec 15
8:00 - +08 1930 Jun 21 8:00 - %z 1930 Jun 21
9:00 Russia +09/+10 1991 Mar 31 2:00s 9:00 Russia %z 1991 Mar 31 2:00s
8:00 Russia +08/+09 1992 Jan 19 2:00s 8:00 Russia %z 1992 Jan 19 2:00s
9:00 Russia +09/+10 2011 Mar 27 2:00s 9:00 Russia %z 2011 Mar 27 2:00s
10:00 - +10 2014 Oct 26 2:00s 10:00 - %z 2014 Oct 26 2:00s
8:00 - +08 2016 Mar 27 2:00 8:00 - %z 2016 Mar 27 2:00
9:00 - +09 9:00 - %z
# From Tim Parenti (2014-07-03), per Oscar van Vlijmen (2009-11-29): # From Tim Parenti (2014-07-03), per Oscar van Vlijmen (2009-11-29):
@ -3285,12 +3471,12 @@ Zone Asia/Chita 7:33:52 - LMT 1919 Dec 15
# Byalokoz 1919 says Yakutsk was 8:38:58. # Byalokoz 1919 says Yakutsk was 8:38:58.
Zone Asia/Yakutsk 8:38:58 - LMT 1919 Dec 15 Zone Asia/Yakutsk 8:38:58 - LMT 1919 Dec 15
8:00 - +08 1930 Jun 21 8:00 - %z 1930 Jun 21
9:00 Russia +09/+10 1991 Mar 31 2:00s 9:00 Russia %z 1991 Mar 31 2:00s
8:00 Russia +08/+09 1992 Jan 19 2:00s 8:00 Russia %z 1992 Jan 19 2:00s
9:00 Russia +09/+10 2011 Mar 27 2:00s 9:00 Russia %z 2011 Mar 27 2:00s
10:00 - +10 2014 Oct 26 2:00s 10:00 - %z 2014 Oct 26 2:00s
9:00 - +09 9:00 - %z
# From Tim Parenti (2014-07-03), per Oscar van Vlijmen (2009-11-29): # From Tim Parenti (2014-07-03), per Oscar van Vlijmen (2009-11-29):
@ -3308,12 +3494,12 @@ Zone Asia/Yakutsk 8:38:58 - LMT 1919 Dec 15
# Go with Byalokoz. # Go with Byalokoz.
Zone Asia/Vladivostok 8:47:31 - LMT 1922 Nov 15 Zone Asia/Vladivostok 8:47:31 - LMT 1922 Nov 15
9:00 - +09 1930 Jun 21 9:00 - %z 1930 Jun 21
10:00 Russia +10/+11 1991 Mar 31 2:00s 10:00 Russia %z 1991 Mar 31 2:00s
9:00 Russia +09/+10 1992 Jan 19 2:00s 9:00 Russia %z 1992 Jan 19 2:00s
10:00 Russia +10/+11 2011 Mar 27 2:00s 10:00 Russia %z 2011 Mar 27 2:00s
11:00 - +11 2014 Oct 26 2:00s 11:00 - %z 2014 Oct 26 2:00s
10:00 - +10 10:00 - %z
# From Tim Parenti (2014-07-03): # From Tim Parenti (2014-07-03):
@ -3331,14 +3517,14 @@ Zone Asia/Vladivostok 8:47:31 - LMT 1922 Nov 15
# This transition is no doubt wrong, but we have no better info. # This transition is no doubt wrong, but we have no better info.
Zone Asia/Khandyga 9:02:13 - LMT 1919 Dec 15 Zone Asia/Khandyga 9:02:13 - LMT 1919 Dec 15
8:00 - +08 1930 Jun 21 8:00 - %z 1930 Jun 21
9:00 Russia +09/+10 1991 Mar 31 2:00s 9:00 Russia %z 1991 Mar 31 2:00s
8:00 Russia +08/+09 1992 Jan 19 2:00s 8:00 Russia %z 1992 Jan 19 2:00s
9:00 Russia +09/+10 2004 9:00 Russia %z 2004
10:00 Russia +10/+11 2011 Mar 27 2:00s 10:00 Russia %z 2011 Mar 27 2:00s
11:00 - +11 2011 Sep 13 0:00s # Decree 725? 11:00 - %z 2011 Sep 13 0:00s # Decree 725?
10:00 - +10 2014 Oct 26 2:00s 10:00 - %z 2014 Oct 26 2:00s
9:00 - +09 9:00 - %z
# From Tim Parenti (2014-07-03): # From Tim Parenti (2014-07-03):
@ -3354,14 +3540,14 @@ Zone Asia/Khandyga 9:02:13 - LMT 1919 Dec 15
# The Zone name should be Asia/Yuzhno-Sakhalinsk, but that's too long. # The Zone name should be Asia/Yuzhno-Sakhalinsk, but that's too long.
Zone Asia/Sakhalin 9:30:48 - LMT 1905 Aug 23 Zone Asia/Sakhalin 9:30:48 - LMT 1905 Aug 23
9:00 - +09 1945 Aug 25 9:00 - %z 1945 Aug 25
11:00 Russia +11/+12 1991 Mar 31 2:00s # Sakhalin T 11:00 Russia %z 1991 Mar 31 2:00s # Sakhalin T
10:00 Russia +10/+11 1992 Jan 19 2:00s 10:00 Russia %z 1992 Jan 19 2:00s
11:00 Russia +11/+12 1997 Mar lastSun 2:00s 11:00 Russia %z 1997 Mar lastSun 2:00s
10:00 Russia +10/+11 2011 Mar 27 2:00s 10:00 Russia %z 2011 Mar 27 2:00s
11:00 - +11 2014 Oct 26 2:00s 11:00 - %z 2014 Oct 26 2:00s
10:00 - +10 2016 Mar 27 2:00s 10:00 - %z 2016 Mar 27 2:00s
11:00 - +11 11:00 - %z
# From Tim Parenti (2014-07-03), per Oscar van Vlijmen (2009-11-29): # From Tim Parenti (2014-07-03), per Oscar van Vlijmen (2009-11-29):
@ -3384,13 +3570,13 @@ Zone Asia/Sakhalin 9:30:48 - LMT 1905 Aug 23
# http://publication.pravo.gov.ru/Document/View/0001201604050038 # http://publication.pravo.gov.ru/Document/View/0001201604050038
Zone Asia/Magadan 10:03:12 - LMT 1924 May 2 Zone Asia/Magadan 10:03:12 - LMT 1924 May 2
10:00 - +10 1930 Jun 21 # Magadan Time 10:00 - %z 1930 Jun 21 # Magadan Time
11:00 Russia +11/+12 1991 Mar 31 2:00s 11:00 Russia %z 1991 Mar 31 2:00s
10:00 Russia +10/+11 1992 Jan 19 2:00s 10:00 Russia %z 1992 Jan 19 2:00s
11:00 Russia +11/+12 2011 Mar 27 2:00s 11:00 Russia %z 2011 Mar 27 2:00s
12:00 - +12 2014 Oct 26 2:00s 12:00 - %z 2014 Oct 26 2:00s
10:00 - +10 2016 Apr 24 2:00s 10:00 - %z 2016 Apr 24 2:00s
11:00 - +11 11:00 - %z
# From Tim Parenti (2014-07-06): # From Tim Parenti (2014-07-06):
@ -3435,12 +3621,12 @@ Zone Asia/Magadan 10:03:12 - LMT 1924 May 2
# Go with Srednekolymsk. # Go with Srednekolymsk.
Zone Asia/Srednekolymsk 10:14:52 - LMT 1924 May 2 Zone Asia/Srednekolymsk 10:14:52 - LMT 1924 May 2
10:00 - +10 1930 Jun 21 10:00 - %z 1930 Jun 21
11:00 Russia +11/+12 1991 Mar 31 2:00s 11:00 Russia %z 1991 Mar 31 2:00s
10:00 Russia +10/+11 1992 Jan 19 2:00s 10:00 Russia %z 1992 Jan 19 2:00s
11:00 Russia +11/+12 2011 Mar 27 2:00s 11:00 Russia %z 2011 Mar 27 2:00s
12:00 - +12 2014 Oct 26 2:00s 12:00 - %z 2014 Oct 26 2:00s
11:00 - +11 11:00 - %z
# From Tim Parenti (2014-07-03): # From Tim Parenti (2014-07-03):
@ -3458,14 +3644,14 @@ Zone Asia/Srednekolymsk 10:14:52 - LMT 1924 May 2
# UTC+12 since at least then, too. # UTC+12 since at least then, too.
Zone Asia/Ust-Nera 9:32:54 - LMT 1919 Dec 15 Zone Asia/Ust-Nera 9:32:54 - LMT 1919 Dec 15
8:00 - +08 1930 Jun 21 8:00 - %z 1930 Jun 21
9:00 Russia +09/+10 1981 Apr 1 9:00 Russia %z 1981 Apr 1
11:00 Russia +11/+12 1991 Mar 31 2:00s 11:00 Russia %z 1991 Mar 31 2:00s
10:00 Russia +10/+11 1992 Jan 19 2:00s 10:00 Russia %z 1992 Jan 19 2:00s
11:00 Russia +11/+12 2011 Mar 27 2:00s 11:00 Russia %z 2011 Mar 27 2:00s
12:00 - +12 2011 Sep 13 0:00s # Decree 725? 12:00 - %z 2011 Sep 13 0:00s # Decree 725?
11:00 - +11 2014 Oct 26 2:00s 11:00 - %z 2014 Oct 26 2:00s
10:00 - +10 10:00 - %z
# From Tim Parenti (2014-07-03), per Oscar van Vlijmen (2001-08-25): # From Tim Parenti (2014-07-03), per Oscar van Vlijmen (2001-08-25):
@ -3478,12 +3664,12 @@ Zone Asia/Ust-Nera 9:32:54 - LMT 1919 Dec 15
# The Zone name should be Asia/Petropavlovsk-Kamchatski or perhaps # The Zone name should be Asia/Petropavlovsk-Kamchatski or perhaps
# Asia/Petropavlovsk-Kamchatsky, but these are too long. # Asia/Petropavlovsk-Kamchatsky, but these are too long.
Zone Asia/Kamchatka 10:34:36 - LMT 1922 Nov 10 Zone Asia/Kamchatka 10:34:36 - LMT 1922 Nov 10
11:00 - +11 1930 Jun 21 11:00 - %z 1930 Jun 21
12:00 Russia +12/+13 1991 Mar 31 2:00s 12:00 Russia %z 1991 Mar 31 2:00s
11:00 Russia +11/+12 1992 Jan 19 2:00s 11:00 Russia %z 1992 Jan 19 2:00s
12:00 Russia +12/+13 2010 Mar 28 2:00s 12:00 Russia %z 2010 Mar 28 2:00s
11:00 Russia +11/+12 2011 Mar 27 2:00s 11:00 Russia %z 2011 Mar 27 2:00s
12:00 - +12 12:00 - %z
# From Tim Parenti (2014-07-03): # From Tim Parenti (2014-07-03):
@ -3491,13 +3677,13 @@ Zone Asia/Kamchatka 10:34:36 - LMT 1922 Nov 10
# 87 RU-CHU Chukotka Autonomous Okrug # 87 RU-CHU Chukotka Autonomous Okrug
Zone Asia/Anadyr 11:49:56 - LMT 1924 May 2 Zone Asia/Anadyr 11:49:56 - LMT 1924 May 2
12:00 - +12 1930 Jun 21 12:00 - %z 1930 Jun 21
13:00 Russia +13/+14 1982 Apr 1 0:00s 13:00 Russia %z 1982 Apr 1 0:00s
12:00 Russia +12/+13 1991 Mar 31 2:00s 12:00 Russia %z 1991 Mar 31 2:00s
11:00 Russia +11/+12 1992 Jan 19 2:00s 11:00 Russia %z 1992 Jan 19 2:00s
12:00 Russia +12/+13 2010 Mar 28 2:00s 12:00 Russia %z 2010 Mar 28 2:00s
11:00 Russia +11/+12 2011 Mar 27 2:00s 11:00 Russia %z 2011 Mar 27 2:00s
12:00 - +12 12:00 - %z
# San Marino # San Marino
Link Europe/Rome Europe/San_Marino Link Europe/Rome Europe/San_Marino
@ -3625,7 +3811,7 @@ Zone Africa/Ceuta -0:21:16 - LMT 1901 Jan 1 0:00u
1:00 - CET 1986 1:00 - CET 1986
1:00 EU CE%sT 1:00 EU CE%sT
Zone Atlantic/Canary -1:01:36 - LMT 1922 Mar # Las Palmas de Gran C. Zone Atlantic/Canary -1:01:36 - LMT 1922 Mar # Las Palmas de Gran C.
-1:00 - -01 1946 Sep 30 1:00 -1:00 - %z 1946 Sep 30 1:00
0:00 - WET 1980 Apr 6 0:00s 0:00 - WET 1980 Apr 6 0:00s
0:00 1:00 WEST 1980 Sep 28 1:00u 0:00 1:00 WEST 1980 Sep 28 1:00u
0:00 EU WE%sT 0:00 EU WE%sT
@ -3711,8 +3897,8 @@ Zone Europe/Stockholm 1:12:12 - LMT 1879 Jan 1
# but if no one is present after 11 at night, could be postponed until one # but if no one is present after 11 at night, could be postponed until one
# hour before the beginning of service. # hour before the beginning of service.
# From Paul Eggert (2013-09-11): # From Paul Eggert (2024-05-24):
# Round BMT to the nearest even second, 0:29:46. # Express BMT as 0:29:45.500, approximately the same precision 7° 26' 22.50".
# #
# We can find no reliable source for Shanks's assertion that all of Switzerland # We can find no reliable source for Shanks's assertion that all of Switzerland
# except Geneva switched to Bern Mean Time at 00:00 on 1848-09-12. This book: # except Geneva switched to Bern Mean Time at 00:00 on 1848-09-12. This book:
@ -3751,6 +3937,7 @@ Rule Swiss 1941 1942 - May Mon>=1 1:00 1:00 S
Rule Swiss 1941 1942 - Oct Mon>=1 2:00 0 - Rule Swiss 1941 1942 - Oct Mon>=1 2:00 0 -
# Zone NAME STDOFF RULES FORMAT [UNTIL] # Zone NAME STDOFF RULES FORMAT [UNTIL]
Zone Europe/Zurich 0:34:08 - LMT 1853 Jul 16 # See above comment. Zone Europe/Zurich 0:34:08 - LMT 1853 Jul 16 # See above comment.
#STDOFF 0:29:45.500
0:29:46 - BMT 1894 Jun # Bern Mean Time 0:29:46 - BMT 1894 Jun # Bern Mean Time
1:00 Swiss CE%sT 1981 1:00 Swiss CE%sT 1981
1:00 EU CE%sT 1:00 EU CE%sT
@ -3949,7 +4136,7 @@ Rule Turkey 1996 2006 - Oct lastSun 1:00s 0 -
Zone Europe/Istanbul 1:55:52 - LMT 1880 Zone Europe/Istanbul 1:55:52 - LMT 1880
1:56:56 - IMT 1910 Oct # Istanbul Mean Time? 1:56:56 - IMT 1910 Oct # Istanbul Mean Time?
2:00 Turkey EE%sT 1978 Jun 29 2:00 Turkey EE%sT 1978 Jun 29
3:00 Turkey +03/+04 1984 Nov 1 2:00 3:00 Turkey %z 1984 Nov 1 2:00
2:00 Turkey EE%sT 2007 2:00 Turkey EE%sT 2007
2:00 EU EE%sT 2011 Mar 27 1:00u 2:00 EU EE%sT 2011 Mar 27 1:00u
2:00 - EET 2011 Mar 28 1:00u 2:00 - EET 2011 Mar 28 1:00u
@ -3958,7 +4145,7 @@ Zone Europe/Istanbul 1:55:52 - LMT 1880
2:00 EU EE%sT 2015 Oct 25 1:00u 2:00 EU EE%sT 2015 Oct 25 1:00u
2:00 1:00 EEST 2015 Nov 8 1:00u 2:00 1:00 EEST 2015 Nov 8 1:00u
2:00 EU EE%sT 2016 Sep 7 2:00 EU EE%sT 2016 Sep 7
3:00 - +03 3:00 - %z
# Ukraine # Ukraine
# #

View file

@ -1,6 +1,6 @@
# $OpenBSD: leap-seconds.list,v 1.3 2024/02/05 17:07:23 millert Exp $ # $OpenBSD: leap-seconds.list,v 1.4 2024/10/02 17:08:47 millert Exp $
# ATOMIC TIME. # ATOMIC TIME
# The Coordinated Universal Time (UTC) is the reference time scale derived # Coordinated Universal Time (UTC) is the reference time scale derived
# from The "Temps Atomique International" (TAI) calculated by the Bureau # from The "Temps Atomique International" (TAI) calculated by the Bureau
# International des Poids et Mesures (BIPM) using a worldwide network of atomic # International des Poids et Mesures (BIPM) using a worldwide network of atomic
# clocks. UTC differs from TAI by an integer number of seconds; it is the basis # clocks. UTC differs from TAI by an integer number of seconds; it is the basis
@ -9,34 +9,34 @@
# #
# ASTRONOMICAL TIME (UT1) is the time scale based on the rate of rotation of the earth. # ASTRONOMICAL TIME (UT1) is the time scale based on the rate of rotation of the earth.
# It is now mainly derived from Very Long Baseline Interferometry (VLBI). The various # It is now mainly derived from Very Long Baseline Interferometry (VLBI). The various
# irregular fluctuations progressively detected in the rotation rate of the Earth lead # irregular fluctuations progressively detected in the rotation rate of the Earth led
# in 1972 to the replacement of UT1 by UTC as the reference time scale. # in 1972 to the replacement of UT1 by UTC as the reference time scale.
# #
# #
# LEAP SECOND # LEAP SECOND
# Atomic clocks are more stable than the rate of the earth rotation since the latter # Atomic clocks are more stable than the rate of the earth's rotation since the latter
# undergoes a full range of geophysical perturbations at various time scales: lunisolar # undergoes a full range of geophysical perturbations at various time scales: lunisolar
# and core-mantle torques, atmospheric and oceanic effetcs, etc. # and core-mantle torques, atmospheric and oceanic effects, etc.
# Leap seconds are needed to keep the two time scales in agreement, i.e. UT1-UTC smaller # Leap seconds are needed to keep the two time scales in agreement, i.e. UT1-UTC smaller
# than 0.9 second. Therefore, when necessary a "leap second" is applied to UTC. # than 0.9 seconds. Therefore, when necessary a "leap second" is applied to UTC.
# Since the adoption of this system in 1972 it has been necessary to add a number of seconds to UTC, # Since the adoption of this system in 1972 it has been necessary to add a number of seconds to UTC,
# firstly due to the initial choice of the value of the second (1/86400 mean solar day of # firstly due to the initial choice of the value of the second (1/86400 mean solar day of
# the year 1820) and secondly to the general slowing down of the Earth's rotation. It is # the year 1820) and secondly to the general slowing down of the Earth's rotation. It is
# theorically possible to have a negative leap second (a second removed from UTC), but so far, # theoretically possible to have a negative leap second (a second removed from UTC), but so far,
# all leap seconds have been positive (a second has been added to UTC). Based on what we know about # all leap seconds have been positive (a second has been added to UTC). Based on what we know about
# the earth's rotation, it is unlikely that we will ever have a negative leap second. # the earth's rotation, it is unlikely that we will ever have a negative leap second.
# #
# #
# HISTORY # HISTORY
# The first leap second was added on June 30, 1972. Until yhe year 2000, it was necessary in average to add a # The first leap second was added on June 30, 1972. Until the year 2000, it was necessary in average to add a
# leap second at a rate of 1 to 2 years. Since the year 2000 leap seconds are introduced with an # leap second at a rate of 1 to 2 years. Since the year 2000 leap seconds are introduced with an
# average interval of 3 to 4 years due to the acceleration of the Earth rotation speed. # average interval of 3 to 4 years due to the acceleration of the Earth's rotation speed.
# #
# #
# RESPONSABILITY OF THE DECISION TO INTRODUCE A LEAP SECOND IN UTC # RESPONSIBILITY OF THE DECISION TO INTRODUCE A LEAP SECOND IN UTC
# The decision to introduce a leap second in UTC is the responsibility of the Earth Orientation Center of # The decision to introduce a leap second in UTC is the responsibility of the Earth Orientation Center of
# the International Earth Rotation and reference System Service (IERS). This center is located at Paris # the International Earth Rotation and reference System Service (IERS). This center is located at Paris
# Observatory. According to international agreements, leap seconds should only be scheduled for certain dates: # Observatory. According to international agreements, leap seconds should be scheduled only for certain dates:
# first preference is given to the end of December and June, and second preference at the end of March # first preference is given to the end of December and June, and second preference at the end of March
# and September. Since the introduction of leap seconds in 1972, only dates in June and December were used. # and September. Since the introduction of leap seconds in 1972, only dates in June and December were used.
# #
@ -61,15 +61,15 @@
# #
# The following line shows the last update of this file in NTP timestamp: # The following line shows the last update of this file in NTP timestamp:
# #
#$ 3913697179 #$ 3929093563
# #
# 2) Expiration date of the file given on a semi-annual basis: last June or last December # 2) Expiration date of the file given on a semi-annual basis: last June or last December
# #
# File expires on 28 December 2024 # File expires on 28 June 2025
# #
# Expire date in NTP timestamp: # Expire date in NTP timestamp:
# #
#@ 3944332800 #@ 3960057600
# #
# #
# LIST OF LEAP SECONDS # LIST OF LEAP SECONDS
@ -118,4 +118,4 @@
# please see the readme file in the 'source' directory : # please see the readme file in the 'source' directory :
# https://hpiers.obspm.fr/iers/bul/bulc/ntp/sources/README # https://hpiers.obspm.fr/iers/bul/bulc/ntp/sources/README
# #
#h 9dac5845 8acd32c0 2947d462 daf4a943 f58d9391 #h be738595 57b0cf1b b0218343 fb77062f 5a775e7

View file

@ -1,4 +1,4 @@
# $OpenBSD: northamerica,v 1.86 2024/02/05 17:07:23 millert Exp $ # $OpenBSD: northamerica,v 1.87 2024/10/02 17:08:47 millert Exp $
# tzdb data for North and Central America and environs # tzdb data for North and Central America and environs
# This file is in the public domain, so clarified as of # This file is in the public domain, so clarified as of
@ -186,26 +186,6 @@ Rule US 1987 2006 - Apr Sun>=1 2:00 1:00 D
Rule US 2007 max - Mar Sun>=8 2:00 1:00 D Rule US 2007 max - Mar Sun>=8 2:00 1:00 D
Rule US 2007 max - Nov Sun>=1 2:00 0 S Rule US 2007 max - Nov Sun>=1 2:00 0 S
# From Arthur David Olson, 2005-12-19
# We generate the files specified below to guard against old files with
# obsolete information being left in the time zone binary directory.
# We limit the list to names that have appeared in previous versions of
# this time zone package.
# We do these as separate Zones rather than as Links to avoid problems if
# a particular place changes whether it observes DST.
# We put these specifications here in the northamerica file both to
# increase the chances that they'll actually get compiled and to
# avoid the need to duplicate the US rules in another file.
# Zone NAME STDOFF RULES FORMAT [UNTIL]
Zone EST -5:00 - EST
Zone MST -7:00 - MST
Zone HST -10:00 - HST
Zone EST5EDT -5:00 US E%sT
Zone CST6CDT -6:00 US C%sT
Zone MST7MDT -7:00 US M%sT
Zone PST8PDT -8:00 US P%sT
# From U. S. Naval Observatory (1989-01-19): # From U. S. Naval Observatory (1989-01-19):
# USA EASTERN 5 H BEHIND UTC NEW YORK, WASHINGTON # USA EASTERN 5 H BEHIND UTC NEW YORK, WASHINGTON
# USA EASTERN 4 H BEHIND UTC APR 3 - OCT 30 # USA EASTERN 4 H BEHIND UTC APR 3 - OCT 30
@ -2387,6 +2367,81 @@ Zone America/Dawson -9:17:40 - LMT 1900 Aug 20
# the researchers who prepared the Decrees page failed to find some of # the researchers who prepared the Decrees page failed to find some of
# the relevant documents. # the relevant documents.
# From Heitor David Pinto (2024-08-04):
# In 1931, the decree implementing DST specified that it would take
# effect on 30 April....
# https://www.dof.gob.mx/nota_to_imagen_fs.php?cod_diario=192270&pagina=2&seccion=1
#
# In 1981, the decree changing Campeche, Yucatán and Quintana Roo to UTC-5
# specified that it would enter into force on 26 December 1981 at 2:00....
# https://www.dof.gob.mx/nota_to_imagen_fs.php?codnota=4705667&fecha=23/12/1981&cod_diario=202796
#
# In 1982, the decree returning Campeche and Yucatán to UTC-6 specified that
# it would enter into force on 2 November 1982 at 2:00....
# https://www.dof.gob.mx/nota_to_imagen_fs.php?cod_diario=205689&pagina=3&seccion=0
#
# Quintana Roo changed to UTC-6 on 4 January 1983 at 0:00, and again
# to UTC-5 on 26 October 1997 at 2:00....
# https://www.dof.gob.mx/nota_to_imagen_fs.php?codnota=4787355&fecha=28/12/1982&cod_diario=206112
# https://www.dof.gob.mx/nota_to_imagen_fs.php?cod_diario=209559&pagina=15&seccion=0
#
# Durango, Coahuila, Nuevo León and Tamaulipas were set to UTC-7 on 1 January
# 1922, and changed to UTC-6 on 10 June 1927. Then Durango, Coahuila and
# Nuevo León (but not Tamaulipas) returned to UTC-7 on 15 November 1930,
# observed DST in 1931, and changed again to UTC-6 on 1 April 1932....
# https://www.dof.gob.mx/nota_to_imagen_fs.php?codnota=4441846&fecha=29/12/1921&cod_diario=187468
# https://www.dof.gob.mx/nota_to_imagen_fs.php?codnota=4541520&fecha=09/06/1927&cod_diario=193920
# https://www.dof.gob.mx/nota_to_imagen_fs.php?codnota=4491963&fecha=15/11/1930&cod_diario=190835
# https://www.dof.gob.mx/nota_to_imagen_fs.php?codnota=4418437&fecha=21/01/1932&cod_diario=185588
#
# ... the ... 10 June 1927 ... decree only said 10 June 1927, without
# specifying a time, so I suppose that it should be considered at 0:00.
# https://www.dof.gob.mx/nota_to_imagen_fs.php?codnota=4541520&fecha=09/06/1927&cod_diario=193920
#
# In 1942, the decree changing Baja California, Baja California Sur, Sonora,
# Sinaloa and Nayarit to UTC-7 was published on 24 April, but it said that it
# would apply from 1 April, so it's unclear when the change actually
# occurred. The database currently shows 24 April 1942.
# https://www.dof.gob.mx/nota_to_imagen_fs.php?cod_diario=192203&pagina=2&seccion=1
#
# Baja California Sur, Sonora, Sinaloa and Nayarit never used UTC-8. The ...
# 14 January 1949 ... change [to UTC-8] only occurred in Baja California.
# https://www.dof.gob.mx/nota_to_imagen_fs.php?codnota=4515613&fecha=13/01/1949&cod_diario=192309
#
# In 1945, the decree changing Baja California to UTC-8 specified that it
# would take effect on the third day from its publication.
# It was published on 12 November, so it would take effect on 15 November....
# https://www.dof.gob.mx/nota_to_imagen_fs.php?codnota=4555049&fecha=12/11/1945&cod_diario=194763
#
# In 1948, the decree changing Baja California to UTC-7 specified that it
# would take effect on "this date". The decree was made on 13 March,
# but published on 5 April, so it's unclear when the change actually occurred.
# The database currently shows 5 April 1948.
# https://www.dof.gob.mx/nota_to_imagen_fs.php?cod_diario=188624&pagina=2&seccion=0
#
# In 1949, the decree changing Baja California to UTC-8 was published on 13
# January, but it said that it would apply from 1 January, so it's unclear when
# the change actually occurred. The database currently shows 14 January 1949.
# https://www.dof.gob.mx/nota_to_imagen_fs.php?codnota=4515613&fecha=13/01/1949&cod_diario=192309
#
# Baja California also observed UTC-7 from 1 May to 24 September 1950,
# from 29 April to 30 September 1951 at 2:00,
# and from 27 April to 28 September 1952 at 2:00....
# https://www.dof.gob.mx/nota_to_imagen_fs.php?codnota=4600403&fecha=29/04/1950&cod_diario=197505
# https://www.dof.gob.mx/nota_to_imagen_fs.php?codnota=4623553&fecha=23/09/1950&cod_diario=198805
# https://www.dof.gob.mx/nota_to_imagen_fs.php?codnota=4469444&fecha=27/04/1951&cod_diario=189317
# https://www.dof.gob.mx/nota_to_imagen_fs.php?codnota=4533868&fecha=10/03/1952&cod_diario=193465
#
# All changes in Baja California from 1948 to 1952 match those in California,
# on the same dates or with a difference of one day.
# So it may be easier to implement these changes as DST with rule CA
# during this whole period.
#
# From Paul Eggert (2024-08-18):
# For now, maintain the slightly-different history for Baja California,
# as we have no information on whether 1948/1952 clocks in Tijuana followed
# the decrees or followed San Diego.
# From Alan Perry (1996-02-15): # From Alan Perry (1996-02-15):
# A guy from our Mexico subsidiary finally found the Presidential Decree # A guy from our Mexico subsidiary finally found the Presidential Decree
# outlining the timezone changes in Mexico. # outlining the timezone changes in Mexico.
@ -2590,7 +2645,7 @@ Zone America/Dawson -9:17:40 - LMT 1900 Aug 20
# http://puentelibre.mx/noticia/ciudad_juarez_cambio_horario_noviembre_2022/ # http://puentelibre.mx/noticia/ciudad_juarez_cambio_horario_noviembre_2022/
# Rule NAME FROM TO - IN ON AT SAVE LETTER/S # Rule NAME FROM TO - IN ON AT SAVE LETTER/S
Rule Mexico 1931 only - May 1 23:00 1:00 D Rule Mexico 1931 only - Apr 30 0:00 1:00 D
Rule Mexico 1931 only - Oct 1 0:00 0 S Rule Mexico 1931 only - Oct 1 0:00 0 S
Rule Mexico 1939 only - Feb 5 0:00 1:00 D Rule Mexico 1939 only - Feb 5 0:00 1:00 D
Rule Mexico 1939 only - Jun 25 0:00 0 S Rule Mexico 1939 only - Jun 25 0:00 0 S
@ -2609,14 +2664,16 @@ Rule Mexico 2002 2022 - Oct lastSun 2:00 0 S
# Zone NAME STDOFF RULES FORMAT [UNTIL] # Zone NAME STDOFF RULES FORMAT [UNTIL]
# Quintana Roo; represented by Cancún # Quintana Roo; represented by Cancún
Zone America/Cancun -5:47:04 - LMT 1922 Jan 1 6:00u Zone America/Cancun -5:47:04 - LMT 1922 Jan 1 6:00u
-6:00 - CST 1981 Dec 23 -6:00 - CST 1981 Dec 26 2:00
-5:00 - EST 1983 Jan 4 0:00
-6:00 Mexico C%sT 1997 Oct 26 2:00
-5:00 Mexico E%sT 1998 Aug 2 2:00 -5:00 Mexico E%sT 1998 Aug 2 2:00
-6:00 Mexico C%sT 2015 Feb 1 2:00 -6:00 Mexico C%sT 2015 Feb 1 2:00
-5:00 - EST -5:00 - EST
# Campeche, Yucatán; represented by Mérida # Campeche, Yucatán; represented by Mérida
Zone America/Merida -5:58:28 - LMT 1922 Jan 1 6:00u Zone America/Merida -5:58:28 - LMT 1922 Jan 1 6:00u
-6:00 - CST 1981 Dec 23 -6:00 - CST 1981 Dec 26 2:00
-5:00 - EST 1982 Dec 2 -5:00 - EST 1982 Nov 2 2:00
-6:00 Mexico C%sT -6:00 Mexico C%sT
# Coahuila, Nuevo León, Tamaulipas (near US border) # Coahuila, Nuevo León, Tamaulipas (near US border)
# This includes the following municipios: # This includes the following municipios:
@ -2633,12 +2690,15 @@ Zone America/Matamoros -6:30:00 - LMT 1922 Jan 1 6:00u
-6:00 US C%sT -6:00 US C%sT
# Durango; Coahuila, Nuevo León, Tamaulipas (away from US border) # Durango; Coahuila, Nuevo León, Tamaulipas (away from US border)
Zone America/Monterrey -6:41:16 - LMT 1922 Jan 1 6:00u Zone America/Monterrey -6:41:16 - LMT 1922 Jan 1 6:00u
-7:00 - MST 1927 Jun 10
-6:00 - CST 1930 Nov 15
-7:00 Mexico M%sT 1932 Apr 1
-6:00 - CST 1988 -6:00 - CST 1988
-6:00 US C%sT 1989 -6:00 US C%sT 1989
-6:00 Mexico C%sT -6:00 Mexico C%sT
# Central Mexico # Central Mexico
Zone America/Mexico_City -6:36:36 - LMT 1922 Jan 1 7:00u Zone America/Mexico_City -6:36:36 - LMT 1922 Jan 1 7:00u
-7:00 - MST 1927 Jun 10 23:00 -7:00 - MST 1927 Jun 10
-6:00 - CST 1930 Nov 15 -6:00 - CST 1930 Nov 15
-7:00 Mexico M%sT 1932 Apr 1 -7:00 Mexico M%sT 1932 Apr 1
-6:00 Mexico C%sT 2001 Sep 30 2:00 -6:00 Mexico C%sT 2001 Sep 30 2:00
@ -2649,7 +2709,7 @@ Zone America/Mexico_City -6:36:36 - LMT 1922 Jan 1 7:00u
# Práxedis G Guerrero. # Práxedis G Guerrero.
# http://gaceta.diputados.gob.mx/PDF/65/2a022/nov/20221124-VII.pdf # http://gaceta.diputados.gob.mx/PDF/65/2a022/nov/20221124-VII.pdf
Zone America/Ciudad_Juarez -7:05:56 - LMT 1922 Jan 1 7:00u Zone America/Ciudad_Juarez -7:05:56 - LMT 1922 Jan 1 7:00u
-7:00 - MST 1927 Jun 10 23:00 -7:00 - MST 1927 Jun 10
-6:00 - CST 1930 Nov 15 -6:00 - CST 1930 Nov 15
-7:00 Mexico M%sT 1932 Apr 1 -7:00 Mexico M%sT 1932 Apr 1
-6:00 - CST 1996 -6:00 - CST 1996
@ -2664,7 +2724,7 @@ Zone America/Ciudad_Juarez -7:05:56 - LMT 1922 Jan 1 7:00u
# Benavides. # Benavides.
# http://gaceta.diputados.gob.mx/PDF/65/2a022/nov/20221124-VII.pdf # http://gaceta.diputados.gob.mx/PDF/65/2a022/nov/20221124-VII.pdf
Zone America/Ojinaga -6:57:40 - LMT 1922 Jan 1 7:00u Zone America/Ojinaga -6:57:40 - LMT 1922 Jan 1 7:00u
-7:00 - MST 1927 Jun 10 23:00 -7:00 - MST 1927 Jun 10
-6:00 - CST 1930 Nov 15 -6:00 - CST 1930 Nov 15
-7:00 Mexico M%sT 1932 Apr 1 -7:00 Mexico M%sT 1932 Apr 1
-6:00 - CST 1996 -6:00 - CST 1996
@ -2676,7 +2736,7 @@ Zone America/Ojinaga -6:57:40 - LMT 1922 Jan 1 7:00u
-6:00 US C%sT -6:00 US C%sT
# Chihuahua (away from US border) # Chihuahua (away from US border)
Zone America/Chihuahua -7:04:20 - LMT 1922 Jan 1 7:00u Zone America/Chihuahua -7:04:20 - LMT 1922 Jan 1 7:00u
-7:00 - MST 1927 Jun 10 23:00 -7:00 - MST 1927 Jun 10
-6:00 - CST 1930 Nov 15 -6:00 - CST 1930 Nov 15
-7:00 Mexico M%sT 1932 Apr 1 -7:00 Mexico M%sT 1932 Apr 1
-6:00 - CST 1996 -6:00 - CST 1996
@ -2686,23 +2746,21 @@ Zone America/Chihuahua -7:04:20 - LMT 1922 Jan 1 7:00u
-6:00 - CST -6:00 - CST
# Sonora # Sonora
Zone America/Hermosillo -7:23:52 - LMT 1922 Jan 1 7:00u Zone America/Hermosillo -7:23:52 - LMT 1922 Jan 1 7:00u
-7:00 - MST 1927 Jun 10 23:00 -7:00 - MST 1927 Jun 10
-6:00 - CST 1930 Nov 15 -6:00 - CST 1930 Nov 15
-7:00 Mexico M%sT 1932 Apr 1 -7:00 Mexico M%sT 1932 Apr 1
-6:00 - CST 1942 Apr 24 -6:00 - CST 1942 Apr 24
-7:00 - MST 1949 Jan 14 -7:00 - MST 1996
-8:00 - PST 1970
-7:00 Mexico M%sT 1999 -7:00 Mexico M%sT 1999
-7:00 - MST -7:00 - MST
# Baja California Sur, Nayarit (except Bahía de Banderas), Sinaloa # Baja California Sur, Nayarit (except Bahía de Banderas), Sinaloa
Zone America/Mazatlan -7:05:40 - LMT 1922 Jan 1 7:00u Zone America/Mazatlan -7:05:40 - LMT 1922 Jan 1 7:00u
-7:00 - MST 1927 Jun 10 23:00 -7:00 - MST 1927 Jun 10
-6:00 - CST 1930 Nov 15 -6:00 - CST 1930 Nov 15
-7:00 Mexico M%sT 1932 Apr 1 -7:00 Mexico M%sT 1932 Apr 1
-6:00 - CST 1942 Apr 24 -6:00 - CST 1942 Apr 24
-7:00 - MST 1949 Jan 14 -7:00 - MST 1970
-8:00 - PST 1970
-7:00 Mexico M%sT -7:00 Mexico M%sT
# Bahía de Banderas # Bahía de Banderas
@ -2735,27 +2793,32 @@ Zone America/Mazatlan -7:05:40 - LMT 1922 Jan 1 7:00u
# Use "Bahia_Banderas" to keep the name to fourteen characters. # Use "Bahia_Banderas" to keep the name to fourteen characters.
Zone America/Bahia_Banderas -7:01:00 - LMT 1922 Jan 1 7:00u Zone America/Bahia_Banderas -7:01:00 - LMT 1922 Jan 1 7:00u
-7:00 - MST 1927 Jun 10 23:00 -7:00 - MST 1927 Jun 10
-6:00 - CST 1930 Nov 15 -6:00 - CST 1930 Nov 15
-7:00 Mexico M%sT 1932 Apr 1 -7:00 Mexico M%sT 1932 Apr 1
-6:00 - CST 1942 Apr 24 -6:00 - CST 1942 Apr 24
-7:00 - MST 1949 Jan 14 -7:00 - MST 1970
-8:00 - PST 1970
-7:00 Mexico M%sT 2010 Apr 4 2:00 -7:00 Mexico M%sT 2010 Apr 4 2:00
-6:00 Mexico C%sT -6:00 Mexico C%sT
# Baja California # Baja California
Zone America/Tijuana -7:48:04 - LMT 1922 Jan 1 7:00u Zone America/Tijuana -7:48:04 - LMT 1922 Jan 1 7:00u
-7:00 - MST 1924 -7:00 - MST 1924
-8:00 - PST 1927 Jun 10 23:00 -8:00 - PST 1927 Jun 10
-7:00 - MST 1930 Nov 15 -7:00 - MST 1930 Nov 15
-8:00 - PST 1931 Apr 1 -8:00 - PST 1931 Apr 1
-8:00 1:00 PDT 1931 Sep 30 -8:00 1:00 PDT 1931 Sep 30
-8:00 - PST 1942 Apr 24 -8:00 - PST 1942 Apr 24
-8:00 1:00 PWT 1945 Aug 14 23:00u -8:00 1:00 PWT 1945 Aug 14 23:00u
-8:00 1:00 PPT 1945 Nov 12 # Peace -8:00 1:00 PPT 1945 Nov 15 # Peace
-8:00 - PST 1948 Apr 5 -8:00 - PST 1948 Apr 5
-8:00 1:00 PDT 1949 Jan 14 -8:00 1:00 PDT 1949 Jan 14
-8:00 - PST 1950 May 1
-8:00 1:00 PDT 1950 Sep 24
-8:00 - PST 1951 Apr 29 2:00
-8:00 1:00 PDT 1951 Sep 30 2:00
-8:00 - PST 1952 Apr 27 2:00
-8:00 1:00 PDT 1952 Sep 28 2:00
-8:00 - PST 1954 -8:00 - PST 1954
-8:00 CA P%sT 1961 -8:00 CA P%sT 1961
-8:00 - PST 1976 -8:00 - PST 1976
@ -3616,8 +3679,8 @@ Zone America/St_Lucia -4:04:00 - LMT 1890 # Castries
# Zone NAME STDOFF RULES FORMAT [UNTIL] # Zone NAME STDOFF RULES FORMAT [UNTIL]
Zone America/Miquelon -3:44:40 - LMT 1911 Jun 15 # St Pierre Zone America/Miquelon -3:44:40 - LMT 1911 Jun 15 # St Pierre
-4:00 - AST 1980 May -4:00 - AST 1980 May
-3:00 - -03 1987 -3:00 - %z 1987
-3:00 Canada -03/-02 -3:00 Canada %z
# St Vincent & the Grenadines # St Vincent & the Grenadines
# Zone NAME STDOFF RULES FORMAT [UNTIL] # Zone NAME STDOFF RULES FORMAT [UNTIL]

View file

@ -1,4 +1,4 @@
# $OpenBSD: southamerica,v 1.81 2024/02/05 17:07:23 millert Exp $ # $OpenBSD: southamerica,v 1.82 2024/10/02 17:08:47 millert Exp $
# tzdb data for South America and environs # tzdb data for South America and environs
# This file is in the public domain, so clarified as of # This file is in the public domain, so clarified as of
@ -403,11 +403,11 @@ Rule Arg 2008 only - Oct Sun>=15 0:00 1:00 -
Zone America/Argentina/Buenos_Aires -3:53:48 - LMT 1894 Oct 31 Zone America/Argentina/Buenos_Aires -3:53:48 - LMT 1894 Oct 31
#STDOFF -4:16:48.25 #STDOFF -4:16:48.25
-4:16:48 - CMT 1920 May # Córdoba Mean Time -4:16:48 - CMT 1920 May # Córdoba Mean Time
-4:00 - -04 1930 Dec -4:00 - %z 1930 Dec
-4:00 Arg -04/-03 1969 Oct 5 -4:00 Arg %z 1969 Oct 5
-3:00 Arg -03/-02 1999 Oct 3 -3:00 Arg %z 1999 Oct 3
-4:00 Arg -04/-03 2000 Mar 3 -4:00 Arg %z 2000 Mar 3
-3:00 Arg -03/-02 -3:00 Arg %z
# #
# Córdoba (CB), Santa Fe (SF), Entre Ríos (ER), Corrientes (CN), Misiones (MN), # Córdoba (CB), Santa Fe (SF), Entre Ríos (ER), Corrientes (CN), Misiones (MN),
# Chaco (CC), Formosa (FM), Santiago del Estero (SE) # Chaco (CC), Formosa (FM), Santiago del Estero (SE)
@ -422,120 +422,120 @@ Zone America/Argentina/Buenos_Aires -3:53:48 - LMT 1894 Oct 31
#STDOFF -4:16:48.25 #STDOFF -4:16:48.25
Zone America/Argentina/Cordoba -4:16:48 - LMT 1894 Oct 31 Zone America/Argentina/Cordoba -4:16:48 - LMT 1894 Oct 31
-4:16:48 - CMT 1920 May -4:16:48 - CMT 1920 May
-4:00 - -04 1930 Dec -4:00 - %z 1930 Dec
-4:00 Arg -04/-03 1969 Oct 5 -4:00 Arg %z 1969 Oct 5
-3:00 Arg -03/-02 1991 Mar 3 -3:00 Arg %z 1991 Mar 3
-4:00 - -04 1991 Oct 20 -4:00 - %z 1991 Oct 20
-3:00 Arg -03/-02 1999 Oct 3 -3:00 Arg %z 1999 Oct 3
-4:00 Arg -04/-03 2000 Mar 3 -4:00 Arg %z 2000 Mar 3
-3:00 Arg -03/-02 -3:00 Arg %z
# #
# Salta (SA), La Pampa (LP), Neuquén (NQ), Rio Negro (RN) # Salta (SA), La Pampa (LP), Neuquén (NQ), Rio Negro (RN)
Zone America/Argentina/Salta -4:21:40 - LMT 1894 Oct 31 Zone America/Argentina/Salta -4:21:40 - LMT 1894 Oct 31
#STDOFF -4:16:48.25 #STDOFF -4:16:48.25
-4:16:48 - CMT 1920 May -4:16:48 - CMT 1920 May
-4:00 - -04 1930 Dec -4:00 - %z 1930 Dec
-4:00 Arg -04/-03 1969 Oct 5 -4:00 Arg %z 1969 Oct 5
-3:00 Arg -03/-02 1991 Mar 3 -3:00 Arg %z 1991 Mar 3
-4:00 - -04 1991 Oct 20 -4:00 - %z 1991 Oct 20
-3:00 Arg -03/-02 1999 Oct 3 -3:00 Arg %z 1999 Oct 3
-4:00 Arg -04/-03 2000 Mar 3 -4:00 Arg %z 2000 Mar 3
-3:00 Arg -03/-02 2008 Oct 18 -3:00 Arg %z 2008 Oct 18
-3:00 - -03 -3:00 - %z
# #
# Tucumán (TM) # Tucumán (TM)
Zone America/Argentina/Tucuman -4:20:52 - LMT 1894 Oct 31 Zone America/Argentina/Tucuman -4:20:52 - LMT 1894 Oct 31
#STDOFF -4:16:48.25 #STDOFF -4:16:48.25
-4:16:48 - CMT 1920 May -4:16:48 - CMT 1920 May
-4:00 - -04 1930 Dec -4:00 - %z 1930 Dec
-4:00 Arg -04/-03 1969 Oct 5 -4:00 Arg %z 1969 Oct 5
-3:00 Arg -03/-02 1991 Mar 3 -3:00 Arg %z 1991 Mar 3
-4:00 - -04 1991 Oct 20 -4:00 - %z 1991 Oct 20
-3:00 Arg -03/-02 1999 Oct 3 -3:00 Arg %z 1999 Oct 3
-4:00 Arg -04/-03 2000 Mar 3 -4:00 Arg %z 2000 Mar 3
-3:00 - -03 2004 Jun 1 -3:00 - %z 2004 Jun 1
-4:00 - -04 2004 Jun 13 -4:00 - %z 2004 Jun 13
-3:00 Arg -03/-02 -3:00 Arg %z
# #
# La Rioja (LR) # La Rioja (LR)
Zone America/Argentina/La_Rioja -4:27:24 - LMT 1894 Oct 31 Zone America/Argentina/La_Rioja -4:27:24 - LMT 1894 Oct 31
#STDOFF -4:16:48.25 #STDOFF -4:16:48.25
-4:16:48 - CMT 1920 May -4:16:48 - CMT 1920 May
-4:00 - -04 1930 Dec -4:00 - %z 1930 Dec
-4:00 Arg -04/-03 1969 Oct 5 -4:00 Arg %z 1969 Oct 5
-3:00 Arg -03/-02 1991 Mar 1 -3:00 Arg %z 1991 Mar 1
-4:00 - -04 1991 May 7 -4:00 - %z 1991 May 7
-3:00 Arg -03/-02 1999 Oct 3 -3:00 Arg %z 1999 Oct 3
-4:00 Arg -04/-03 2000 Mar 3 -4:00 Arg %z 2000 Mar 3
-3:00 - -03 2004 Jun 1 -3:00 - %z 2004 Jun 1
-4:00 - -04 2004 Jun 20 -4:00 - %z 2004 Jun 20
-3:00 Arg -03/-02 2008 Oct 18 -3:00 Arg %z 2008 Oct 18
-3:00 - -03 -3:00 - %z
# #
# San Juan (SJ) # San Juan (SJ)
Zone America/Argentina/San_Juan -4:34:04 - LMT 1894 Oct 31 Zone America/Argentina/San_Juan -4:34:04 - LMT 1894 Oct 31
#STDOFF -4:16:48.25 #STDOFF -4:16:48.25
-4:16:48 - CMT 1920 May -4:16:48 - CMT 1920 May
-4:00 - -04 1930 Dec -4:00 - %z 1930 Dec
-4:00 Arg -04/-03 1969 Oct 5 -4:00 Arg %z 1969 Oct 5
-3:00 Arg -03/-02 1991 Mar 1 -3:00 Arg %z 1991 Mar 1
-4:00 - -04 1991 May 7 -4:00 - %z 1991 May 7
-3:00 Arg -03/-02 1999 Oct 3 -3:00 Arg %z 1999 Oct 3
-4:00 Arg -04/-03 2000 Mar 3 -4:00 Arg %z 2000 Mar 3
-3:00 - -03 2004 May 31 -3:00 - %z 2004 May 31
-4:00 - -04 2004 Jul 25 -4:00 - %z 2004 Jul 25
-3:00 Arg -03/-02 2008 Oct 18 -3:00 Arg %z 2008 Oct 18
-3:00 - -03 -3:00 - %z
# #
# Jujuy (JY) # Jujuy (JY)
Zone America/Argentina/Jujuy -4:21:12 - LMT 1894 Oct 31 Zone America/Argentina/Jujuy -4:21:12 - LMT 1894 Oct 31
#STDOFF -4:16:48.25 #STDOFF -4:16:48.25
-4:16:48 - CMT 1920 May -4:16:48 - CMT 1920 May
-4:00 - -04 1930 Dec -4:00 - %z 1930 Dec
-4:00 Arg -04/-03 1969 Oct 5 -4:00 Arg %z 1969 Oct 5
-3:00 Arg -03/-02 1990 Mar 4 -3:00 Arg %z 1990 Mar 4
-4:00 - -04 1990 Oct 28 -4:00 - %z 1990 Oct 28
-4:00 1:00 -03 1991 Mar 17 -4:00 1:00 %z 1991 Mar 17
-4:00 - -04 1991 Oct 6 -4:00 - %z 1991 Oct 6
-3:00 1:00 -02 1992 -3:00 1:00 %z 1992
-3:00 Arg -03/-02 1999 Oct 3 -3:00 Arg %z 1999 Oct 3
-4:00 Arg -04/-03 2000 Mar 3 -4:00 Arg %z 2000 Mar 3
-3:00 Arg -03/-02 2008 Oct 18 -3:00 Arg %z 2008 Oct 18
-3:00 - -03 -3:00 - %z
# #
# Catamarca (CT), Chubut (CH) # Catamarca (CT), Chubut (CH)
Zone America/Argentina/Catamarca -4:23:08 - LMT 1894 Oct 31 Zone America/Argentina/Catamarca -4:23:08 - LMT 1894 Oct 31
#STDOFF -4:16:48.25 #STDOFF -4:16:48.25
-4:16:48 - CMT 1920 May -4:16:48 - CMT 1920 May
-4:00 - -04 1930 Dec -4:00 - %z 1930 Dec
-4:00 Arg -04/-03 1969 Oct 5 -4:00 Arg %z 1969 Oct 5
-3:00 Arg -03/-02 1991 Mar 3 -3:00 Arg %z 1991 Mar 3
-4:00 - -04 1991 Oct 20 -4:00 - %z 1991 Oct 20
-3:00 Arg -03/-02 1999 Oct 3 -3:00 Arg %z 1999 Oct 3
-4:00 Arg -04/-03 2000 Mar 3 -4:00 Arg %z 2000 Mar 3
-3:00 - -03 2004 Jun 1 -3:00 - %z 2004 Jun 1
-4:00 - -04 2004 Jun 20 -4:00 - %z 2004 Jun 20
-3:00 Arg -03/-02 2008 Oct 18 -3:00 Arg %z 2008 Oct 18
-3:00 - -03 -3:00 - %z
# #
# Mendoza (MZ) # Mendoza (MZ)
Zone America/Argentina/Mendoza -4:35:16 - LMT 1894 Oct 31 Zone America/Argentina/Mendoza -4:35:16 - LMT 1894 Oct 31
#STDOFF -4:16:48.25 #STDOFF -4:16:48.25
-4:16:48 - CMT 1920 May -4:16:48 - CMT 1920 May
-4:00 - -04 1930 Dec -4:00 - %z 1930 Dec
-4:00 Arg -04/-03 1969 Oct 5 -4:00 Arg %z 1969 Oct 5
-3:00 Arg -03/-02 1990 Mar 4 -3:00 Arg %z 1990 Mar 4
-4:00 - -04 1990 Oct 15 -4:00 - %z 1990 Oct 15
-4:00 1:00 -03 1991 Mar 1 -4:00 1:00 %z 1991 Mar 1
-4:00 - -04 1991 Oct 15 -4:00 - %z 1991 Oct 15
-4:00 1:00 -03 1992 Mar 1 -4:00 1:00 %z 1992 Mar 1
-4:00 - -04 1992 Oct 18 -4:00 - %z 1992 Oct 18
-3:00 Arg -03/-02 1999 Oct 3 -3:00 Arg %z 1999 Oct 3
-4:00 Arg -04/-03 2000 Mar 3 -4:00 Arg %z 2000 Mar 3
-3:00 - -03 2004 May 23 -3:00 - %z 2004 May 23
-4:00 - -04 2004 Sep 26 -4:00 - %z 2004 Sep 26
-3:00 Arg -03/-02 2008 Oct 18 -3:00 Arg %z 2008 Oct 18
-3:00 - -03 -3:00 - %z
# #
# San Luis (SL) # San Luis (SL)
@ -545,46 +545,46 @@ Rule SanLuis 2007 2008 - Oct Sun>=8 0:00 1:00 -
Zone America/Argentina/San_Luis -4:25:24 - LMT 1894 Oct 31 Zone America/Argentina/San_Luis -4:25:24 - LMT 1894 Oct 31
#STDOFF -4:16:48.25 #STDOFF -4:16:48.25
-4:16:48 - CMT 1920 May -4:16:48 - CMT 1920 May
-4:00 - -04 1930 Dec -4:00 - %z 1930 Dec
-4:00 Arg -04/-03 1969 Oct 5 -4:00 Arg %z 1969 Oct 5
-3:00 Arg -03/-02 1990 -3:00 Arg %z 1990
-3:00 1:00 -02 1990 Mar 14 -3:00 1:00 %z 1990 Mar 14
-4:00 - -04 1990 Oct 15 -4:00 - %z 1990 Oct 15
-4:00 1:00 -03 1991 Mar 1 -4:00 1:00 %z 1991 Mar 1
-4:00 - -04 1991 Jun 1 -4:00 - %z 1991 Jun 1
-3:00 - -03 1999 Oct 3 -3:00 - %z 1999 Oct 3
-4:00 1:00 -03 2000 Mar 3 -4:00 1:00 %z 2000 Mar 3
-3:00 - -03 2004 May 31 -3:00 - %z 2004 May 31
-4:00 - -04 2004 Jul 25 -4:00 - %z 2004 Jul 25
-3:00 Arg -03/-02 2008 Jan 21 -3:00 Arg %z 2008 Jan 21
-4:00 SanLuis -04/-03 2009 Oct 11 -4:00 SanLuis %z 2009 Oct 11
-3:00 - -03 -3:00 - %z
# #
# Santa Cruz (SC) # Santa Cruz (SC)
Zone America/Argentina/Rio_Gallegos -4:36:52 - LMT 1894 Oct 31 Zone America/Argentina/Rio_Gallegos -4:36:52 - LMT 1894 Oct 31
#STDOFF -4:16:48.25 #STDOFF -4:16:48.25
-4:16:48 - CMT 1920 May -4:16:48 - CMT 1920 May
-4:00 - -04 1930 Dec -4:00 - %z 1930 Dec
-4:00 Arg -04/-03 1969 Oct 5 -4:00 Arg %z 1969 Oct 5
-3:00 Arg -03/-02 1999 Oct 3 -3:00 Arg %z 1999 Oct 3
-4:00 Arg -04/-03 2000 Mar 3 -4:00 Arg %z 2000 Mar 3
-3:00 - -03 2004 Jun 1 -3:00 - %z 2004 Jun 1
-4:00 - -04 2004 Jun 20 -4:00 - %z 2004 Jun 20
-3:00 Arg -03/-02 2008 Oct 18 -3:00 Arg %z 2008 Oct 18
-3:00 - -03 -3:00 - %z
# #
# Tierra del Fuego, Antártida e Islas del Atlántico Sur (TF) # Tierra del Fuego, Antártida e Islas del Atlántico Sur (TF)
Zone America/Argentina/Ushuaia -4:33:12 - LMT 1894 Oct 31 Zone America/Argentina/Ushuaia -4:33:12 - LMT 1894 Oct 31
#STDOFF -4:16:48.25 #STDOFF -4:16:48.25
-4:16:48 - CMT 1920 May -4:16:48 - CMT 1920 May
-4:00 - -04 1930 Dec -4:00 - %z 1930 Dec
-4:00 Arg -04/-03 1969 Oct 5 -4:00 Arg %z 1969 Oct 5
-3:00 Arg -03/-02 1999 Oct 3 -3:00 Arg %z 1999 Oct 3
-4:00 Arg -04/-03 2000 Mar 3 -4:00 Arg %z 2000 Mar 3
-3:00 - -03 2004 May 30 -3:00 - %z 2004 May 30
-4:00 - -04 2004 Jun 20 -4:00 - %z 2004 Jun 20
-3:00 Arg -03/-02 2008 Oct 18 -3:00 Arg %z 2008 Oct 18
-3:00 - -03 -3:00 - %z
# Aruba # Aruba
# Zone NAME STDOFF RULES FORMAT [UNTIL] # Zone NAME STDOFF RULES FORMAT [UNTIL]
@ -597,7 +597,7 @@ Zone America/Aruba -4:40:24 - LMT 1912 Feb 12 # Oranjestad
Zone America/La_Paz -4:32:36 - LMT 1890 Zone America/La_Paz -4:32:36 - LMT 1890
-4:32:36 - CMT 1931 Oct 15 # Calamarca MT -4:32:36 - CMT 1931 Oct 15 # Calamarca MT
-4:32:36 1:00 BST 1932 Mar 21 # Bolivia ST -4:32:36 1:00 BST 1932 Mar 21 # Bolivia ST
-4:00 - -04 -4:00 - %z
# Brazil # Brazil
@ -968,12 +968,12 @@ Rule Brazil 2018 only - Nov Sun>=1 0:00 1:00 -
# #
# Fernando de Noronha (administratively part of PE) # Fernando de Noronha (administratively part of PE)
Zone America/Noronha -2:09:40 - LMT 1914 Zone America/Noronha -2:09:40 - LMT 1914
-2:00 Brazil -02/-01 1990 Sep 17 -2:00 Brazil %z 1990 Sep 17
-2:00 - -02 1999 Sep 30 -2:00 - %z 1999 Sep 30
-2:00 Brazil -02/-01 2000 Oct 15 -2:00 Brazil %z 2000 Oct 15
-2:00 - -02 2001 Sep 13 -2:00 - %z 2001 Sep 13
-2:00 Brazil -02/-01 2002 Oct 1 -2:00 Brazil %z 2002 Oct 1
-2:00 - -02 -2:00 - %z
# Other Atlantic islands have no permanent settlement. # Other Atlantic islands have no permanent settlement.
# These include Trindade and Martim Vaz (administratively part of ES), # These include Trindade and Martim Vaz (administratively part of ES),
# Rocas Atoll (RN), and the St Peter and St Paul Archipelago (PE). # Rocas Atoll (RN), and the St Peter and St Paul Archipelago (PE).
@ -986,119 +986,119 @@ Zone America/Noronha -2:09:40 - LMT 1914
# In the north a very small part from the river Javary (now Jari I guess, # In the north a very small part from the river Javary (now Jari I guess,
# the border with Amapá) to the Amazon, then to the Xingu. # the border with Amapá) to the Amazon, then to the Xingu.
Zone America/Belem -3:13:56 - LMT 1914 Zone America/Belem -3:13:56 - LMT 1914
-3:00 Brazil -03/-02 1988 Sep 12 -3:00 Brazil %z 1988 Sep 12
-3:00 - -03 -3:00 - %z
# #
# west Pará (PA) # west Pará (PA)
# West Pará includes Altamira, Óbidos, Prainha, Oriximiná, and Santarém. # West Pará includes Altamira, Óbidos, Prainha, Oriximiná, and Santarém.
Zone America/Santarem -3:38:48 - LMT 1914 Zone America/Santarem -3:38:48 - LMT 1914
-4:00 Brazil -04/-03 1988 Sep 12 -4:00 Brazil %z 1988 Sep 12
-4:00 - -04 2008 Jun 24 0:00 -4:00 - %z 2008 Jun 24 0:00
-3:00 - -03 -3:00 - %z
# #
# Maranhão (MA), Piauí (PI), Ceará (CE), Rio Grande do Norte (RN), # Maranhão (MA), Piauí (PI), Ceará (CE), Rio Grande do Norte (RN),
# Paraíba (PB) # Paraíba (PB)
Zone America/Fortaleza -2:34:00 - LMT 1914 Zone America/Fortaleza -2:34:00 - LMT 1914
-3:00 Brazil -03/-02 1990 Sep 17 -3:00 Brazil %z 1990 Sep 17
-3:00 - -03 1999 Sep 30 -3:00 - %z 1999 Sep 30
-3:00 Brazil -03/-02 2000 Oct 22 -3:00 Brazil %z 2000 Oct 22
-3:00 - -03 2001 Sep 13 -3:00 - %z 2001 Sep 13
-3:00 Brazil -03/-02 2002 Oct 1 -3:00 Brazil %z 2002 Oct 1
-3:00 - -03 -3:00 - %z
# #
# Pernambuco (PE) (except Atlantic islands) # Pernambuco (PE) (except Atlantic islands)
Zone America/Recife -2:19:36 - LMT 1914 Zone America/Recife -2:19:36 - LMT 1914
-3:00 Brazil -03/-02 1990 Sep 17 -3:00 Brazil %z 1990 Sep 17
-3:00 - -03 1999 Sep 30 -3:00 - %z 1999 Sep 30
-3:00 Brazil -03/-02 2000 Oct 15 -3:00 Brazil %z 2000 Oct 15
-3:00 - -03 2001 Sep 13 -3:00 - %z 2001 Sep 13
-3:00 Brazil -03/-02 2002 Oct 1 -3:00 Brazil %z 2002 Oct 1
-3:00 - -03 -3:00 - %z
# #
# Tocantins (TO) # Tocantins (TO)
Zone America/Araguaina -3:12:48 - LMT 1914 Zone America/Araguaina -3:12:48 - LMT 1914
-3:00 Brazil -03/-02 1990 Sep 17 -3:00 Brazil %z 1990 Sep 17
-3:00 - -03 1995 Sep 14 -3:00 - %z 1995 Sep 14
-3:00 Brazil -03/-02 2003 Sep 24 -3:00 Brazil %z 2003 Sep 24
-3:00 - -03 2012 Oct 21 -3:00 - %z 2012 Oct 21
-3:00 Brazil -03/-02 2013 Sep -3:00 Brazil %z 2013 Sep
-3:00 - -03 -3:00 - %z
# #
# Alagoas (AL), Sergipe (SE) # Alagoas (AL), Sergipe (SE)
Zone America/Maceio -2:22:52 - LMT 1914 Zone America/Maceio -2:22:52 - LMT 1914
-3:00 Brazil -03/-02 1990 Sep 17 -3:00 Brazil %z 1990 Sep 17
-3:00 - -03 1995 Oct 13 -3:00 - %z 1995 Oct 13
-3:00 Brazil -03/-02 1996 Sep 4 -3:00 Brazil %z 1996 Sep 4
-3:00 - -03 1999 Sep 30 -3:00 - %z 1999 Sep 30
-3:00 Brazil -03/-02 2000 Oct 22 -3:00 Brazil %z 2000 Oct 22
-3:00 - -03 2001 Sep 13 -3:00 - %z 2001 Sep 13
-3:00 Brazil -03/-02 2002 Oct 1 -3:00 Brazil %z 2002 Oct 1
-3:00 - -03 -3:00 - %z
# #
# Bahia (BA) # Bahia (BA)
# There are too many Salvadors elsewhere, so use America/Bahia instead # There are too many Salvadors elsewhere, so use America/Bahia instead
# of America/Salvador. # of America/Salvador.
Zone America/Bahia -2:34:04 - LMT 1914 Zone America/Bahia -2:34:04 - LMT 1914
-3:00 Brazil -03/-02 2003 Sep 24 -3:00 Brazil %z 2003 Sep 24
-3:00 - -03 2011 Oct 16 -3:00 - %z 2011 Oct 16
-3:00 Brazil -03/-02 2012 Oct 21 -3:00 Brazil %z 2012 Oct 21
-3:00 - -03 -3:00 - %z
# #
# Goiás (GO), Distrito Federal (DF), Minas Gerais (MG), # Goiás (GO), Distrito Federal (DF), Minas Gerais (MG),
# Espírito Santo (ES), Rio de Janeiro (RJ), São Paulo (SP), Paraná (PR), # Espírito Santo (ES), Rio de Janeiro (RJ), São Paulo (SP), Paraná (PR),
# Santa Catarina (SC), Rio Grande do Sul (RS) # Santa Catarina (SC), Rio Grande do Sul (RS)
Zone America/Sao_Paulo -3:06:28 - LMT 1914 Zone America/Sao_Paulo -3:06:28 - LMT 1914
-3:00 Brazil -03/-02 1963 Oct 23 0:00 -3:00 Brazil %z 1963 Oct 23 0:00
-3:00 1:00 -02 1964 -3:00 1:00 %z 1964
-3:00 Brazil -03/-02 -3:00 Brazil %z
# #
# Mato Grosso do Sul (MS) # Mato Grosso do Sul (MS)
Zone America/Campo_Grande -3:38:28 - LMT 1914 Zone America/Campo_Grande -3:38:28 - LMT 1914
-4:00 Brazil -04/-03 -4:00 Brazil %z
# #
# Mato Grosso (MT) # Mato Grosso (MT)
Zone America/Cuiaba -3:44:20 - LMT 1914 Zone America/Cuiaba -3:44:20 - LMT 1914
-4:00 Brazil -04/-03 2003 Sep 24 -4:00 Brazil %z 2003 Sep 24
-4:00 - -04 2004 Oct 1 -4:00 - %z 2004 Oct 1
-4:00 Brazil -04/-03 -4:00 Brazil %z
# #
# Rondônia (RO) # Rondônia (RO)
Zone America/Porto_Velho -4:15:36 - LMT 1914 Zone America/Porto_Velho -4:15:36 - LMT 1914
-4:00 Brazil -04/-03 1988 Sep 12 -4:00 Brazil %z 1988 Sep 12
-4:00 - -04 -4:00 - %z
# #
# Roraima (RR) # Roraima (RR)
Zone America/Boa_Vista -4:02:40 - LMT 1914 Zone America/Boa_Vista -4:02:40 - LMT 1914
-4:00 Brazil -04/-03 1988 Sep 12 -4:00 Brazil %z 1988 Sep 12
-4:00 - -04 1999 Sep 30 -4:00 - %z 1999 Sep 30
-4:00 Brazil -04/-03 2000 Oct 15 -4:00 Brazil %z 2000 Oct 15
-4:00 - -04 -4:00 - %z
# #
# east Amazonas (AM): Boca do Acre, Jutaí, Manaus, Floriano Peixoto # east Amazonas (AM): Boca do Acre, Jutaí, Manaus, Floriano Peixoto
# The great circle line from Tabatinga to Porto Acre divides # The great circle line from Tabatinga to Porto Acre divides
# east from west Amazonas. # east from west Amazonas.
Zone America/Manaus -4:00:04 - LMT 1914 Zone America/Manaus -4:00:04 - LMT 1914
-4:00 Brazil -04/-03 1988 Sep 12 -4:00 Brazil %z 1988 Sep 12
-4:00 - -04 1993 Sep 28 -4:00 - %z 1993 Sep 28
-4:00 Brazil -04/-03 1994 Sep 22 -4:00 Brazil %z 1994 Sep 22
-4:00 - -04 -4:00 - %z
# #
# west Amazonas (AM): Atalaia do Norte, Boca do Maoco, Benjamin Constant, # west Amazonas (AM): Atalaia do Norte, Boca do Maoco, Benjamin Constant,
# Eirunepé, Envira, Ipixuna # Eirunepé, Envira, Ipixuna
Zone America/Eirunepe -4:39:28 - LMT 1914 Zone America/Eirunepe -4:39:28 - LMT 1914
-5:00 Brazil -05/-04 1988 Sep 12 -5:00 Brazil %z 1988 Sep 12
-5:00 - -05 1993 Sep 28 -5:00 - %z 1993 Sep 28
-5:00 Brazil -05/-04 1994 Sep 22 -5:00 Brazil %z 1994 Sep 22
-5:00 - -05 2008 Jun 24 0:00 -5:00 - %z 2008 Jun 24 0:00
-4:00 - -04 2013 Nov 10 -4:00 - %z 2013 Nov 10
-5:00 - -05 -5:00 - %z
# #
# Acre (AC) # Acre (AC)
Zone America/Rio_Branco -4:31:12 - LMT 1914 Zone America/Rio_Branco -4:31:12 - LMT 1914
-5:00 Brazil -05/-04 1988 Sep 12 -5:00 Brazil %z 1988 Sep 12
-5:00 - -05 2008 Jun 24 0:00 -5:00 - %z 2008 Jun 24 0:00
-4:00 - -04 2013 Nov 10 -4:00 - %z 2013 Nov 10
-5:00 - -05 -5:00 - %z
# Chile # Chile
@ -1366,36 +1366,36 @@ Rule Chile 2023 max - Sep Sun>=2 4:00u 1:00 -
# Zone NAME STDOFF RULES FORMAT [UNTIL] # Zone NAME STDOFF RULES FORMAT [UNTIL]
Zone America/Santiago -4:42:45 - LMT 1890 Zone America/Santiago -4:42:45 - LMT 1890
-4:42:45 - SMT 1910 Jan 10 # Santiago Mean Time -4:42:45 - SMT 1910 Jan 10 # Santiago Mean Time
-5:00 - -05 1916 Jul 1 -5:00 - %z 1916 Jul 1
-4:42:45 - SMT 1918 Sep 10 -4:42:45 - SMT 1918 Sep 10
-4:00 - -04 1919 Jul 1 -4:00 - %z 1919 Jul 1
-4:42:45 - SMT 1927 Sep 1 -4:42:45 - SMT 1927 Sep 1
-5:00 Chile -05/-04 1932 Sep 1 -5:00 Chile %z 1932 Sep 1
-4:00 - -04 1942 Jun 1 -4:00 - %z 1942 Jun 1
-5:00 - -05 1942 Aug 1 -5:00 - %z 1942 Aug 1
-4:00 - -04 1946 Jul 14 24:00 -4:00 - %z 1946 Jul 14 24:00
-4:00 1:00 -03 1946 Aug 28 24:00 # central CL -4:00 1:00 %z 1946 Aug 28 24:00 # central CL
-5:00 1:00 -04 1947 Mar 31 24:00 -5:00 1:00 %z 1947 Mar 31 24:00
-5:00 - -05 1947 May 21 23:00 -5:00 - %z 1947 May 21 23:00
-4:00 Chile -04/-03 -4:00 Chile %z
Zone America/Punta_Arenas -4:43:40 - LMT 1890 Zone America/Punta_Arenas -4:43:40 - LMT 1890
-4:42:45 - SMT 1910 Jan 10 -4:42:45 - SMT 1910 Jan 10
-5:00 - -05 1916 Jul 1 -5:00 - %z 1916 Jul 1
-4:42:45 - SMT 1918 Sep 10 -4:42:45 - SMT 1918 Sep 10
-4:00 - -04 1919 Jul 1 -4:00 - %z 1919 Jul 1
-4:42:45 - SMT 1927 Sep 1 -4:42:45 - SMT 1927 Sep 1
-5:00 Chile -05/-04 1932 Sep 1 -5:00 Chile %z 1932 Sep 1
-4:00 - -04 1942 Jun 1 -4:00 - %z 1942 Jun 1
-5:00 - -05 1942 Aug 1 -5:00 - %z 1942 Aug 1
-4:00 - -04 1946 Aug 28 24:00 -4:00 - %z 1946 Aug 28 24:00
-5:00 1:00 -04 1947 Mar 31 24:00 -5:00 1:00 %z 1947 Mar 31 24:00
-5:00 - -05 1947 May 21 23:00 -5:00 - %z 1947 May 21 23:00
-4:00 Chile -04/-03 2016 Dec 4 -4:00 Chile %z 2016 Dec 4
-3:00 - -03 -3:00 - %z
Zone Pacific/Easter -7:17:28 - LMT 1890 Zone Pacific/Easter -7:17:28 - LMT 1890
-7:17:28 - EMT 1932 Sep # Easter Mean Time -7:17:28 - EMT 1932 Sep # Easter Mean Time
-7:00 Chile -07/-06 1982 Mar 14 3:00u # Easter Time -7:00 Chile %z 1982 Mar 14 3:00u # Easter Time
-6:00 Chile -06/-05 -6:00 Chile %z
# #
# Salas y Gómez Island is uninhabited. # Salas y Gómez Island is uninhabited.
# Other Chilean locations, including Juan Fernández Is, Desventuradas Is, # Other Chilean locations, including Juan Fernández Is, Desventuradas Is,
@ -1415,10 +1415,10 @@ Zone Pacific/Easter -7:17:28 - LMT 1890
# #
# Zone NAME STDOFF RULES FORMAT [UNTIL] # Zone NAME STDOFF RULES FORMAT [UNTIL]
Zone Antarctica/Palmer 0 - -00 1965 Zone Antarctica/Palmer 0 - -00 1965
-4:00 Arg -04/-03 1969 Oct 5 -4:00 Arg %z 1969 Oct 5
-3:00 Arg -03/-02 1982 May -3:00 Arg %z 1982 May
-4:00 Chile -04/-03 2016 Dec 4 -4:00 Chile %z 2016 Dec 4
-3:00 - -03 -3:00 - %z
# Colombia # Colombia
@ -1437,7 +1437,7 @@ Rule CO 1993 only - Feb 6 24:00 0 -
#STDOFF -4:56:16.4 #STDOFF -4:56:16.4
Zone America/Bogota -4:56:16 - LMT 1884 Mar 13 Zone America/Bogota -4:56:16 - LMT 1884 Mar 13
-4:56:16 - BMT 1914 Nov 23 # Bogotá Mean Time -4:56:16 - BMT 1914 Nov 23 # Bogotá Mean Time
-5:00 CO -05/-04 -5:00 CO %z
# Malpelo, Providencia, San Andres # Malpelo, Providencia, San Andres
# no information; probably like America/Bogota # no information; probably like America/Bogota
@ -1475,10 +1475,10 @@ Rule Ecuador 1993 only - Feb 5 0:00 0 -
# Zone NAME STDOFF RULES FORMAT [UNTIL] # Zone NAME STDOFF RULES FORMAT [UNTIL]
Zone America/Guayaquil -5:19:20 - LMT 1890 Zone America/Guayaquil -5:19:20 - LMT 1890
-5:14:00 - QMT 1931 # Quito Mean Time -5:14:00 - QMT 1931 # Quito Mean Time
-5:00 Ecuador -05/-04 -5:00 Ecuador %z
Zone Pacific/Galapagos -5:58:24 - LMT 1931 # Puerto Baquerizo Moreno Zone Pacific/Galapagos -5:58:24 - LMT 1931 # Puerto Baquerizo Moreno
-5:00 - -05 1986 -5:00 - %z 1986
-6:00 Ecuador -06/-05 -6:00 Ecuador %z
# Falklands # Falklands
@ -1578,10 +1578,10 @@ Rule Falk 2001 2010 - Sep Sun>=1 2:00 1:00 -
# Zone NAME STDOFF RULES FORMAT [UNTIL] # Zone NAME STDOFF RULES FORMAT [UNTIL]
Zone Atlantic/Stanley -3:51:24 - LMT 1890 Zone Atlantic/Stanley -3:51:24 - LMT 1890
-3:51:24 - SMT 1912 Mar 12 # Stanley Mean Time -3:51:24 - SMT 1912 Mar 12 # Stanley Mean Time
-4:00 Falk -04/-03 1983 May -4:00 Falk %z 1983 May
-3:00 Falk -03/-02 1985 Sep 15 -3:00 Falk %z 1985 Sep 15
-4:00 Falk -04/-03 2010 Sep 5 2:00 -4:00 Falk %z 2010 Sep 5 2:00
-3:00 - -03 -3:00 - %z
# French Guiana # French Guiana
# For the 1911/1912 establishment of standard time in French possessions, see: # For the 1911/1912 establishment of standard time in French possessions, see:
@ -1589,8 +1589,8 @@ Zone Atlantic/Stanley -3:51:24 - LMT 1890
# page 752, 18b. # page 752, 18b.
# Zone NAME STDOFF RULES FORMAT [UNTIL] # Zone NAME STDOFF RULES FORMAT [UNTIL]
Zone America/Cayenne -3:29:20 - LMT 1911 Jul 1 Zone America/Cayenne -3:29:20 - LMT 1911 Jul 1
-4:00 - -04 1967 Oct -4:00 - %z 1967 Oct
-3:00 - -03 -3:00 - %z
# Guyana # Guyana
@ -1624,10 +1624,10 @@ Zone America/Cayenne -3:29:20 - LMT 1911 Jul 1
# Zone NAME STDOFF RULES FORMAT [UNTIL] # Zone NAME STDOFF RULES FORMAT [UNTIL]
Zone America/Guyana -3:52:39 - LMT 1911 Aug 1 # Georgetown Zone America/Guyana -3:52:39 - LMT 1911 Aug 1 # Georgetown
-4:00 - -04 1915 Mar 1 -4:00 - %z 1915 Mar 1
-3:45 - -0345 1975 Aug 1 -3:45 - %z 1975 Aug 1
-3:00 - -03 1992 Mar 29 1:00 -3:00 - %z 1992 Mar 29 1:00
-4:00 - -04 -4:00 - %z
# Paraguay # Paraguay
# #
@ -1725,9 +1725,9 @@ Rule Para 2013 max - Mar Sun>=22 0:00 0 -
# Zone NAME STDOFF RULES FORMAT [UNTIL] # Zone NAME STDOFF RULES FORMAT [UNTIL]
Zone America/Asuncion -3:50:40 - LMT 1890 Zone America/Asuncion -3:50:40 - LMT 1890
-3:50:40 - AMT 1931 Oct 10 # Asunción Mean Time -3:50:40 - AMT 1931 Oct 10 # Asunción Mean Time
-4:00 - -04 1972 Oct -4:00 - %z 1972 Oct
-3:00 - -03 1974 Apr -3:00 - %z 1974 Apr
-4:00 Para -04/-03 -4:00 Para %z
# Peru # Peru
# #
@ -1754,12 +1754,12 @@ Rule Peru 1994 only - Apr 1 0:00 0 -
# Zone NAME STDOFF RULES FORMAT [UNTIL] # Zone NAME STDOFF RULES FORMAT [UNTIL]
Zone America/Lima -5:08:12 - LMT 1890 Zone America/Lima -5:08:12 - LMT 1890
-5:08:36 - LMT 1908 Jul 28 # Lima Mean Time? -5:08:36 - LMT 1908 Jul 28 # Lima Mean Time?
-5:00 Peru -05/-04 -5:00 Peru %z
# South Georgia # South Georgia
# Zone NAME STDOFF RULES FORMAT [UNTIL] # Zone NAME STDOFF RULES FORMAT [UNTIL]
Zone Atlantic/South_Georgia -2:26:08 - LMT 1890 # Grytviken Zone Atlantic/South_Georgia -2:26:08 - LMT 1890 # Grytviken
-2:00 - -02 -2:00 - %z
# South Sandwich Is # South Sandwich Is
# uninhabited; scientific personnel have wintered # uninhabited; scientific personnel have wintered
@ -1769,8 +1769,8 @@ Zone Atlantic/South_Georgia -2:26:08 - LMT 1890 # Grytviken
Zone America/Paramaribo -3:40:40 - LMT 1911 Zone America/Paramaribo -3:40:40 - LMT 1911
-3:40:52 - PMT 1935 # Paramaribo Mean Time -3:40:52 - PMT 1935 # Paramaribo Mean Time
-3:40:36 - PMT 1945 Oct # The capital moved? -3:40:36 - PMT 1945 Oct # The capital moved?
-3:30 - -0330 1984 Oct -3:30 - %z 1984 Oct
-3:00 - -03 -3:00 - %z
# Trinidad and Tobago # Trinidad and Tobago
# Zone NAME STDOFF RULES FORMAT [UNTIL] # Zone NAME STDOFF RULES FORMAT [UNTIL]
@ -1992,15 +1992,15 @@ Rule Uruguay 2006 2014 - Oct Sun>=1 2:00 1:00 -
# This Zone can be simplified once we assume zic %z. # This Zone can be simplified once we assume zic %z.
Zone America/Montevideo -3:44:51 - LMT 1908 Jun 10 Zone America/Montevideo -3:44:51 - LMT 1908 Jun 10
-3:44:51 - MMT 1920 May 1 # Montevideo MT -3:44:51 - MMT 1920 May 1 # Montevideo MT
-4:00 - -04 1923 Oct 1 -4:00 - %z 1923 Oct 1
-3:30 Uruguay -0330/-03 1942 Dec 14 -3:30 Uruguay %z 1942 Dec 14
-3:00 Uruguay -03/-0230 1960 -3:00 Uruguay %z 1960
-3:00 Uruguay -03/-02 1968 -3:00 Uruguay %z 1968
-3:00 Uruguay -03/-0230 1970 -3:00 Uruguay %z 1970
-3:00 Uruguay -03/-02 1974 -3:00 Uruguay %z 1974
-3:00 Uruguay -03/-0130 1974 Mar 10 -3:00 Uruguay %z 1974 Mar 10
-3:00 Uruguay -03/-0230 1974 Dec 22 -3:00 Uruguay %z 1974 Dec 22
-3:00 Uruguay -03/-02 -3:00 Uruguay %z
# Venezuela # Venezuela
# #
@ -2034,7 +2034,7 @@ Zone America/Montevideo -3:44:51 - LMT 1908 Jun 10
# Zone NAME STDOFF RULES FORMAT [UNTIL] # Zone NAME STDOFF RULES FORMAT [UNTIL]
Zone America/Caracas -4:27:44 - LMT 1890 Zone America/Caracas -4:27:44 - LMT 1890
-4:27:40 - CMT 1912 Feb 12 # Caracas Mean Time? -4:27:40 - CMT 1912 Feb 12 # Caracas Mean Time?
-4:30 - -0430 1965 Jan 1 0:00 -4:30 - %z 1965 Jan 1 0:00
-4:00 - -04 2007 Dec 9 3:00 -4:00 - %z 2007 Dec 9 3:00
-4:30 - -0430 2016 May 1 2:30 -4:30 - %z 2016 May 1 2:30
-4:00 - -04 -4:00 - %z

View file

@ -1,4 +1,4 @@
# $OpenBSD: zone.tab,v 1.76 2024/01/02 22:43:21 millert Exp $ # $OpenBSD: zone.tab,v 1.77 2024/10/02 17:08:47 millert Exp $
# tzdb timezone descriptions (deprecated version) # tzdb timezone descriptions (deprecated version)
# #
# This file is in the public domain, so clarified as of # This file is in the public domain, so clarified as of
@ -265,8 +265,7 @@ MK +4159+02126 Europe/Skopje
ML +1239-00800 Africa/Bamako ML +1239-00800 Africa/Bamako
MM +1647+09610 Asia/Yangon MM +1647+09610 Asia/Yangon
MN +4755+10653 Asia/Ulaanbaatar most of Mongolia MN +4755+10653 Asia/Ulaanbaatar most of Mongolia
MN +4801+09139 Asia/Hovd Bayan-Olgiy, Govi-Altai, Hovd, Uvs, Zavkhan MN +4801+09139 Asia/Hovd Bayan-Olgii, Hovd, Uvs
MN +4804+11430 Asia/Choibalsan Dornod, Sukhbaatar
MO +221150+1133230 Asia/Macau MO +221150+1133230 Asia/Macau
MP +1512+14545 Pacific/Saipan MP +1512+14545 Pacific/Saipan
MQ +1436-06105 America/Martinique MQ +1436-06105 America/Martinique

View file

@ -1,4 +1,4 @@
# $OpenBSD: zone1970.tab,v 1.29 2024/01/02 22:43:21 millert Exp $ # $OpenBSD: zone1970.tab,v 1.30 2024/10/02 17:08:47 millert Exp $
# tzdb timezone descriptions # tzdb timezone descriptions
# #
# This file is in the public domain. # This file is in the public domain.
@ -210,8 +210,7 @@ MD +4700+02850 Europe/Chisinau
MH +0905+16720 Pacific/Kwajalein Kwajalein MH +0905+16720 Pacific/Kwajalein Kwajalein
MM,CC +1647+09610 Asia/Yangon MM,CC +1647+09610 Asia/Yangon
MN +4755+10653 Asia/Ulaanbaatar most of Mongolia MN +4755+10653 Asia/Ulaanbaatar most of Mongolia
MN +4801+09139 Asia/Hovd Bayan-Ölgii, Govi-Altai, Hovd, Uvs, Zavkhan MN +4801+09139 Asia/Hovd Bayan-Ölgii, Hovd, Uvs
MN +4804+11430 Asia/Choibalsan Dornod, Sükhbaatar
MO +221150+1133230 Asia/Macau MO +221150+1133230 Asia/Macau
MQ +1436-06105 America/Martinique MQ +1436-06105 America/Martinique
MT +3554+01431 Europe/Malta MT +3554+01431 Europe/Malta

View file

@ -5,7 +5,7 @@
# From Paul Eggert (2023-12-18): # From Paul Eggert (2023-12-18):
# This file contains a table where each row stands for a timezone # This file contains a table where each row stands for a timezone
# where civil timestamps are predicted to agree from now on. # where civil timestamps are predicted to agree from now on.
# This file is like zone1970.tab (see zone1970.tab's coments), # This file is like zone1970.tab (see zone1970.tab's comments),
# but with the following changes: # but with the following changes:
# #
# 1. Each timezone corresponds to a set of clocks that are planned # 1. Each timezone corresponds to a set of clocks that are planned
@ -123,8 +123,6 @@ XX +1455-02331 Atlantic/Cape_Verde Cape Verde
# #
# -01/+00 (EU DST) # -01/+00 (EU DST)
XX +3744-02540 Atlantic/Azores Azores XX +3744-02540 Atlantic/Azores Azores
# -01/+00 (EU DST) until 2024-03-31; then -02/-01 (EU DST)
XX +7029-02158 America/Scoresbysund Ittoqqortoormiit
# #
# +00 - GMT # +00 - GMT
XX +0519-00402 Africa/Abidjan far western Africa; Iceland ("GMT") XX +0519-00402 Africa/Abidjan far western Africa; Iceland ("GMT")
@ -199,7 +197,7 @@ XX +2518+05518 Asia/Dubai Russia; Caucasus; Persian Gulf; Seychelles; Réunion
XX +3431+06912 Asia/Kabul Afghanistan XX +3431+06912 Asia/Kabul Afghanistan
# #
# +05 # +05
XX +4120+06918 Asia/Tashkent Russia; west Kazakhstan; Tajikistan; Turkmenistan; Uzbekistan; Maldives XX +4120+06918 Asia/Tashkent Russia; Kazakhstan; Tajikistan; Turkmenistan; Uzbekistan; Maldives
# #
# +05 - PKT # +05 - PKT
XX +2452+06703 Asia/Karachi Pakistan ("PKT") XX +2452+06703 Asia/Karachi Pakistan ("PKT")
@ -215,8 +213,6 @@ XX +2743+08519 Asia/Kathmandu Nepal
# #
# +06 # +06
XX +2343+09025 Asia/Dhaka Russia; Kyrgyzstan; Bhutan; Bangladesh; Chagos XX +2343+09025 Asia/Dhaka Russia; Kyrgyzstan; Bhutan; Bangladesh; Chagos
# +06 until 2024-03-01; then +05
XX +4315+07657 Asia/Almaty Kazakhstan (except western areas)
# #
# +06:30 # +06:30
XX +1647+09610 Asia/Yangon Myanmar; Cocos XX +1647+09610 Asia/Yangon Myanmar; Cocos

View file

@ -5,14 +5,10 @@
# This is not a general-purpose converter; it is designed for current tzdata. # This is not a general-purpose converter; it is designed for current tzdata.
# It just converts from current source to main, vanguard, and rearguard forms. # It just converts from current source to main, vanguard, and rearguard forms.
# Although it might be nice for it to be idempotent, or to be useful # Although it might be nice for it to be idempotent, or to be useful
# for converting back and forth between vanguard and rearguard formats, # for converting back and forth between formats,
# it does not do these nonessential tasks now. # it does not do these nonessential tasks now.
# #
# Although main and vanguard forms are currently equivalent, # This script can convert from main to vanguard form and vice versa.
# this need not always be the case. When the two forms differ,
# this script can convert either from main to vanguard form (needed then),
# or from vanguard to main form (this conversion would be needed later,
# after main became rearguard and vanguard became main).
# There is no need to convert rearguard to other forms. # There is no need to convert rearguard to other forms.
# #
# When converting to vanguard form, the output can use the line # When converting to vanguard form, the output can use the line
@ -145,12 +141,12 @@ DATAFORM != "main" {
} }
# If this line should differ due to Portugal benefiting from %z if supported, # If this line should differ due to Portugal benefiting from %z if supported,
# uncomment the desired version and comment out the undesired one. # comment out the undesired version and uncomment the desired one.
if ($0 ~ /^#?[\t ]+-[12]:00[\t ]+Port[\t ]+[%+-]/) { if ($0 ~ /^#?[\t ]+-[12]:00[\t ]+((Port|W-Eur)[\t ]+[%+-]|-[\t ]+(%z|-01)[\t ]+1982 Mar 28)/) {
if (($0 ~ /%z/) == (DATAFORM == "vanguard")) { if (($0 ~ /%z/) == (DATAFORM == "rearguard")) {
uncomment = in_comment
} else {
comment_out = !in_comment comment_out = !in_comment
} else {
uncomment = in_comment
} }
} }
@ -172,13 +168,8 @@ DATAFORM != "main" {
sub(/^/, "#") sub(/^/, "#")
} }
# Prefer %z in vanguard form, explicit abbreviations otherwise. # Prefer explicit abbreviations in rearguard form, %z otherwise.
if (DATAFORM == "vanguard") { if (DATAFORM == "rearguard") {
sub(/^(Zone[\t ]+[^\t ]+)?[\t ]+[^\t ]+[\t ]+[^\t ]+[\t ]+[-+][^\t ]+/, \
"&CHANGE-TO-%z")
sub(/-00CHANGE-TO-%z/, "-00")
sub(/[-+][^\t ]+CHANGE-TO-/, "")
} else {
if ($0 ~ /^[^#]*%z/) { if ($0 ~ /^[^#]*%z/) {
stdoff_column = 2 * ($0 ~ /^Zone/) + 1 stdoff_column = 2 * ($0 ~ /^Zone/) + 1
rules_column = stdoff_column + 1 rules_column = stdoff_column + 1
@ -216,6 +207,11 @@ DATAFORM != "main" {
} }
sub(/%z/, abbr) sub(/%z/, abbr)
} }
} else {
sub(/^(Zone[\t ]+[^\t ]+)?[\t ]+[^\t ]+[\t ]+[^\t ]+[\t ]+[-+][^\t ]+/, \
"&CHANGE-TO-%z")
sub(/-00CHANGE-TO-%z/, "-00")
sub(/[-+][^\t ]+CHANGE-TO-/, "")
} }
# Normally, prefer whole seconds. However, prefer subseconds # Normally, prefer whole seconds. However, prefer subseconds

View file

@ -1,4 +1,4 @@
/* $OpenBSD: pmap.c,v 1.176 2024/09/26 21:55:42 dv Exp $ */ /* $OpenBSD: pmap.c,v 1.177 2024/10/02 18:18:27 dv Exp $ */
/* $NetBSD: pmap.c,v 1.3 2003/05/08 18:13:13 thorpej Exp $ */ /* $NetBSD: pmap.c,v 1.3 2003/05/08 18:13:13 thorpej Exp $ */
/* /*
@ -2468,9 +2468,7 @@ pmap_remove_ept(struct pmap *pmap, vaddr_t sgpa, vaddr_t egpa)
for (v = sgpa; v < egpa + PAGE_SIZE; v += PAGE_SIZE) for (v = sgpa; v < egpa + PAGE_SIZE; v += PAGE_SIZE)
pmap_do_remove_ept(pmap, v); pmap_do_remove_ept(pmap, v);
#ifdef MULTIPROCESSOR
pmap_shootept(pmap, 1); pmap_shootept(pmap, 1);
#endif /* MULTIPROCESSOR */
mtx_leave(&pmap->pm_mtx); mtx_leave(&pmap->pm_mtx);
@ -3518,4 +3516,22 @@ pmap_tlb_shoottlb(struct pmap *pm, int shootself)
} }
} }
} }
#if NVMM > 0
void
pmap_shootept(struct pmap *pm, int shootself)
{
struct cpu_info *self = curcpu();
struct vmx_invept_descriptor vid;
KASSERT(pmap_is_ept(pm));
if (shootself && (self->ci_flags & CPUF_VMM)) {
vid.vid_eptp = pm->eptp;
vid.vid_reserved = 0;
invept(self->ci_vmm_cap.vcc_vmx.vmx_invept_mode, &vid);
}
}
#endif /* NVMM > 0 */
#endif /* MULTIPROCESSOR */ #endif /* MULTIPROCESSOR */

View file

@ -1,4 +1,4 @@
/* $OpenBSD: vmmvar.h,v 1.107 2024/09/26 13:18:25 dv Exp $ */ /* $OpenBSD: vmmvar.h,v 1.108 2024/10/02 17:05:56 dv Exp $ */
/* /*
* Copyright (c) 2014 Mike Larkin <mlarkin@openbsd.org> * Copyright (c) 2014 Mike Larkin <mlarkin@openbsd.org>
* *
@ -23,9 +23,6 @@
#define VMM_HV_SIGNATURE "OpenBSDVMM58" #define VMM_HV_SIGNATURE "OpenBSDVMM58"
#define VMM_PCI_MMIO_BAR_BASE 0xF0000000ULL
#define VMM_PCI_MMIO_BAR_END 0xFFDFFFFFULL /* 2 MiB below 4 GiB */
/* VMX: Basic Exit Reasons */ /* VMX: Basic Exit Reasons */
#define VMX_EXIT_NMI 0 #define VMX_EXIT_NMI 0
#define VMX_EXIT_EXTINT 1 #define VMX_EXIT_EXTINT 1

View file

@ -1,4 +1,4 @@
/* $OpenBSD: pmap7.c,v 1.66 2023/01/01 19:49:17 miod Exp $ */ /* $OpenBSD: pmap7.c,v 1.67 2024/10/02 10:12:52 mpi Exp $ */
/* $NetBSD: pmap.c,v 1.147 2004/01/18 13:03:50 scw Exp $ */ /* $NetBSD: pmap.c,v 1.147 2004/01/18 13:03:50 scw Exp $ */
/* /*
@ -238,10 +238,10 @@ struct pool pmap_pmap_pool;
* Pool of PV structures * Pool of PV structures
*/ */
struct pool pmap_pv_pool; struct pool pmap_pv_pool;
void *pmap_bootstrap_pv_page_alloc(struct pool *, int, int *); void *pmap_pv_page_alloc(struct pool *, int, int *);
void pmap_bootstrap_pv_page_free(struct pool *, void *); void pmap_pv_page_free(struct pool *, void *);
struct pool_allocator pmap_bootstrap_pv_allocator = { struct pool_allocator pmap_pv_allocator = {
pmap_bootstrap_pv_page_alloc, pmap_bootstrap_pv_page_free pmap_pv_page_alloc, pmap_pv_page_free
}; };
/* /*
@ -2360,7 +2360,7 @@ pmap_bootstrap(pd_entry_t *kernel_l1pt, vaddr_t vstart, vaddr_t vend)
pool_init(&pmap_pmap_pool, sizeof(struct pmap), 0, IPL_NONE, 0, pool_init(&pmap_pmap_pool, sizeof(struct pmap), 0, IPL_NONE, 0,
"pmappl", &pool_allocator_single); "pmappl", &pool_allocator_single);
pool_init(&pmap_pv_pool, sizeof(struct pv_entry), 0, IPL_VM, 0, pool_init(&pmap_pv_pool, sizeof(struct pv_entry), 0, IPL_VM, 0,
"pvepl", &pmap_bootstrap_pv_allocator); "pvepl", &pmap_pv_allocator);
pool_init(&pmap_l2dtable_pool, sizeof(struct l2_dtable), 0, IPL_VM, 0, pool_init(&pmap_l2dtable_pool, sizeof(struct l2_dtable), 0, IPL_VM, 0,
"l2dtblpl", NULL); "l2dtblpl", NULL);
pool_init(&pmap_l2ptp_pool, L2_TABLE_SIZE_REAL, L2_TABLE_SIZE_REAL, pool_init(&pmap_l2ptp_pool, L2_TABLE_SIZE_REAL, L2_TABLE_SIZE_REAL,
@ -2397,48 +2397,22 @@ pmap_init(void)
pmap_initialized = 1; pmap_initialized = 1;
} }
static vaddr_t last_bootstrap_page = 0;
static void *free_bootstrap_pages = NULL;
void * void *
pmap_bootstrap_pv_page_alloc(struct pool *pp, int flags, int *slowdown) pmap_pv_page_alloc(struct pool *pp, int flags, int *slowdown)
{ {
extern void *pool_page_alloc(struct pool *, int, int *); struct kmem_dyn_mode kd = KMEM_DYN_INITIALIZER;
vaddr_t new_page;
void *rv;
if (pmap_initialized) kd.kd_waitok = ISSET(flags, PR_WAITOK);
return (pool_page_alloc(pp, flags, slowdown)); kd.kd_slowdown = slowdown;
*slowdown = 0;
if (free_bootstrap_pages) { return (km_alloc(pp->pr_pgsize,
rv = free_bootstrap_pages; pmap_initialized ? &kv_page : &kv_any, pp->pr_crange, &kd));
free_bootstrap_pages = *((void **)rv);
return (rv);
}
new_page = uvm_km_kmemalloc(kernel_map, NULL, PAGE_SIZE,
(flags & PR_WAITOK) ? 0 : UVM_KMF_NOWAIT);
last_bootstrap_page = new_page;
return ((void *)new_page);
} }
void void
pmap_bootstrap_pv_page_free(struct pool *pp, void *v) pmap_pv_page_free(struct pool *pp, void *v)
{ {
extern void pool_page_free(struct pool *, void *); km_free(v, pp->pr_pgsize, &kv_page, pp->pr_crange);
if (pmap_initialized) {
pool_page_free(pp, v);
return;
}
if ((vaddr_t)v < last_bootstrap_page) {
*((void **)v) = free_bootstrap_pages;
free_bootstrap_pages = v;
return;
}
} }
/* /*

View file

@ -1,4 +1,4 @@
# $OpenBSD: GENERIC,v 1.298 2024/09/17 13:45:49 jsg Exp $ # $OpenBSD: GENERIC,v 1.299 2024/10/03 04:39:09 tb Exp $
# #
# Machine-independent option; used by all architectures for their # Machine-independent option; used by all architectures for their
# GENERIC kernel # GENERIC kernel
@ -16,7 +16,7 @@ option KMEMSTATS # collect malloc(9) statistics
option PTRACE # ptrace(2) system call option PTRACE # ptrace(2) system call
#option KVA_GUARDPAGES # slow virtual address recycling (+ guarding) #option KVA_GUARDPAGES # slow virtual address recycling (+ guarding)
#option POOL_DEBUG # pool corruption detection option POOL_DEBUG # pool corruption detection
#option VFSLCKDEBUG # VFS locking checks #option VFSLCKDEBUG # VFS locking checks
option CRYPTO # Cryptographic framework option CRYPTO # Cryptographic framework

View file

@ -1,4 +1,4 @@
/* $OpenBSD: qciic.c,v 1.6 2024/06/19 21:27:22 patrick Exp $ */ /* $OpenBSD: qciic.c,v 1.7 2024/10/02 21:21:32 kettenis Exp $ */
/* /*
* Copyright (c) 2022 Mark Kettenis <kettenis@openbsd.org> * Copyright (c) 2022 Mark Kettenis <kettenis@openbsd.org>
* *
@ -74,6 +74,7 @@ struct qciic_crs {
uint16_t gpio_int_pin; uint16_t gpio_int_pin;
uint16_t gpio_int_flags; uint16_t gpio_int_flags;
struct aml_node *node; struct aml_node *node;
int skip;
}; };
int qciic_acpi_match(struct device *, void *, void *); int qciic_acpi_match(struct device *, void *, void *);
@ -373,6 +374,11 @@ qciic_acpi_parse_crs(int crsidx, union acpi_resource *crs, void *arg)
uint16_t pin; uint16_t pin;
switch (AML_CRSTYPE(crs)) { switch (AML_CRSTYPE(crs)) {
case LR_MEM32FIXED:
/* An MMIO address means this is not an I2C device. */
sc_crs->skip = 1;
break;
case LR_SERBUS: case LR_SERBUS:
if (crs->lr_serbus.type == LR_SERBUS_I2C) { if (crs->lr_serbus.type == LR_SERBUS_I2C) {
sc_crs->i2c_addr = crs->lr_i2cbus._adr; sc_crs->i2c_addr = crs->lr_i2cbus._adr;
@ -440,7 +446,7 @@ qciic_acpi_found_hid(struct aml_node *node, void *arg)
aml_freevalue(&res); aml_freevalue(&res);
/* Skip if not using this bus. */ /* Skip if not using this bus. */
if (crs.i2c_bus != sc->sc_node) if (crs.skip || crs.i2c_bus != sc->sc_node)
return 0; return 0;
acpi_attach_deps(acpi_softc, node->parent); acpi_attach_deps(acpi_softc, node->parent);

View file

@ -47,6 +47,7 @@
#include <linux/pseudo_fs.h> #include <linux/pseudo_fs.h>
#include <linux/slab.h> #include <linux/slab.h>
#include <linux/srcu.h> #include <linux/srcu.h>
#include <linux/xarray.h>
#include <linux/suspend.h> #include <linux/suspend.h>
#include <drm/drm_accel.h> #include <drm/drm_accel.h>
@ -70,8 +71,7 @@ MODULE_AUTHOR("Gareth Hughes, Leif Delgass, José Fonseca, Jon Smirl");
MODULE_DESCRIPTION("DRM shared core routines"); MODULE_DESCRIPTION("DRM shared core routines");
MODULE_LICENSE("GPL and additional rights"); MODULE_LICENSE("GPL and additional rights");
static DEFINE_SPINLOCK(drm_minor_lock); DEFINE_XARRAY_ALLOC(drm_minors_xa);
static struct idr drm_minors_idr;
/* /*
* If the drm core fails to init for whatever reason, * If the drm core fails to init for whatever reason,
@ -144,6 +144,18 @@ SPLAY_PROTOTYPE(drm_file_tree, drm_file, link, drm_file_cmp);
* registered and unregistered dynamically according to device-state. * registered and unregistered dynamically according to device-state.
*/ */
static struct xarray *drm_minor_get_xa(enum drm_minor_type type)
{
if (type == DRM_MINOR_PRIMARY || type == DRM_MINOR_RENDER)
return &drm_minors_xa;
#if IS_ENABLED(CONFIG_DRM_ACCEL)
else if (type == DRM_MINOR_ACCEL)
return &accel_minors_xa;
#endif
else
return ERR_PTR(-EOPNOTSUPP);
}
static struct drm_minor **drm_minor_get_slot(struct drm_device *dev, static struct drm_minor **drm_minor_get_slot(struct drm_device *dev,
enum drm_minor_type type) enum drm_minor_type type)
{ {
@ -162,7 +174,6 @@ static struct drm_minor **drm_minor_get_slot(struct drm_device *dev,
static void drm_minor_alloc_release(struct drm_device *dev, void *data) static void drm_minor_alloc_release(struct drm_device *dev, void *data)
{ {
struct drm_minor *minor = data; struct drm_minor *minor = data;
unsigned long flags;
WARN_ON(dev != minor->dev); WARN_ON(dev != minor->dev);
@ -170,19 +181,26 @@ static void drm_minor_alloc_release(struct drm_device *dev, void *data)
put_device(minor->kdev); put_device(minor->kdev);
#endif #endif
if (minor->type == DRM_MINOR_ACCEL) { xa_erase(drm_minor_get_xa(minor->type), minor->index);
accel_minor_remove(minor->index);
} else {
spin_lock_irqsave(&drm_minor_lock, flags);
idr_remove(&drm_minors_idr, minor->index);
spin_unlock_irqrestore(&drm_minor_lock, flags);
}
} }
/*
* DRM used to support 64 devices, for backwards compatibility we need to maintain the
* minor allocation scheme where minors 0-63 are primary nodes, 64-127 are control nodes,
* and 128-191 are render nodes.
* After reaching the limit, we're allocating minors dynamically - first-come, first-serve.
* Accel nodes are using a distinct major, so the minors are allocated in continuous 0-MAX
* range.
*/
#define DRM_MINOR_LIMIT(t) ({ \
typeof(t) _t = (t); \
_t == DRM_MINOR_ACCEL ? XA_LIMIT(0, ACCEL_MAX_MINORS) : XA_LIMIT(64 * _t, 64 * _t + 63); \
})
#define DRM_EXTENDED_MINOR_LIMIT XA_LIMIT(192, (1 << MINORBITS) - 1)
static int drm_minor_alloc(struct drm_device *dev, enum drm_minor_type type) static int drm_minor_alloc(struct drm_device *dev, enum drm_minor_type type)
{ {
struct drm_minor *minor; struct drm_minor *minor;
unsigned long flags;
int r; int r;
minor = drmm_kzalloc(dev, sizeof(*minor), GFP_KERNEL); minor = drmm_kzalloc(dev, sizeof(*minor), GFP_KERNEL);
@ -192,25 +210,14 @@ static int drm_minor_alloc(struct drm_device *dev, enum drm_minor_type type)
minor->type = type; minor->type = type;
minor->dev = dev; minor->dev = dev;
idr_preload(GFP_KERNEL); r = xa_alloc(drm_minor_get_xa(type), &minor->index,
if (type == DRM_MINOR_ACCEL) { NULL, DRM_MINOR_LIMIT(type), GFP_KERNEL);
r = accel_minor_alloc(); if (r == -EBUSY && (type == DRM_MINOR_PRIMARY || type == DRM_MINOR_RENDER))
} else { r = xa_alloc(&drm_minors_xa, &minor->index,
spin_lock_irqsave(&drm_minor_lock, flags); NULL, DRM_EXTENDED_MINOR_LIMIT, GFP_KERNEL);
r = idr_alloc(&drm_minors_idr,
NULL,
64 * type,
64 * (type + 1),
GFP_NOWAIT);
spin_unlock_irqrestore(&drm_minor_lock, flags);
}
idr_preload_end();
if (r < 0) if (r < 0)
return r; return r;
minor->index = r;
r = drmm_add_action_or_reset(dev, drm_minor_alloc_release, minor); r = drmm_add_action_or_reset(dev, drm_minor_alloc_release, minor);
if (r) if (r)
return r; return r;
@ -228,10 +235,8 @@ static int drm_minor_alloc(struct drm_device *dev, enum drm_minor_type type)
static int drm_minor_register(struct drm_device *dev, enum drm_minor_type type) static int drm_minor_register(struct drm_device *dev, enum drm_minor_type type)
{ {
struct drm_minor *minor; struct drm_minor *minor;
unsigned long flags; void *entry;
#ifdef __linux__
int ret; int ret;
#endif
DRM_DEBUG("\n"); DRM_DEBUG("\n");
@ -258,28 +263,26 @@ static int drm_minor_register(struct drm_device *dev, enum drm_minor_type type)
#endif #endif
/* replace NULL with @minor so lookups will succeed from now on */ /* replace NULL with @minor so lookups will succeed from now on */
if (minor->type == DRM_MINOR_ACCEL) { entry = xa_store(drm_minor_get_xa(type), minor->index, minor, GFP_KERNEL);
accel_minor_replace(minor, minor->index); if (xa_is_err(entry)) {
} else { ret = xa_err(entry);
spin_lock_irqsave(&drm_minor_lock, flags); goto err_debugfs;
idr_replace(&drm_minors_idr, minor, minor->index);
spin_unlock_irqrestore(&drm_minor_lock, flags);
} }
WARN_ON(entry);
DRM_DEBUG("new minor registered %d\n", minor->index); DRM_DEBUG("new minor registered %d\n", minor->index);
return 0; return 0;
#ifdef __linux__
err_debugfs: err_debugfs:
#ifdef __linux__
drm_debugfs_cleanup(minor); drm_debugfs_cleanup(minor);
return ret;
#endif #endif
return ret;
} }
static void drm_minor_unregister(struct drm_device *dev, enum drm_minor_type type) static void drm_minor_unregister(struct drm_device *dev, enum drm_minor_type type)
{ {
struct drm_minor *minor; struct drm_minor *minor;
unsigned long flags;
minor = *drm_minor_get_slot(dev, type); minor = *drm_minor_get_slot(dev, type);
#ifdef __linux__ #ifdef __linux__
@ -290,13 +293,7 @@ static void drm_minor_unregister(struct drm_device *dev, enum drm_minor_type typ
return; return;
/* replace @minor with NULL so lookups will fail from now on */ /* replace @minor with NULL so lookups will fail from now on */
if (minor->type == DRM_MINOR_ACCEL) { xa_store(drm_minor_get_xa(type), minor->index, NULL, GFP_KERNEL);
accel_minor_replace(NULL, minor->index);
} else {
spin_lock_irqsave(&drm_minor_lock, flags);
idr_replace(&drm_minors_idr, NULL, minor->index);
spin_unlock_irqrestore(&drm_minor_lock, flags);
}
#ifdef __linux__ #ifdef __linux__
device_del(minor->kdev); device_del(minor->kdev);
@ -314,16 +311,15 @@ static void drm_minor_unregister(struct drm_device *dev, enum drm_minor_type typ
* minor->dev pointer will stay valid! However, the device may get unplugged and * minor->dev pointer will stay valid! However, the device may get unplugged and
* unregistered while you hold the minor. * unregistered while you hold the minor.
*/ */
struct drm_minor *drm_minor_acquire(unsigned int minor_id) struct drm_minor *drm_minor_acquire(struct xarray *minor_xa, unsigned int minor_id)
{ {
struct drm_minor *minor; struct drm_minor *minor;
unsigned long flags;
spin_lock_irqsave(&drm_minor_lock, flags); xa_lock(minor_xa);
minor = idr_find(&drm_minors_idr, minor_id); minor = xa_load(minor_xa, minor_id);
if (minor) if (minor)
drm_dev_get(minor->dev); drm_dev_get(minor->dev);
spin_unlock_irqrestore(&drm_minor_lock, flags); xa_unlock(minor_xa);
if (!minor) { if (!minor) {
return ERR_PTR(-ENODEV); return ERR_PTR(-ENODEV);
@ -1142,7 +1138,7 @@ static int drm_stub_open(struct inode *inode, struct file *filp)
DRM_DEBUG("\n"); DRM_DEBUG("\n");
minor = drm_minor_acquire(iminor(inode)); minor = drm_minor_acquire(&drm_minors_xa, iminor(inode));
if (IS_ERR(minor)) if (IS_ERR(minor))
return PTR_ERR(minor); return PTR_ERR(minor);
@ -1180,7 +1176,7 @@ static void drm_core_exit(void)
debugfs_remove(drm_debugfs_root); debugfs_remove(drm_debugfs_root);
drm_sysfs_destroy(); drm_sysfs_destroy();
#endif #endif
idr_destroy(&drm_minors_idr); WARN_ON(!xa_empty(&drm_minors_xa));
drm_connector_ida_destroy(); drm_connector_ida_destroy();
} }
@ -1191,7 +1187,6 @@ static int __init drm_core_init(void)
#endif #endif
drm_connector_ida_init(); drm_connector_ida_init();
idr_init(&drm_minors_idr);
drm_memcpy_init_early(); drm_memcpy_init_early();
#ifdef __linux__ #ifdef __linux__

View file

@ -426,7 +426,7 @@ int drm_open(struct inode *inode, struct file *filp)
int retcode; int retcode;
int need_setup = 0; int need_setup = 0;
minor = drm_minor_acquire(iminor(inode)); minor = drm_minor_acquire(&drm_minors_xa, iminor(inode));
if (IS_ERR(minor)) if (IS_ERR(minor))
return PTR_ERR(minor); return PTR_ERR(minor);

View file

@ -77,10 +77,6 @@ void drm_prime_destroy_file_private(struct drm_prime_file_private *prime_fpriv);
void drm_prime_remove_buf_handle(struct drm_prime_file_private *prime_fpriv, void drm_prime_remove_buf_handle(struct drm_prime_file_private *prime_fpriv,
uint32_t handle); uint32_t handle);
/* drm_drv.c */
struct drm_minor *drm_minor_acquire(unsigned int minor_id);
void drm_minor_release(struct drm_minor *minor);
/* drm_managed.c */ /* drm_managed.c */
void drm_managed_release(struct drm_device *dev); void drm_managed_release(struct drm_device *dev);
void drmm_add_final_kfree(struct drm_device *dev, void *container); void drmm_add_final_kfree(struct drm_device *dev, void *container);

View file

@ -5,6 +5,8 @@
#include <drm/drm_file.h> #include <drm/drm_file.h>
#define ACCEL_MAX_MINORS 256
static inline int static inline int
accel_minor_alloc(void) accel_minor_alloc(void)
{ {

View file

@ -48,6 +48,8 @@ struct device;
struct file; struct file;
struct seq_file; struct seq_file;
extern struct xarray drm_minors_xa;
/* /*
* FIXME: Not sure we want to have drm_minor here in the end, but to avoid * FIXME: Not sure we want to have drm_minor here in the end, but to avoid
* header include loops we need it here for now. * header include loops we need it here for now.
@ -449,6 +451,9 @@ static inline bool drm_is_accel_client(const struct drm_file *file_priv)
void drm_file_update_pid(struct drm_file *); void drm_file_update_pid(struct drm_file *);
struct drm_minor *drm_minor_acquire(struct xarray *minors_xa, unsigned int minor_id);
void drm_minor_release(struct drm_minor *minor);
#ifdef __linux__ #ifdef __linux__
int drm_open(struct inode *inode, struct file *filp); int drm_open(struct inode *inode, struct file *filp);
int drm_open_helper(struct file *filp, struct drm_minor *minor); int drm_open_helper(struct file *filp, struct drm_minor *minor);

View file

@ -23,5 +23,6 @@ struct file_operations {
}; };
#define DEFINE_SIMPLE_ATTRIBUTE(a, b, c, d) #define DEFINE_SIMPLE_ATTRIBUTE(a, b, c, d)
#define MINORBITS 8
#endif #endif

View file

@ -29,6 +29,13 @@ struct xarray {
SPLAY_HEAD(xarray_tree, xarray_entry) xa_tree; SPLAY_HEAD(xarray_tree, xarray_entry) xa_tree;
}; };
#define DEFINE_XARRAY_ALLOC(name) \
struct xarray name = { \
.xa_flags = XA_FLAGS_ALLOC, \
.xa_lock = MUTEX_INITIALIZER(IPL_NONE), \
.xa_tree = SPLAY_INITIALIZER(&name.xa_tree) \
}
struct xarray_range { struct xarray_range {
uint32_t start; uint32_t start;
uint32_t end; uint32_t end;

View file

@ -1,4 +1,4 @@
/* $OpenBSD: if_vio.c,v 1.56 2024/09/19 06:23:38 sf Exp $ */ /* $OpenBSD: if_vio.c,v 1.57 2024/10/03 08:59:49 sf Exp $ */
/* /*
* Copyright (c) 2012 Stefan Fritsch, Alexander Fiveg. * Copyright (c) 2012 Stefan Fritsch, Alexander Fiveg.
@ -256,6 +256,7 @@ struct vio_softc {
struct vio_queue *sc_q; struct vio_queue *sc_q;
uint16_t sc_nqueues; uint16_t sc_nqueues;
int sc_rx_mbuf_size;
enum vio_ctrl_state sc_ctrl_inuse; enum vio_ctrl_state sc_ctrl_inuse;
@ -492,8 +493,9 @@ vio_alloc_mem(struct vio_softc *sc, int tx_max_segments)
vioq->viq_txmbufs = vioq->viq_rxmbufs + rxqsize; vioq->viq_txmbufs = vioq->viq_rxmbufs + rxqsize;
for (i = 0; i < rxqsize; i++) { for (i = 0; i < rxqsize; i++) {
r = bus_dmamap_create(vsc->sc_dmat, MAXMCLBYTES, r = bus_dmamap_create(vsc->sc_dmat,
MAXMCLBYTES/PAGE_SIZE + 1, MCLBYTES, 0, sc->sc_rx_mbuf_size + sc->sc_hdr_size, 2,
sc->sc_rx_mbuf_size, 0,
BUS_DMA_NOWAIT|BUS_DMA_ALLOCNOW, BUS_DMA_NOWAIT|BUS_DMA_ALLOCNOW,
&vioq->viq_rxdmamaps[i]); &vioq->viq_rxdmamaps[i]);
if (r != 0) if (r != 0)
@ -644,10 +646,35 @@ vio_attach(struct device *parent, struct device *self, void *aux)
} else { } else {
sc->sc_hdr_size = offsetof(struct virtio_net_hdr, num_buffers); sc->sc_hdr_size = offsetof(struct virtio_net_hdr, num_buffers);
} }
ifp->if_capabilities = 0;
ifp->if_flags = IFF_BROADCAST | IFF_SIMPLEX | IFF_MULTICAST;
#if NVLAN > 0
ifp->if_capabilities |= IFCAP_VLAN_MTU;
ifp->if_capabilities |= IFCAP_VLAN_HWOFFLOAD;
#endif
if (virtio_has_feature(vsc, VIRTIO_NET_F_CSUM))
ifp->if_capabilities |= IFCAP_CSUM_TCPv4|IFCAP_CSUM_UDPv4|
IFCAP_CSUM_TCPv6|IFCAP_CSUM_UDPv6;
if (virtio_has_feature(vsc, VIRTIO_NET_F_HOST_TSO4))
ifp->if_capabilities |= IFCAP_TSOv4;
if (virtio_has_feature(vsc, VIRTIO_NET_F_HOST_TSO6))
ifp->if_capabilities |= IFCAP_TSOv6;
sc->sc_rx_mbuf_size = MCLBYTES;
if (virtio_has_feature(vsc, VIRTIO_NET_F_CTRL_GUEST_OFFLOADS) &&
(virtio_has_feature(vsc, VIRTIO_NET_F_GUEST_TSO4) ||
virtio_has_feature(vsc, VIRTIO_NET_F_GUEST_TSO6))) {
ifp->if_xflags |= IFXF_LRO;
ifp->if_capabilities |= IFCAP_LRO;
sc->sc_rx_mbuf_size = 4 * 1024;
}
if (virtio_has_feature(vsc, VIRTIO_NET_F_MRG_RXBUF)) if (virtio_has_feature(vsc, VIRTIO_NET_F_MRG_RXBUF))
ifp->if_hardmtu = MAXMCLBYTES; ifp->if_hardmtu = MAXMCLBYTES;
else else
ifp->if_hardmtu = MCLBYTES - sc->sc_hdr_size - ETHER_HDR_LEN; ifp->if_hardmtu = sc->sc_rx_mbuf_size - sc->sc_hdr_size -
ETHER_HDR_LEN;
/* defrag for longer mbuf chains */ /* defrag for longer mbuf chains */
tx_max_segments = 16; tx_max_segments = 16;
@ -699,28 +726,8 @@ vio_attach(struct device *parent, struct device *self, void *aux)
strlcpy(ifp->if_xname, self->dv_xname, IFNAMSIZ); strlcpy(ifp->if_xname, self->dv_xname, IFNAMSIZ);
ifp->if_softc = sc; ifp->if_softc = sc;
ifp->if_flags = IFF_BROADCAST | IFF_SIMPLEX | IFF_MULTICAST;
ifp->if_start = vio_start; ifp->if_start = vio_start;
ifp->if_ioctl = vio_ioctl; ifp->if_ioctl = vio_ioctl;
ifp->if_capabilities = 0;
#if NVLAN > 0
ifp->if_capabilities |= IFCAP_VLAN_MTU;
ifp->if_capabilities |= IFCAP_VLAN_HWOFFLOAD;
#endif
if (virtio_has_feature(vsc, VIRTIO_NET_F_CSUM))
ifp->if_capabilities |= IFCAP_CSUM_TCPv4|IFCAP_CSUM_UDPv4|
IFCAP_CSUM_TCPv6|IFCAP_CSUM_UDPv6;
if (virtio_has_feature(vsc, VIRTIO_NET_F_HOST_TSO4))
ifp->if_capabilities |= IFCAP_TSOv4;
if (virtio_has_feature(vsc, VIRTIO_NET_F_HOST_TSO6))
ifp->if_capabilities |= IFCAP_TSOv6;
if (virtio_has_feature(vsc, VIRTIO_NET_F_CTRL_GUEST_OFFLOADS) &&
(virtio_has_feature(vsc, VIRTIO_NET_F_GUEST_TSO4) ||
virtio_has_feature(vsc, VIRTIO_NET_F_GUEST_TSO6))) {
ifp->if_xflags |= IFXF_LRO;
ifp->if_capabilities |= IFCAP_LRO;
}
ifq_init_maxlen(&ifp->if_snd, vsc->sc_vqs[1].vq_num - 1); ifq_init_maxlen(&ifp->if_snd, vsc->sc_vqs[1].vq_num - 1);
ifmedia_init(&sc->sc_media, 0, vio_media_change, vio_media_status); ifmedia_init(&sc->sc_media, 0, vio_media_change, vio_media_status);
@ -808,7 +815,7 @@ vio_init(struct ifnet *ifp)
struct vio_queue *vioq = &sc->sc_q[qidx]; struct vio_queue *vioq = &sc->sc_q[qidx];
if_rxr_init(&vioq->viq_rxring, if_rxr_init(&vioq->viq_rxring,
2 * ((ifp->if_hardmtu / MCLBYTES) + 1), 2 * ((ifp->if_hardmtu / sc->sc_rx_mbuf_size) + 1),
vioq->viq_rxvq->vq_num); vioq->viq_rxvq->vq_num);
vio_populate_rx_mbufs(sc, vioq); vio_populate_rx_mbufs(sc, vioq);
} }
@ -1102,7 +1109,7 @@ vio_ioctl(struct ifnet *ifp, u_long cmd, caddr_t data)
break; break;
case SIOCGIFRXR: case SIOCGIFRXR:
r = if_rxr_ioctl((struct if_rxrinfo *)ifr->ifr_data, r = if_rxr_ioctl((struct if_rxrinfo *)ifr->ifr_data,
NULL, MCLBYTES, &sc->sc_q[0].viq_rxring); NULL, sc->sc_rx_mbuf_size, &sc->sc_q[0].viq_rxring);
break; break;
default: default:
r = ether_ioctl(ifp, &sc->sc_ac, cmd, data); r = ether_ioctl(ifp, &sc->sc_ac, cmd, data);
@ -1127,7 +1134,7 @@ vio_add_rx_mbuf(struct vio_softc *sc, struct vio_queue *vioq, int i)
struct mbuf *m; struct mbuf *m;
int r; int r;
m = MCLGETL(NULL, M_DONTWAIT, MCLBYTES); m = MCLGETL(NULL, M_DONTWAIT, sc->sc_rx_mbuf_size);
if (m == NULL) if (m == NULL)
return ENOBUFS; return ENOBUFS;
vioq->viq_rxmbufs[i] = m; vioq->viq_rxmbufs[i] = m;
@ -1199,7 +1206,8 @@ vio_populate_rx_mbufs(struct vio_softc *sc, struct vio_queue *vioq)
virtio_enqueue_p(vq, slot, vioq->viq_rxdmamaps[slot], virtio_enqueue_p(vq, slot, vioq->viq_rxdmamaps[slot],
0, sc->sc_hdr_size, 0); 0, sc->sc_hdr_size, 0);
virtio_enqueue_p(vq, slot, vioq->viq_rxdmamaps[slot], virtio_enqueue_p(vq, slot, vioq->viq_rxdmamaps[slot],
sc->sc_hdr_size, MCLBYTES - sc->sc_hdr_size, 0); sc->sc_hdr_size,
sc->sc_rx_mbuf_size - sc->sc_hdr_size, 0);
} }
virtio_enqueue_commit(vsc, vq, slot, 0); virtio_enqueue_commit(vsc, vq, slot, 0);
done = 1; done = 1;

View file

@ -1,4 +1,4 @@
/* $OpenBSD: kern_resource.c,v 1.88 2024/08/20 13:29:25 mvs Exp $ */ /* $OpenBSD: kern_resource.c,v 1.90 2024/10/03 10:20:05 claudio Exp $ */
/* $NetBSD: kern_resource.c,v 1.38 1996/10/23 07:19:38 matthias Exp $ */ /* $NetBSD: kern_resource.c,v 1.38 1996/10/23 07:19:38 matthias Exp $ */
/*- /*-
@ -555,9 +555,10 @@ dogetrusage(struct proc *p, int who, struct rusage *rup)
} }
void void
ruadd(struct rusage *ru, struct rusage *ru2) ruadd(struct rusage *ru, const struct rusage *ru2)
{ {
long *ip, *ip2; long *ip;
const long *ip2;
int i; int i;
timeradd(&ru->ru_utime, &ru2->ru_utime, &ru->ru_utime); timeradd(&ru->ru_utime, &ru2->ru_utime, &ru->ru_utime);
@ -577,19 +578,22 @@ void
rucheck(void *arg) rucheck(void *arg)
{ {
struct rlimit rlim; struct rlimit rlim;
struct tusage tu = { 0 };
struct process *pr = arg; struct process *pr = arg;
struct proc *q;
time_t runtime; time_t runtime;
KERNEL_ASSERT_LOCKED(); KERNEL_ASSERT_LOCKED();
SCHED_LOCK();
runtime = pr->ps_tu.tu_runtime.tv_sec;
SCHED_UNLOCK();
mtx_enter(&pr->ps_mtx); mtx_enter(&pr->ps_mtx);
rlim = pr->ps_limit->pl_rlimit[RLIMIT_CPU]; rlim = pr->ps_limit->pl_rlimit[RLIMIT_CPU];
tuagg_sumup(&tu, &pr->ps_tu);
TAILQ_FOREACH(q, &pr->ps_threads, p_thr_link)
tuagg_sumup(&tu, &q->p_tu);
mtx_leave(&pr->ps_mtx); mtx_leave(&pr->ps_mtx);
runtime = tu.tu_runtime.tv_sec;
if ((rlim_t)runtime >= rlim.rlim_cur) { if ((rlim_t)runtime >= rlim.rlim_cur) {
if ((rlim_t)runtime >= rlim.rlim_max) { if ((rlim_t)runtime >= rlim.rlim_max) {
prsignal(pr, SIGKILL); prsignal(pr, SIGKILL);

View file

@ -1,4 +1,4 @@
/* $OpenBSD: kern_sig.c,v 1.338 2024/08/10 09:18:09 jsg Exp $ */ /* $OpenBSD: kern_sig.c,v 1.339 2024/10/01 08:28:34 claudio Exp $ */
/* $NetBSD: kern_sig.c,v 1.54 1996/04/22 01:38:32 christos Exp $ */ /* $NetBSD: kern_sig.c,v 1.54 1996/04/22 01:38:32 christos Exp $ */
/* /*
@ -840,7 +840,9 @@ trapsignal(struct proc *p, int signum, u_long trapno, int code,
SCHED_UNLOCK(); SCHED_UNLOCK();
signum = pr->ps_xsig; signum = pr->ps_xsig;
if ((p->p_flag & P_TRACESINGLE) == 0)
single_thread_clear(p, 0); single_thread_clear(p, 0);
atomic_clearbits_int(&p->p_flag, P_TRACESINGLE);
/* /*
* If we are no longer being traced, or the parent * If we are no longer being traced, or the parent
@ -1359,7 +1361,9 @@ cursig(struct proc *p, struct sigctx *sctx)
atomic_clearbits_int(&pr->ps_siglist, mask); atomic_clearbits_int(&pr->ps_siglist, mask);
} }
if ((p->p_flag & P_TRACESINGLE) == 0)
single_thread_clear(p, 0); single_thread_clear(p, 0);
atomic_clearbits_int(&p->p_flag, P_TRACESINGLE);
/* /*
* If we are no longer being traced, or the parent * If we are no longer being traced, or the parent

View file

@ -1,4 +1,4 @@
/* $OpenBSD: kern_time.c,v 1.169 2024/07/26 19:16:31 guenther Exp $ */ /* $OpenBSD: kern_time.c,v 1.170 2024/10/03 10:18:29 claudio Exp $ */
/* $NetBSD: kern_time.c,v 1.20 1996/02/18 11:57:06 fvdl Exp $ */ /* $NetBSD: kern_time.c,v 1.20 1996/02/18 11:57:06 fvdl Exp $ */
/* /*
@ -147,8 +147,10 @@ clock_gettime(struct proc *p, clockid_t clock_id, struct timespec *tp)
q = tfind_user(__CLOCK_PTID(clock_id), p->p_p); q = tfind_user(__CLOCK_PTID(clock_id), p->p_p);
if (q == NULL) if (q == NULL)
error = ESRCH; error = ESRCH;
else else {
*tp = q->p_tu.tu_runtime; tuagg_get_proc(&tu, q);
*tp = tu.tu_runtime;
}
KERNEL_UNLOCK(); KERNEL_UNLOCK();
} else } else
error = EINVAL; error = EINVAL;

View file

@ -1,4 +1,4 @@
/* $OpenBSD: sys_process.c,v 1.99 2024/09/30 12:32:26 claudio Exp $ */ /* $OpenBSD: sys_process.c,v 1.100 2024/10/01 08:28:34 claudio Exp $ */
/* $NetBSD: sys_process.c,v 1.55 1996/05/15 06:17:47 tls Exp $ */ /* $NetBSD: sys_process.c,v 1.55 1996/05/15 06:17:47 tls Exp $ */
/*- /*-
@ -441,6 +441,13 @@ ptrace_ctrl(struct proc *p, int req, pid_t pid, caddr_t addr, int data)
if (pid < THREAD_PID_OFFSET && tr->ps_single) if (pid < THREAD_PID_OFFSET && tr->ps_single)
t = tr->ps_single; t = tr->ps_single;
else if (t == tr->ps_single)
atomic_setbits_int(&t->p_flag, P_TRACESINGLE);
else {
error = EINVAL;
goto fail;
}
/* If the address parameter is not (int *)1, set the pc. */ /* If the address parameter is not (int *)1, set the pc. */
if ((int *)addr != (int *)1) if ((int *)addr != (int *)1)

View file

@ -1,4 +1,4 @@
/* $OpenBSD: proc.h,v 1.371 2024/09/01 03:09:00 jsg Exp $ */ /* $OpenBSD: proc.h,v 1.372 2024/10/01 08:28:34 claudio Exp $ */
/* $NetBSD: proc.h,v 1.44 1996/04/22 01:23:21 christos Exp $ */ /* $NetBSD: proc.h,v 1.44 1996/04/22 01:23:21 christos Exp $ */
/*- /*-
@ -436,6 +436,7 @@ struct proc {
#define P_SINTR 0x00000080 /* Sleep is interruptible. */ #define P_SINTR 0x00000080 /* Sleep is interruptible. */
#define P_SYSTEM 0x00000200 /* No sigs, stats or swapping. */ #define P_SYSTEM 0x00000200 /* No sigs, stats or swapping. */
#define P_TIMEOUT 0x00000400 /* Timing out during sleep. */ #define P_TIMEOUT 0x00000400 /* Timing out during sleep. */
#define P_TRACESINGLE 0x00001000 /* Ptrace: keep single threaded. */
#define P_WEXIT 0x00002000 /* Working on exiting. */ #define P_WEXIT 0x00002000 /* Working on exiting. */
#define P_OWEUPC 0x00008000 /* Owe proc an addupc() at next ast. */ #define P_OWEUPC 0x00008000 /* Owe proc an addupc() at next ast. */
#define P_SUSPSINGLE 0x00080000 /* Need to stop for single threading. */ #define P_SUSPSINGLE 0x00080000 /* Need to stop for single threading. */
@ -446,8 +447,8 @@ struct proc {
#define P_BITS \ #define P_BITS \
("\20" "\01INKTR" "\02PROFPEND" "\03ALRMPEND" "\04SIGSUSPEND" \ ("\20" "\01INKTR" "\02PROFPEND" "\03ALRMPEND" "\04SIGSUSPEND" \
"\05CANTSLEEP" "\06WSLEEP" "\010SINTR" "\012SYSTEM" "\013TIMEOUT" \ "\05CANTSLEEP" "\06WSLEEP" "\010SINTR" "\012SYSTEM" "\013TIMEOUT" \
"\016WEXIT" "\020OWEUPC" "\024SUSPSINGLE" "\033THREAD" \ "\015TRACESINGLE" "\016WEXIT" "\020OWEUPC" "\024SUSPSINGLE" \
"\034SUSPSIG" "\037CPUPEG") "\033THREAD" "\034SUSPSIG" "\037CPUPEG")
#define THREAD_PID_OFFSET 100000 #define THREAD_PID_OFFSET 100000

View file

@ -1,4 +1,4 @@
/* $OpenBSD: resourcevar.h,v 1.32 2024/07/08 13:17:12 claudio Exp $ */ /* $OpenBSD: resourcevar.h,v 1.33 2024/10/01 09:22:25 claudio Exp $ */
/* $NetBSD: resourcevar.h,v 1.12 1995/11/22 23:01:53 cgd Exp $ */ /* $NetBSD: resourcevar.h,v 1.12 1995/11/22 23:01:53 cgd Exp $ */
/* /*
@ -107,7 +107,7 @@ lim_cur(int which)
rlim_t lim_cur_proc(struct proc *, int); rlim_t lim_cur_proc(struct proc *, int);
void ruadd(struct rusage *, struct rusage *); void ruadd(struct rusage *, const struct rusage *);
void rucheck(void *); void rucheck(void *);
#endif #endif

View file

@ -1,4 +1,4 @@
/* $OpenBSD: uvm_pdaemon.c,v 1.115 2024/09/30 08:09:39 mpi Exp $ */ /* $OpenBSD: uvm_pdaemon.c,v 1.117 2024/10/02 10:36:33 mpi Exp $ */
/* $NetBSD: uvm_pdaemon.c,v 1.23 2000/08/20 10:24:14 bjh21 Exp $ */ /* $NetBSD: uvm_pdaemon.c,v 1.23 2000/08/20 10:24:14 bjh21 Exp $ */
/* /*
@ -103,8 +103,8 @@ extern unsigned long drmbackoff(long);
struct rwlock *uvmpd_trylockowner(struct vm_page *); struct rwlock *uvmpd_trylockowner(struct vm_page *);
void uvmpd_scan(struct uvm_pmalloc *, struct uvm_constraint_range *); void uvmpd_scan(struct uvm_pmalloc *, struct uvm_constraint_range *);
void uvmpd_scan_inactive(struct uvm_pmalloc *, int uvmpd_scan_inactive(struct uvm_pmalloc *,
struct uvm_constraint_range *, struct pglist *); struct uvm_constraint_range *);
void uvmpd_tune(void); void uvmpd_tune(void);
void uvmpd_drop(struct pglist *); void uvmpd_drop(struct pglist *);
int uvmpd_dropswap(struct vm_page *); int uvmpd_dropswap(struct vm_page *);
@ -418,11 +418,12 @@ uvmpd_dropswap(struct vm_page *pg)
* => we handle the building of swap-backed clusters * => we handle the building of swap-backed clusters
* => we return TRUE if we are exiting because we met our target * => we return TRUE if we are exiting because we met our target
*/ */
void int
uvmpd_scan_inactive(struct uvm_pmalloc *pma, uvmpd_scan_inactive(struct uvm_pmalloc *pma,
struct uvm_constraint_range *constraint, struct pglist *pglst) struct uvm_constraint_range *constraint)
{ {
int free, result; struct pglist *pglst = &uvm.page_inactive;
int free, result, freed = 0;
struct vm_page *p, *nextpg; struct vm_page *p, *nextpg;
struct uvm_object *uobj; struct uvm_object *uobj;
struct vm_page *pps[SWCLUSTPAGES], **ppsp; struct vm_page *pps[SWCLUSTPAGES], **ppsp;
@ -468,7 +469,7 @@ uvmpd_scan_inactive(struct uvm_pmalloc *pma,
*/ */
free = uvmexp.free - BUFPAGES_DEFICIT; free = uvmexp.free - BUFPAGES_DEFICIT;
if (((pma == NULL || (pma->pm_flags & UVM_PMA_FREED)) && if (((pma == NULL || (pma->pm_flags & UVM_PMA_FREED)) &&
(free + uvmexp.paging >= uvmexp.freetarg << 2)) || (free + uvmexp.paging >= uvmexp.freetarg)) ||
dirtyreacts == UVMPD_NUMDIRTYREACTS) { dirtyreacts == UVMPD_NUMDIRTYREACTS) {
if (swslot == 0) { if (swslot == 0) {
/* exit now if no swap-i/o pending */ /* exit now if no swap-i/o pending */
@ -542,7 +543,7 @@ uvmpd_scan_inactive(struct uvm_pmalloc *pma,
/* zap all mappings with pmap_page_protect... */ /* zap all mappings with pmap_page_protect... */
pmap_page_protect(p, PROT_NONE); pmap_page_protect(p, PROT_NONE);
uvm_pagefree(p); uvm_pagefree(p);
uvmexp.pdfreed++; freed++;
if (anon) { if (anon) {
@ -565,7 +566,7 @@ uvmpd_scan_inactive(struct uvm_pmalloc *pma,
* free target when all the current pageouts complete. * free target when all the current pageouts complete.
*/ */
if ((pma == NULL || (pma->pm_flags & UVM_PMA_FREED)) && if ((pma == NULL || (pma->pm_flags & UVM_PMA_FREED)) &&
(free + uvmexp.paging > uvmexp.freetarg << 2)) { (free + uvmexp.paging > uvmexp.freetarg)) {
rw_exit(slock); rw_exit(slock);
continue; continue;
} }
@ -846,6 +847,8 @@ uvmpd_scan_inactive(struct uvm_pmalloc *pma,
uvm_lock_pageq(); uvm_lock_pageq();
} }
} }
return freed;
} }
/* /*
@ -890,10 +893,8 @@ uvmpd_scan(struct uvm_pmalloc *pma, struct uvm_constraint_range *constraint)
* we work on meeting our inactive target by converting active pages * we work on meeting our inactive target by converting active pages
* to inactive ones. * to inactive ones.
*/ */
pages_freed = uvmpd_scan_inactive(pma, constraint);
pages_freed = uvmexp.pdfreed; uvmexp.pdfreed += pages_freed;
(void) uvmpd_scan_inactive(pma, constraint, &uvm.page_inactive);
pages_freed = uvmexp.pdfreed - pages_freed;
/* /*
* we have done the scan to get free pages. now we work on meeting * we have done the scan to get free pages. now we work on meeting

View file

@ -1,4 +1,4 @@
/* $OpenBSD: uvm_pmemrange.c,v 1.67 2024/08/18 08:18:49 mpi Exp $ */ /* $OpenBSD: uvm_pmemrange.c,v 1.68 2024/10/02 10:17:28 mpi Exp $ */
/* /*
* Copyright (c) 2024 Martin Pieuchot <mpi@openbsd.org> * Copyright (c) 2024 Martin Pieuchot <mpi@openbsd.org>
@ -2279,7 +2279,7 @@ uvm_pmr_cache_get(int flags)
return pg; return pg;
} }
void unsigned int
uvm_pmr_cache_free(struct uvm_pmr_cache_item *upci) uvm_pmr_cache_free(struct uvm_pmr_cache_item *upci)
{ {
struct pglist pgl; struct pglist pgl;
@ -2296,6 +2296,8 @@ uvm_pmr_cache_free(struct uvm_pmr_cache_item *upci)
atomic_sub_int(&uvmexp.percpucaches, upci->upci_npages); atomic_sub_int(&uvmexp.percpucaches, upci->upci_npages);
upci->upci_npages = 0; upci->upci_npages = 0;
memset(upci->upci_pages, 0, sizeof(upci->upci_pages)); memset(upci->upci_pages, 0, sizeof(upci->upci_pages));
return i;
} }
void void
@ -2337,16 +2339,19 @@ uvm_pmr_cache_put(struct vm_page *pg)
splx(s); splx(s);
} }
void unsigned int
uvm_pmr_cache_drain(void) uvm_pmr_cache_drain(void)
{ {
struct uvm_pmr_cache *upc = &curcpu()->ci_uvm; struct uvm_pmr_cache *upc = &curcpu()->ci_uvm;
unsigned int freed = 0;
int s; int s;
s = splvm(); s = splvm();
uvm_pmr_cache_free(&upc->upc_magz[0]); freed += uvm_pmr_cache_free(&upc->upc_magz[0]);
uvm_pmr_cache_free(&upc->upc_magz[1]); freed += uvm_pmr_cache_free(&upc->upc_magz[1]);
splx(s); splx(s);
return freed;
} }
#else /* !(MULTIPROCESSOR && __HAVE_UVM_PERCPU) */ #else /* !(MULTIPROCESSOR && __HAVE_UVM_PERCPU) */
@ -2363,8 +2368,9 @@ uvm_pmr_cache_put(struct vm_page *pg)
uvm_pmr_freepages(pg, 1); uvm_pmr_freepages(pg, 1);
} }
void unsigned int
uvm_pmr_cache_drain(void) uvm_pmr_cache_drain(void)
{ {
return 0;
} }
#endif #endif

View file

@ -1,4 +1,4 @@
/* $OpenBSD: uvm_pmemrange.h,v 1.17 2024/05/01 12:54:27 mpi Exp $ */ /* $OpenBSD: uvm_pmemrange.h,v 1.18 2024/10/02 10:17:28 mpi Exp $ */
/* /*
* Copyright (c) 2009 Ariane van der Steldt <ariane@stack.nl> * Copyright (c) 2009 Ariane van der Steldt <ariane@stack.nl>
@ -149,7 +149,7 @@ struct vm_page *uvm_pmr_extract_range(struct uvm_pmemrange *,
struct pglist *); struct pglist *);
struct vm_page *uvm_pmr_cache_get(int); struct vm_page *uvm_pmr_cache_get(int);
void uvm_pmr_cache_put(struct vm_page *); void uvm_pmr_cache_put(struct vm_page *);
void uvm_pmr_cache_drain(void); unsigned int uvm_pmr_cache_drain(void);
#endif /* _UVM_UVM_PMEMRANGE_H_ */ #endif /* _UVM_UVM_PMEMRANGE_H_ */

View file

@ -1,4 +1,4 @@
/* $OpenBSD: generate.c,v 1.7 2024/02/27 06:58:19 anton Exp $ */ /* $OpenBSD: generate.c,v 1.8 2024/10/02 12:31:33 claudio Exp $ */
/* /*
* Copyright (c) 2017 Martin Pieuchot * Copyright (c) 2017 Martin Pieuchot
@ -208,6 +208,8 @@ imcs_add_type(struct imcs *imcs, struct itype *it)
ctt.ctt_size = 4; ctt.ctt_size = 4;
else if (size <= 64) else if (size <= 64)
ctt.ctt_size = 8; ctt.ctt_size = 8;
else if (size <= 96)
ctt.ctt_size = 12;
else else
ctt.ctt_size = 16; ctt.ctt_size = 16;
} else } else

View file

@ -1,4 +1,4 @@
/* $OpenBSD: cmd-send-keys.c,v 1.75 2023/01/16 11:26:14 nicm Exp $ */ /* $OpenBSD: cmd-send-keys.c,v 1.76 2024/10/01 06:15:47 nicm Exp $ */
/* /*
* Copyright (c) 2008 Nicholas Marriott <nicholas.marriott@gmail.com> * Copyright (c) 2008 Nicholas Marriott <nicholas.marriott@gmail.com>
@ -73,11 +73,13 @@ cmd_send_keys_inject_key(struct cmdq_item *item, struct cmdq_item *after,
if (args_has(args, 'K')) { if (args_has(args, 'K')) {
if (tc == NULL) if (tc == NULL)
return (item); return (item);
event = xmalloc(sizeof *event); event = xcalloc(1, sizeof *event);
event->key = key|KEYC_SENT; event->key = key|KEYC_SENT;
memset(&event->m, 0, sizeof event->m); memset(&event->m, 0, sizeof event->m);
if (server_client_handle_key(tc, event) == 0) if (server_client_handle_key(tc, event) == 0) {
free(event->buf);
free(event); free(event);
}
return (item); return (item);
} }

View file

@ -1,4 +1,4 @@
/* $OpenBSD: input-keys.c,v 1.98 2024/08/26 07:45:05 nicm Exp $ */ /* $OpenBSD: input-keys.c,v 1.101 2024/10/03 05:41:59 nicm Exp $ */
/* /*
* Copyright (c) 2007 Nicholas Marriott <nicholas.marriott@gmail.com> * Copyright (c) 2007 Nicholas Marriott <nicholas.marriott@gmail.com>
@ -499,9 +499,12 @@ input_key_vt10x(struct bufferevent *bev, key_code key)
return (0); return (0);
} }
/* Prevent TAB and RET from being swallowed by C0 remapping logic. */ /*
* Prevent TAB, CR and LF from being swallowed by the C0 remapping
* logic.
*/
onlykey = key & KEYC_MASK_KEY; onlykey = key & KEYC_MASK_KEY;
if (onlykey == '\r' || onlykey == '\t') if (onlykey == '\r' || onlykey == '\n' || onlykey == '\t')
key &= ~KEYC_CTRL; key &= ~KEYC_CTRL;
/* /*

View file

@ -1,4 +1,4 @@
/* $OpenBSD: mode-tree.c,v 1.69 2024/08/21 04:17:09 nicm Exp $ */ /* $OpenBSD: mode-tree.c,v 1.70 2024/10/01 10:10:29 nicm Exp $ */
/* /*
* Copyright (c) 2017 Nicholas Marriott <nicholas.marriott@gmail.com> * Copyright (c) 2017 Nicholas Marriott <nicholas.marriott@gmail.com>
@ -30,6 +30,12 @@ enum mode_tree_search_dir {
MODE_TREE_SEARCH_BACKWARD MODE_TREE_SEARCH_BACKWARD
}; };
enum mode_tree_preview {
MODE_TREE_PREVIEW_OFF,
MODE_TREE_PREVIEW_NORMAL,
MODE_TREE_PREVIEW_BIG
};
struct mode_tree_item; struct mode_tree_item;
TAILQ_HEAD(mode_tree_list, mode_tree_item); TAILQ_HEAD(mode_tree_list, mode_tree_item);
@ -414,7 +420,12 @@ mode_tree_start(struct window_pane *wp, struct args *args,
mtd->sort_list = sort_list; mtd->sort_list = sort_list;
mtd->sort_size = sort_size; mtd->sort_size = sort_size;
mtd->preview = !args_has(args, 'N'); if (args_has(args, 'N') > 1)
mtd->preview = MODE_TREE_PREVIEW_BIG;
else if (args_has(args, 'N'))
mtd->preview = MODE_TREE_PREVIEW_OFF;
else
mtd->preview = MODE_TREE_PREVIEW_NORMAL;
sort = args_get(args, 'O'); sort = args_get(args, 'O');
if (sort != NULL) { if (sort != NULL) {
@ -470,12 +481,21 @@ mode_tree_set_height(struct mode_tree_data *mtd)
if (height < screen_size_y(s)) if (height < screen_size_y(s))
mtd->height = screen_size_y(s) - height; mtd->height = screen_size_y(s) - height;
} else { } else {
if (mtd->preview == MODE_TREE_PREVIEW_NORMAL) {
mtd->height = (screen_size_y(s) / 3) * 2; mtd->height = (screen_size_y(s) / 3) * 2;
if (mtd->height > mtd->line_size) if (mtd->height > mtd->line_size)
mtd->height = screen_size_y(s) / 2; mtd->height = screen_size_y(s) / 2;
}
if (mtd->height < 10) if (mtd->height < 10)
mtd->height = screen_size_y(s); mtd->height = screen_size_y(s);
} else if (mtd->preview == MODE_TREE_PREVIEW_BIG) {
mtd->height = screen_size_y(s) / 4;
if (mtd->height > mtd->line_size)
mtd->height = mtd->line_size;
if (mtd->height < 2)
mtd->height = 2;
} else
mtd->height = screen_size_y(s);
}
if (screen_size_y(s) - mtd->height < 2) if (screen_size_y(s) - mtd->height < 2)
mtd->height = screen_size_y(s); mtd->height = screen_size_y(s);
} }
@ -510,7 +530,7 @@ mode_tree_build(struct mode_tree_data *mtd)
mode_tree_set_current(mtd, tag); mode_tree_set_current(mtd, tag);
mtd->width = screen_size_x(s); mtd->width = screen_size_x(s);
if (mtd->preview) if (mtd->preview != MODE_TREE_PREVIEW_OFF)
mode_tree_set_height(mtd); mode_tree_set_height(mtd);
else else
mtd->height = screen_size_y(s); mtd->height = screen_size_y(s);
@ -742,8 +762,11 @@ mode_tree_draw(struct mode_tree_data *mtd)
} }
} }
if (mtd->preview == MODE_TREE_PREVIEW_OFF)
goto done;
sy = screen_size_y(s); sy = screen_size_y(s);
if (!mtd->preview || sy <= 4 || h <= 4 || sy - h <= 4 || w <= 4) if (sy <= 4 || h < 2 || sy - h <= 4 || w <= 4)
goto done; goto done;
line = &mtd->line_list[mtd->current]; line = &mtd->line_list[mtd->current];
@ -1041,7 +1064,7 @@ mode_tree_key(struct mode_tree_data *mtd, struct client *c, key_code *key,
if (x > mtd->width || y > mtd->height) { if (x > mtd->width || y > mtd->height) {
if (*key == KEYC_MOUSEDOWN3_PANE) if (*key == KEYC_MOUSEDOWN3_PANE)
mode_tree_display_menu(mtd, c, x, y, 1); mode_tree_display_menu(mtd, c, x, y, 1);
if (!mtd->preview) if (mtd->preview == MODE_TREE_PREVIEW_OFF)
*key = KEYC_NONE; *key = KEYC_NONE;
return (0); return (0);
} }
@ -1232,9 +1255,19 @@ mode_tree_key(struct mode_tree_data *mtd, struct client *c, key_code *key,
PROMPT_NOFORMAT, PROMPT_TYPE_SEARCH); PROMPT_NOFORMAT, PROMPT_TYPE_SEARCH);
break; break;
case 'v': case 'v':
mtd->preview = !mtd->preview; switch (mtd->preview) {
case MODE_TREE_PREVIEW_OFF:
mtd->preview = MODE_TREE_PREVIEW_BIG;
break;
case MODE_TREE_PREVIEW_NORMAL:
mtd->preview = MODE_TREE_PREVIEW_OFF;
break;
case MODE_TREE_PREVIEW_BIG:
mtd->preview = MODE_TREE_PREVIEW_NORMAL;
break;
}
mode_tree_build(mtd); mode_tree_build(mtd);
if (mtd->preview) if (mtd->preview != MODE_TREE_PREVIEW_OFF)
mode_tree_check_selected(mtd); mode_tree_check_selected(mtd);
break; break;
} }

View file

@ -1,4 +1,4 @@
/* $OpenBSD: options-table.c,v 1.178 2024/09/16 20:28:22 nicm Exp $ */ /* $OpenBSD: options-table.c,v 1.179 2024/10/02 11:51:15 nicm Exp $ */
/* /*
* Copyright (c) 2011 Nicholas Marriott <nicholas.marriott@gmail.com> * Copyright (c) 2011 Nicholas Marriott <nicholas.marriott@gmail.com>
@ -824,7 +824,7 @@ const struct options_table_entry options_table[] = {
.type = OPTIONS_TABLE_STRING, .type = OPTIONS_TABLE_STRING,
.scope = OPTIONS_TABLE_SESSION, .scope = OPTIONS_TABLE_SESSION,
.flags = OPTIONS_TABLE_IS_ARRAY, .flags = OPTIONS_TABLE_IS_ARRAY,
.default_str = "DISPLAY KRB5CCNAME SSH_ASKPASS SSH_AUTH_SOCK " .default_str = "DISPLAY KRB5CCNAME MSYSTEM SSH_ASKPASS SSH_AUTH_SOCK "
"SSH_AGENT_PID SSH_CONNECTION WINDOWID XAUTHORITY", "SSH_AGENT_PID SSH_CONNECTION WINDOWID XAUTHORITY",
.text = "List of environment variables to update in the session " .text = "List of environment variables to update in the session "
"environment when a client is attached." "environment when a client is attached."

View file

@ -1,4 +1,4 @@
/* $OpenBSD: screen.c,v 1.86 2024/08/21 04:17:09 nicm Exp $ */ /* $OpenBSD: screen.c,v 1.87 2024/10/01 08:01:19 nicm Exp $ */
/* /*
* Copyright (c) 2007 Nicholas Marriott <nicholas.marriott@gmail.com> * Copyright (c) 2007 Nicholas Marriott <nicholas.marriott@gmail.com>
@ -170,6 +170,20 @@ screen_reset_tabs(struct screen *s)
bit_set(s->tabs, i); bit_set(s->tabs, i);
} }
/* Set default cursor style and colour from options. */
void
screen_set_default_cursor(struct screen *s, struct options *oo)
{
int c;
c = options_get_number(oo, "cursor-colour");
s->default_ccolour = c;
c = options_get_number(oo, "cursor-style");
s->default_mode = 0;
screen_set_cursor_style(c, &s->default_cstyle, &s->default_mode);
}
/* Set screen cursor style and mode. */ /* Set screen cursor style and mode. */
void void
screen_set_cursor_style(u_int style, enum screen_cursor_style *cstyle, screen_set_cursor_style(u_int style, enum screen_cursor_style *cstyle,

View file

@ -1,4 +1,4 @@
/* $OpenBSD: server-client.c,v 1.409 2024/09/16 20:28:22 nicm Exp $ */ /* $OpenBSD: server-client.c,v 1.410 2024/10/01 06:15:47 nicm Exp $ */
/* /*
* Copyright (c) 2009 Nicholas Marriott <nicholas.marriott@gmail.com> * Copyright (c) 2009 Nicholas Marriott <nicholas.marriott@gmail.com>
@ -46,8 +46,6 @@ static void server_client_check_modes(struct client *);
static void server_client_set_title(struct client *); static void server_client_set_title(struct client *);
static void server_client_set_path(struct client *); static void server_client_set_path(struct client *);
static void server_client_reset_state(struct client *); static void server_client_reset_state(struct client *);
static int server_client_is_bracket_pasting(struct client *, key_code);
static int server_client_assume_paste(struct session *);
static void server_client_update_latest(struct client *); static void server_client_update_latest(struct client *);
static void server_client_dispatch(struct imsg *, void *); static void server_client_dispatch(struct imsg *, void *);
@ -1801,18 +1799,18 @@ out:
/* Is this a bracket paste key? */ /* Is this a bracket paste key? */
static int static int
server_client_is_bracket_pasting(struct client *c, key_code key) server_client_is_bracket_paste(struct client *c, key_code key)
{ {
if (key == KEYC_PASTE_START) { if (key == KEYC_PASTE_START) {
c->flags |= CLIENT_BRACKETPASTING; c->flags |= CLIENT_BRACKETPASTING;
log_debug("%s: bracket paste on", c->name); log_debug("%s: bracket paste on", c->name);
return (1); return (0);
} }
if (key == KEYC_PASTE_END) { if (key == KEYC_PASTE_END) {
c->flags &= ~CLIENT_BRACKETPASTING; c->flags &= ~CLIENT_BRACKETPASTING;
log_debug("%s: bracket paste off", c->name); log_debug("%s: bracket paste off", c->name);
return (1); return (0);
} }
return !!(c->flags & CLIENT_BRACKETPASTING); return !!(c->flags & CLIENT_BRACKETPASTING);
@ -1820,25 +1818,29 @@ server_client_is_bracket_pasting(struct client *c, key_code key)
/* Is this fast enough to probably be a paste? */ /* Is this fast enough to probably be a paste? */
static int static int
server_client_assume_paste(struct session *s) server_client_is_assume_paste(struct client *c)
{ {
struct session *s = c->session;
struct timeval tv; struct timeval tv;
int t; int t;
if (c->flags & CLIENT_BRACKETPASTING)
return (0);
if ((t = options_get_number(s->options, "assume-paste-time")) == 0) if ((t = options_get_number(s->options, "assume-paste-time")) == 0)
return (0); return (0);
timersub(&s->activity_time, &s->last_activity_time, &tv); timersub(&c->activity_time, &c->last_activity_time, &tv);
if (tv.tv_sec == 0 && tv.tv_usec < t * 1000) { if (tv.tv_sec == 0 && tv.tv_usec < t * 1000) {
log_debug("session %s pasting (flag %d)", s->name, if (c->flags & CLIENT_ASSUMEPASTING)
!!(s->flags & SESSION_PASTING));
if (s->flags & SESSION_PASTING)
return (1); return (1);
s->flags |= SESSION_PASTING; c->flags |= CLIENT_ASSUMEPASTING;
log_debug("%s: assume paste on", c->name);
return (0); return (0);
} }
log_debug("session %s not pasting", s->name); if (c->flags & CLIENT_ASSUMEPASTING) {
s->flags &= ~SESSION_PASTING; c->flags &= ~CLIENT_ASSUMEPASTING;
log_debug("%s: assume paste off", c->name);
}
return (0); return (0);
} }
@ -1891,6 +1893,8 @@ server_client_key_callback(struct cmdq_item *item, void *data)
wl = s->curw; wl = s->curw;
/* Update the activity timer. */ /* Update the activity timer. */
memcpy(&c->last_activity_time, &c->activity_time,
sizeof c->last_activity_time);
if (gettimeofday(&c->activity_time, NULL) != 0) if (gettimeofday(&c->activity_time, NULL) != 0)
fatal("gettimeofday failed"); fatal("gettimeofday failed");
session_update_activity(s, &c->activity_time); session_update_activity(s, &c->activity_time);
@ -1928,14 +1932,16 @@ server_client_key_callback(struct cmdq_item *item, void *data)
goto forward_key; goto forward_key;
/* Forward if bracket pasting. */ /* Forward if bracket pasting. */
if (server_client_is_bracket_pasting(c, key)) if (server_client_is_bracket_paste (c, key))
goto forward_key; goto paste_key;
/* Treat everything as a regular key when pasting is detected. */ /* Treat everything as a regular key when pasting is detected. */
if (!KEYC_IS_MOUSE(key) && if (!KEYC_IS_MOUSE(key) &&
key != KEYC_FOCUS_IN &&
key != KEYC_FOCUS_OUT &&
(~key & KEYC_SENT) && (~key & KEYC_SENT) &&
server_client_assume_paste(s)) server_client_is_assume_paste(c))
goto forward_key; goto paste_key;
/* /*
* Work out the current key table. If the pane is in a mode, use * Work out the current key table. If the pane is in a mode, use
@ -2104,10 +2110,20 @@ forward_key:
goto out; goto out;
if (wp != NULL) if (wp != NULL)
window_pane_key(wp, c, s, wl, key, m); window_pane_key(wp, c, s, wl, key, m);
goto out;
paste_key:
if (c->flags & CLIENT_READONLY)
goto out;
if (event->buf != NULL)
window_pane_paste(wp, event->buf, event->len);
key = KEYC_NONE;
goto out;
out: out:
if (s != NULL && key != KEYC_FOCUS_OUT) if (s != NULL && key != KEYC_FOCUS_OUT)
server_client_update_latest(c); server_client_update_latest(c);
free(event->buf);
free(event); free(event);
return (CMD_RETURN_NORMAL); return (CMD_RETURN_NORMAL);
} }
@ -2521,12 +2537,14 @@ server_client_click_timer(__unused int fd, __unused short events, void *data)
* Waiting for a third click that hasn't happened, so this must * Waiting for a third click that hasn't happened, so this must
* have been a double click. * have been a double click.
*/ */
event = xmalloc(sizeof *event); event = xcalloc(1, sizeof *event);
event->key = KEYC_DOUBLECLICK; event->key = KEYC_DOUBLECLICK;
memcpy(&event->m, &c->click_event, sizeof event->m); memcpy(&event->m, &c->click_event, sizeof event->m);
if (!server_client_handle_key(c, event)) if (!server_client_handle_key(c, event)) {
free(event->buf);
free(event); free(event);
} }
}
c->flags &= ~(CLIENT_DOUBLECLICK|CLIENT_TRIPLECLICK); c->flags &= ~(CLIENT_DOUBLECLICK|CLIENT_TRIPLECLICK);
} }

View file

@ -1,4 +1,4 @@
/* $OpenBSD: session.c,v 1.96 2023/09/02 08:38:37 nicm Exp $ */ /* $OpenBSD: session.c,v 1.97 2024/10/01 06:15:47 nicm Exp $ */
/* /*
* Copyright (c) 2007 Nicholas Marriott <nicholas.marriott@gmail.com> * Copyright (c) 2007 Nicholas Marriott <nicholas.marriott@gmail.com>
@ -272,19 +272,16 @@ session_lock_timer(__unused int fd, __unused short events, void *arg)
void void
session_update_activity(struct session *s, struct timeval *from) session_update_activity(struct session *s, struct timeval *from)
{ {
struct timeval *last = &s->last_activity_time;
struct timeval tv; struct timeval tv;
memcpy(last, &s->activity_time, sizeof *last);
if (from == NULL) if (from == NULL)
gettimeofday(&s->activity_time, NULL); gettimeofday(&s->activity_time, NULL);
else else
memcpy(&s->activity_time, from, sizeof s->activity_time); memcpy(&s->activity_time, from, sizeof s->activity_time);
log_debug("session $%u %s activity %lld.%06d (last %lld.%06d)", s->id, log_debug("session $%u %s activity %lld.%06d", s->id,
s->name, (long long)s->activity_time.tv_sec, s->name, (long long)s->activity_time.tv_sec,
(int)s->activity_time.tv_usec, (long long)last->tv_sec, (int)s->activity_time.tv_usec);
(int)last->tv_usec);
if (evtimer_initialized(&s->lock_timer)) if (evtimer_initialized(&s->lock_timer))
evtimer_del(&s->lock_timer); evtimer_del(&s->lock_timer);

View file

@ -1,4 +1,4 @@
.\" $OpenBSD: tmux.1,v 1.957 2024/09/16 20:46:58 nicm Exp $ .\" $OpenBSD: tmux.1,v 1.958 2024/10/01 10:10:29 nicm Exp $
.\" .\"
.\" Copyright (c) 2007 Nicholas Marriott <nicholas.marriott@gmail.com> .\" Copyright (c) 2007 Nicholas Marriott <nicholas.marriott@gmail.com>
.\" .\"
@ -14,7 +14,7 @@
.\" IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING .\" IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING
.\" OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. .\" OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
.\" .\"
.Dd $Mdocdate: September 16 2024 $ .Dd $Mdocdate: October 1 2024 $
.Dt TMUX 1 .Dt TMUX 1
.Os .Os
.Sh NAME .Sh NAME
@ -2627,7 +2627,7 @@ specifies the format for each item in the list and
.Fl K .Fl K
a format for each shortcut key; both are evaluated once for each line. a format for each shortcut key; both are evaluated once for each line.
.Fl N .Fl N
starts without the preview. starts without the preview or if given twice with the larger preview.
This command works only if at least one client is attached. This command works only if at least one client is attached.
.It Xo .It Xo
.Ic choose-tree .Ic choose-tree
@ -2711,7 +2711,7 @@ specifies the format for each item in the tree and
.Fl K .Fl K
a format for each shortcut key; both are evaluated once for each line. a format for each shortcut key; both are evaluated once for each line.
.Fl N .Fl N
starts without the preview. starts without the preview or if given twice with the larger preview.
.Fl G .Fl G
includes all sessions in any session groups in the tree rather than only the includes all sessions in any session groups in the tree rather than only the
first. first.

View file

@ -1,4 +1,4 @@
/* $OpenBSD: tmux.c,v 1.213 2024/09/29 20:05:42 nicm Exp $ */ /* $OpenBSD: tmux.c,v 1.214 2024/10/02 11:48:16 nicm Exp $ */
/* /*
* Copyright (c) 2007 Nicholas Marriott <nicholas.marriott@gmail.com> * Copyright (c) 2007 Nicholas Marriott <nicholas.marriott@gmail.com>
@ -226,7 +226,7 @@ make_label(const char *label, char **cause)
xasprintf(cause, "%s is not a directory", base); xasprintf(cause, "%s is not a directory", base);
goto fail; goto fail;
} }
if (sb.st_uid != uid || (sb.st_mode & S_IRWXO) != 0) { if (sb.st_uid != uid || (sb.st_mode & TMUX_SOCK_PERM) != 0) {
xasprintf(cause, "directory %s has unsafe permissions", base); xasprintf(cause, "directory %s has unsafe permissions", base);
goto fail; goto fail;
} }

View file

@ -1,4 +1,4 @@
/* $OpenBSD: tmux.h,v 1.1229 2024/09/30 08:10:20 nicm Exp $ */ /* $OpenBSD: tmux.h,v 1.1232 2024/10/02 11:48:16 nicm Exp $ */
/* /*
* Copyright (c) 2007 Nicholas Marriott <nicholas.marriott@gmail.com> * Copyright (c) 2007 Nicholas Marriott <nicholas.marriott@gmail.com>
@ -78,6 +78,9 @@ struct winlink;
#ifndef TMUX_SOCK #ifndef TMUX_SOCK
#define TMUX_SOCK "$TMUX_TMPDIR:" _PATH_TMP #define TMUX_SOCK "$TMUX_TMPDIR:" _PATH_TMP
#endif #endif
#ifndef TMUX_SOCK_PERM
#define TMUX_SOCK_PERM (7 /* o+rwx */)
#endif
#ifndef TMUX_TERM #ifndef TMUX_TERM
#define TMUX_TERM "screen" #define TMUX_TERM "screen"
#endif #endif
@ -1311,8 +1314,7 @@ struct session {
struct options *options; struct options *options;
#define SESSION_PASTING 0x1 #define SESSION_ALERTED 0x1
#define SESSION_ALERTED 0x2
int flags; int flags;
u_int attached; u_int attached;
@ -1392,6 +1394,9 @@ struct mouse_event {
struct key_event { struct key_event {
key_code key; key_code key;
struct mouse_event m; struct mouse_event m;
char *buf;
size_t len;
}; };
/* Terminal definition. */ /* Terminal definition. */
@ -1806,6 +1811,7 @@ struct client {
struct timeval creation_time; struct timeval creation_time;
struct timeval activity_time; struct timeval activity_time;
struct timeval last_activity_time;
struct environ *environ; struct environ *environ;
struct format_job_tree *jobs; struct format_job_tree *jobs;
@ -1872,6 +1878,7 @@ struct client {
#define CLIENT_WINDOWSIZECHANGED 0x400000000ULL #define CLIENT_WINDOWSIZECHANGED 0x400000000ULL
#define CLIENT_CLIPBOARDBUFFER 0x800000000ULL #define CLIENT_CLIPBOARDBUFFER 0x800000000ULL
#define CLIENT_BRACKETPASTING 0x1000000000ULL #define CLIENT_BRACKETPASTING 0x1000000000ULL
#define CLIENT_ASSUMEPASTING 0x2000000000ULL
#define CLIENT_ALLREDRAWFLAGS \ #define CLIENT_ALLREDRAWFLAGS \
(CLIENT_REDRAWWINDOW| \ (CLIENT_REDRAWWINDOW| \
CLIENT_REDRAWSTATUS| \ CLIENT_REDRAWSTATUS| \
@ -3010,6 +3017,7 @@ void screen_reinit(struct screen *);
void screen_free(struct screen *); void screen_free(struct screen *);
void screen_reset_tabs(struct screen *); void screen_reset_tabs(struct screen *);
void screen_reset_hyperlinks(struct screen *); void screen_reset_hyperlinks(struct screen *);
void screen_set_default_cursor(struct screen *, struct options *);
void screen_set_cursor_style(u_int, enum screen_cursor_style *, int *); void screen_set_cursor_style(u_int, enum screen_cursor_style *, int *);
void screen_set_cursor_colour(struct screen *, int); void screen_set_cursor_colour(struct screen *, int);
int screen_set_title(struct screen *, const char *); int screen_set_title(struct screen *, const char *);
@ -3097,6 +3105,7 @@ void window_pane_reset_mode_all(struct window_pane *);
int window_pane_key(struct window_pane *, struct client *, int window_pane_key(struct window_pane *, struct client *,
struct session *, struct winlink *, key_code, struct session *, struct winlink *, key_code,
struct mouse_event *); struct mouse_event *);
void window_pane_paste(struct window_pane *, char *, size_t);
int window_pane_visible(struct window_pane *); int window_pane_visible(struct window_pane *);
int window_pane_exited(struct window_pane *); int window_pane_exited(struct window_pane *);
u_int window_pane_search(struct window_pane *, const char *, int, u_int window_pane_search(struct window_pane *, const char *, int,

View file

@ -1,4 +1,4 @@
/* $OpenBSD: tty-keys.c,v 1.179 2024/09/30 08:10:20 nicm Exp $ */ /* $OpenBSD: tty-keys.c,v 1.181 2024/10/03 05:41:59 nicm Exp $ */
/* /*
* Copyright (c) 2007 Nicholas Marriott <nicholas.marriott@gmail.com> * Copyright (c) 2007 Nicholas Marriott <nicholas.marriott@gmail.com>
@ -944,9 +944,6 @@ complete_key:
if (bspace != _POSIX_VDISABLE && (key & KEYC_MASK_KEY) == bspace) if (bspace != _POSIX_VDISABLE && (key & KEYC_MASK_KEY) == bspace)
key = (key & KEYC_MASK_MODIFIERS)|KEYC_BSPACE; key = (key & KEYC_MASK_MODIFIERS)|KEYC_BSPACE;
/* Remove data from buffer. */
evbuffer_drain(tty->in, size);
/* Remove key timer. */ /* Remove key timer. */
if (event_initialized(&tty->key_timer)) if (event_initialized(&tty->key_timer))
evtimer_del(&tty->key_timer); evtimer_del(&tty->key_timer);
@ -965,12 +962,22 @@ complete_key:
/* Fire the key. */ /* Fire the key. */
if (key != KEYC_UNKNOWN) { if (key != KEYC_UNKNOWN) {
event = xmalloc(sizeof *event); event = xcalloc(1, sizeof *event);
event->key = key; event->key = key;
memcpy(&event->m, &m, sizeof event->m); memcpy(&event->m, &m, sizeof event->m);
if (!server_client_handle_key(c, event))
event->buf = xmalloc(size);
event->len = size;
memcpy (event->buf, buf, event->len);
if (!server_client_handle_key(c, event)) {
free(event->buf);
free(event); free(event);
} }
}
/* Remove data from buffer. */
evbuffer_drain(tty->in, size);
return (1); return (1);
@ -1009,7 +1016,7 @@ tty_keys_extended_key(struct tty *tty, const char *buf, size_t len,
u_int number, modifiers; u_int number, modifiers;
char tmp[64]; char tmp[64];
cc_t bspace; cc_t bspace;
key_code nkey; key_code nkey, onlykey;
struct utf8_data ud; struct utf8_data ud;
utf8_char uc; utf8_char uc;
@ -1073,13 +1080,7 @@ tty_keys_extended_key(struct tty *tty, const char *buf, size_t len,
/* Update the modifiers. */ /* Update the modifiers. */
if (modifiers > 0) { if (modifiers > 0) {
modifiers--; modifiers--;
/* if (modifiers & 1)
* The Shift modifier may not be reported in some input modes,
* which is unfortunate, as in general case determining if a
* character is shifted or not requires knowing the input
* keyboard layout. So we only fix up the trivial case.
*/
if (modifiers & 1 || (nkey >= 'A' && nkey <= 'Z'))
nkey |= KEYC_SHIFT; nkey |= KEYC_SHIFT;
if (modifiers & 2) if (modifiers & 2)
nkey |= (KEYC_META|KEYC_IMPLIED_META); /* Alt */ nkey |= (KEYC_META|KEYC_IMPLIED_META); /* Alt */
@ -1093,6 +1094,26 @@ tty_keys_extended_key(struct tty *tty, const char *buf, size_t len,
if ((nkey & KEYC_MASK_KEY) == '\011' && (nkey & KEYC_SHIFT)) if ((nkey & KEYC_MASK_KEY) == '\011' && (nkey & KEYC_SHIFT))
nkey = KEYC_BTAB | (nkey & ~KEYC_MASK_KEY & ~KEYC_SHIFT); nkey = KEYC_BTAB | (nkey & ~KEYC_MASK_KEY & ~KEYC_SHIFT);
/*
* Deal with the Shift modifier when present alone. The problem is that
* in mode 2 some terminals would report shifted keys, like S-a, as
* just A, and some as S-A.
*
* Because we need an unambiguous internal representation, and because
* restoring the Shift modifier when it's missing would require knowing
* the keyboard layout, and because S-A would cause a lot of issues
* downstream, we choose to lose the Shift for all printable
* characters.
*
* That still leaves some ambiguity, such as C-S-A vs. C-A, but that's
* OK, and applications can handle that.
*/
onlykey = nkey & KEYC_MASK_KEY;
if (((onlykey > 0x20 && onlykey < 0x7f) ||
KEYC_IS_UNICODE(nkey)) &&
(nkey & KEYC_MASK_MODIFIERS) == KEYC_SHIFT)
nkey &= ~KEYC_SHIFT;
if (log_get_level() != 0) { if (log_get_level() != 0) {
log_debug("%s: extended key %.*s is %llx (%s)", c->name, log_debug("%s: extended key %.*s is %llx (%s)", c->name,
(int)*size, buf, nkey, key_string_lookup_key(nkey, 1)); (int)*size, buf, nkey, key_string_lookup_key(nkey, 1));

View file

@ -1,4 +1,4 @@
/* $OpenBSD: window-copy.c,v 1.353 2024/08/27 07:49:07 nicm Exp $ */ /* $OpenBSD: window-copy.c,v 1.354 2024/10/01 08:01:19 nicm Exp $ */
/* /*
* Copyright (c) 2007 Nicholas Marriott <nicholas.marriott@gmail.com> * Copyright (c) 2007 Nicholas Marriott <nicholas.marriott@gmail.com>
@ -417,6 +417,7 @@ window_copy_common_init(struct window_mode_entry *wme)
data->jumpchar = NULL; data->jumpchar = NULL;
screen_init(&data->screen, screen_size_x(base), screen_size_y(base), 0); screen_init(&data->screen, screen_size_x(base), screen_size_y(base), 0);
screen_set_default_cursor(&data->screen, global_w_options);
data->modekeys = options_get_number(wp->window->options, "mode-keys"); data->modekeys = options_get_number(wp->window->options, "mode-keys");
evtimer_set(&data->dragtimer, window_copy_scroll_timer, wme); evtimer_set(&data->dragtimer, window_copy_scroll_timer, wme);

View file

@ -1,4 +1,4 @@
/* $OpenBSD: window.c,v 1.292 2024/08/26 07:14:40 nicm Exp $ */ /* $OpenBSD: window.c,v 1.294 2024/10/01 08:01:19 nicm Exp $ */
/* /*
* Copyright (c) 2007 Nicholas Marriott <nicholas.marriott@gmail.com> * Copyright (c) 2007 Nicholas Marriott <nicholas.marriott@gmail.com>
@ -1154,6 +1154,24 @@ window_pane_reset_mode_all(struct window_pane *wp)
window_pane_reset_mode(wp); window_pane_reset_mode(wp);
} }
static void
window_pane_copy_paste(struct window_pane *wp, char *buf, size_t len)
{
struct window_pane *loop;
TAILQ_FOREACH(loop, &wp->window->panes, entry) {
if (loop != wp &&
TAILQ_EMPTY(&loop->modes) &&
loop->fd != -1 &&
(~loop->flags & PANE_INPUTOFF) &&
window_pane_visible(loop) &&
options_get_number(loop->options, "synchronize-panes")) {
log_debug("%s: %.*s", __func__, (int)len, buf);
bufferevent_write(loop->event, buf, len);
}
}
}
static void static void
window_pane_copy_key(struct window_pane *wp, key_code key) window_pane_copy_key(struct window_pane *wp, key_code key)
{ {
@ -1170,6 +1188,22 @@ window_pane_copy_key(struct window_pane *wp, key_code key)
} }
} }
void
window_pane_paste(struct window_pane *wp, char *buf, size_t len)
{
if (!TAILQ_EMPTY(&wp->modes))
return;
if (wp->fd == -1 || wp->flags & PANE_INPUTOFF)
return;
log_debug("%s: %.*s", __func__, (int)len, buf);
bufferevent_write(wp->event, buf, len);
if (options_get_number(wp->options, "synchronize-panes"))
window_pane_copy_paste(wp, buf, len);
}
int int
window_pane_key(struct window_pane *wp, struct client *c, struct session *s, window_pane_key(struct window_pane *wp, struct client *c, struct session *s,
struct winlink *wl, key_code key, struct mouse_event *m) struct winlink *wl, key_code key, struct mouse_event *m)
@ -1652,15 +1686,7 @@ window_set_fill_character(struct window *w)
void void
window_pane_default_cursor(struct window_pane *wp) window_pane_default_cursor(struct window_pane *wp)
{ {
struct screen *s = wp->screen; screen_set_default_cursor(wp->screen, wp->options);
int c;
c = options_get_number(wp->options, "cursor-colour");
s->default_ccolour = c;
c = options_get_number(wp->options, "cursor-style");
s->default_mode = 0;
screen_set_cursor_style(c, &s->default_cstyle, &s->default_mode);
} }
int int

View file

@ -1,4 +1,4 @@
/* $OpenBSD: output.c,v 1.54 2024/08/20 12:00:20 claudio Exp $ */ /* $OpenBSD: output.c,v 1.56 2024/10/01 18:33:16 claudio Exp $ */
/* /*
* Copyright (c) 2003 Henning Brauer <henning@openbsd.org> * Copyright (c) 2003 Henning Brauer <henning@openbsd.org>
@ -302,7 +302,7 @@ show_neighbor_full(struct peer *p, struct parse_result *res)
ina.s_addr = htonl(p->remote_bgpid); ina.s_addr = htonl(p->remote_bgpid);
printf(" BGP version 4, remote router-id %s", printf(" BGP version 4, remote router-id %s",
inet_ntoa(ina)); inet_ntoa(ina));
printf("%s\n", fmt_auth_method(p->auth.method)); printf("%s\n", fmt_auth_method(p->auth_conf.method));
} }
printf(" BGP state = %s", statenames[p->state]); printf(" BGP state = %s", statenames[p->state]);
if (p->conf.down) { if (p->conf.down) {

View file

@ -1,4 +1,4 @@
/* $OpenBSD: output_json.c,v 1.46 2024/08/14 19:10:51 claudio Exp $ */ /* $OpenBSD: output_json.c,v 1.48 2024/10/01 18:33:16 claudio Exp $ */
/* /*
* Copyright (c) 2020 Claudio Jeker <claudio@openbsd.org> * Copyright (c) 2020 Claudio Jeker <claudio@openbsd.org>
@ -240,9 +240,9 @@ json_neighbor_full(struct peer *p)
json_do_uint("max_out_prefix_restart", json_do_uint("max_out_prefix_restart",
p->conf.max_out_prefix_restart); p->conf.max_out_prefix_restart);
} }
if (p->auth.method != AUTH_NONE) if (p->auth_conf.method != AUTH_NONE)
json_do_string("authentication", json_do_string("authentication",
fmt_auth_method(p->auth.method)); fmt_auth_method(p->auth_conf.method));
json_do_bool("ttl_security", p->conf.ttlsec); json_do_bool("ttl_security", p->conf.ttlsec);
json_do_uint("holdtime", p->conf.holdtime); json_do_uint("holdtime", p->conf.holdtime);
json_do_uint("min_holdtime", p->conf.min_holdtime); json_do_uint("min_holdtime", p->conf.min_holdtime);

View file

@ -1,4 +1,4 @@
/* $OpenBSD: bgpd.c,v 1.268 2024/09/30 09:42:24 claudio Exp $ */ /* $OpenBSD: bgpd.c,v 1.269 2024/10/01 11:49:24 claudio Exp $ */
/* /*
* Copyright (c) 2003, 2004 Henning Brauer <henning@openbsd.org> * Copyright (c) 2003, 2004 Henning Brauer <henning@openbsd.org>
@ -467,7 +467,7 @@ BROKEN if (pledge("stdio rpath wpath cpath fattr unix route recvfd sendfd",
pftable_clear_all(); pftable_clear_all();
RB_FOREACH(p, peer_head, &conf->peers) RB_FOREACH(p, peer_head, &conf->peers)
pfkey_remove(p); pfkey_remove(&p->auth_state);
while ((rr = SIMPLEQ_FIRST(&ribnames)) != NULL) { while ((rr = SIMPLEQ_FIRST(&ribnames)) != NULL) {
SIMPLEQ_REMOVE_HEAD(&ribnames, entry); SIMPLEQ_REMOVE_HEAD(&ribnames, entry);
@ -651,9 +651,12 @@ send_config(struct bgpd_config *conf)
if (imsg_compose(ibuf_se, IMSG_RECONF_PEER, p->conf.id, 0, -1, if (imsg_compose(ibuf_se, IMSG_RECONF_PEER, p->conf.id, 0, -1,
&p->conf, sizeof(p->conf)) == -1) &p->conf, sizeof(p->conf)) == -1)
return (-1); return (-1);
if (pfkey_send_conf(ibuf_se, p->conf.id, &p->auth_conf) == -1)
return (-1);
if (p->reconf_action == RECONF_REINIT) if (p->reconf_action == RECONF_REINIT)
if (pfkey_establish(p) == -1) if (pfkey_establish(&p->auth_state, &p->auth_conf,
session_localaddr(p), &p->conf.remote_addr) == -1)
log_peer_warnx(&p->conf, "pfkey setup failed"); log_peer_warnx(&p->conf, "pfkey setup failed");
} }
@ -943,7 +946,9 @@ dispatch_imsg(struct imsgbuf *imsgbuf, int idx, struct bgpd_config *conf)
} }
p = getpeerbyid(conf, imsg_get_id(&imsg)); p = getpeerbyid(conf, imsg_get_id(&imsg));
if (p != NULL) { if (p != NULL) {
if (pfkey_establish(p) == -1) if (pfkey_establish(&p->auth_state,
&p->auth_conf, session_localaddr(p),
&p->conf.remote_addr) == -1)
log_peer_warnx(&p->conf, log_peer_warnx(&p->conf,
"pfkey setup failed"); "pfkey setup failed");
} }

View file

@ -1,4 +1,4 @@
/* $OpenBSD: bgpd.h,v 1.496 2024/09/04 15:06:36 claudio Exp $ */ /* $OpenBSD: bgpd.h,v 1.497 2024/10/01 11:49:24 claudio Exp $ */
/* /*
* Copyright (c) 2003, 2004 Henning Brauer <henning@openbsd.org> * Copyright (c) 2003, 2004 Henning Brauer <henning@openbsd.org>
@ -379,7 +379,7 @@ enum auth_enc_alg {
AUTH_EALG_AES, AUTH_EALG_AES,
}; };
struct peer_auth { struct auth_config {
char md5key[TCP_MD5_KEY_LEN]; char md5key[TCP_MD5_KEY_LEN];
char auth_key_in[IPSEC_AUTH_KEY_LEN]; char auth_key_in[IPSEC_AUTH_KEY_LEN];
char auth_key_out[IPSEC_AUTH_KEY_LEN]; char auth_key_out[IPSEC_AUTH_KEY_LEN];
@ -452,7 +452,6 @@ struct peer_config {
struct bgpd_addr remote_addr; struct bgpd_addr remote_addr;
struct bgpd_addr local_addr_v4; struct bgpd_addr local_addr_v4;
struct bgpd_addr local_addr_v6; struct bgpd_addr local_addr_v6;
struct peer_auth auth;
struct capabilities capabilities; struct capabilities capabilities;
struct addpath_eval eval; struct addpath_eval eval;
char group[PEER_DESCR_LEN]; char group[PEER_DESCR_LEN];
@ -649,6 +648,7 @@ enum imsg_type {
IMSG_RECONF_CONF, IMSG_RECONF_CONF,
IMSG_RECONF_RIB, IMSG_RECONF_RIB,
IMSG_RECONF_PEER, IMSG_RECONF_PEER,
IMSG_RECONF_PEER_AUTH,
IMSG_RECONF_FILTER, IMSG_RECONF_FILTER,
IMSG_RECONF_LISTENER, IMSG_RECONF_LISTENER,
IMSG_RECONF_CTRL, IMSG_RECONF_CTRL,

View file

@ -1,4 +1,4 @@
/* $OpenBSD: config.c,v 1.111 2024/09/04 13:30:10 claudio Exp $ */ /* $OpenBSD: config.c,v 1.112 2024/10/01 11:49:24 claudio Exp $ */
/* /*
* Copyright (c) 2003, 2004, 2005 Henning Brauer <henning@openbsd.org> * Copyright (c) 2003, 2004, 2005 Henning Brauer <henning@openbsd.org>
@ -440,8 +440,8 @@ merge_config(struct bgpd_config *xconf, struct bgpd_config *conf)
np = getpeerbyid(conf, p->conf.id); np = getpeerbyid(conf, p->conf.id);
if (np != NULL) { if (np != NULL) {
np->reconf_action = RECONF_KEEP; np->reconf_action = RECONF_KEEP;
/* copy the auth state since parent uses it */ /* keep the auth state since parent needs it */
np->auth = p->auth; np->auth_state = p->auth_state;
RB_REMOVE(peer_head, &xconf->peers, p); RB_REMOVE(peer_head, &xconf->peers, p);
free(p); free(p);
@ -467,7 +467,7 @@ free_deleted_peers(struct bgpd_config *conf)
RB_FOREACH_SAFE(p, peer_head, &conf->peers, nextp) { RB_FOREACH_SAFE(p, peer_head, &conf->peers, nextp) {
if (p->reconf_action == RECONF_DELETE) { if (p->reconf_action == RECONF_DELETE) {
/* peer no longer exists, clear pfkey state */ /* peer no longer exists, clear pfkey state */
pfkey_remove(p); pfkey_remove(&p->auth_state);
RB_REMOVE(peer_head, &conf->peers, p); RB_REMOVE(peer_head, &conf->peers, p);
free(p); free(p);
} }

View file

@ -1,4 +1,4 @@
/* $OpenBSD: control.c,v 1.118 2024/08/20 11:59:39 claudio Exp $ */ /* $OpenBSD: control.c,v 1.120 2024/10/01 18:31:10 claudio Exp $ */
/* /*
* Copyright (c) 2003, 2004 Henning Brauer <henning@openbsd.org> * Copyright (c) 2003, 2004 Henning Brauer <henning@openbsd.org>
@ -544,6 +544,7 @@ control_imsg_relay(struct imsg *imsg, struct peer *p)
/* special handling for peers since only the stats are sent from RDE */ /* special handling for peers since only the stats are sent from RDE */
if (type == IMSG_CTL_SHOW_NEIGHBOR) { if (type == IMSG_CTL_SHOW_NEIGHBOR) {
struct rde_peer_stats stats; struct rde_peer_stats stats;
struct peer peer;
if (p == NULL) { if (p == NULL) {
log_warnx("%s: no such peer: id=%u", __func__, log_warnx("%s: no such peer: id=%u", __func__,
@ -554,20 +555,23 @@ control_imsg_relay(struct imsg *imsg, struct peer *p)
log_warnx("%s: imsg_get_data", __func__); log_warnx("%s: imsg_get_data", __func__);
return (0); return (0);
} }
p->stats.prefix_cnt = stats.prefix_cnt; peer = *p;
p->stats.prefix_out_cnt = stats.prefix_out_cnt; explicit_bzero(&peer.auth_conf, sizeof(peer.auth_conf));
p->stats.prefix_rcvd_update = stats.prefix_rcvd_update; peer.auth_conf.method = p->auth_conf.method;
p->stats.prefix_rcvd_withdraw = stats.prefix_rcvd_withdraw; peer.stats.prefix_cnt = stats.prefix_cnt;
p->stats.prefix_rcvd_eor = stats.prefix_rcvd_eor; peer.stats.prefix_out_cnt = stats.prefix_out_cnt;
p->stats.prefix_sent_update = stats.prefix_sent_update; peer.stats.prefix_rcvd_update = stats.prefix_rcvd_update;
p->stats.prefix_sent_withdraw = stats.prefix_sent_withdraw; peer.stats.prefix_rcvd_withdraw = stats.prefix_rcvd_withdraw;
p->stats.prefix_sent_eor = stats.prefix_sent_eor; peer.stats.prefix_rcvd_eor = stats.prefix_rcvd_eor;
p->stats.pending_update = stats.pending_update; peer.stats.prefix_sent_update = stats.prefix_sent_update;
p->stats.pending_withdraw = stats.pending_withdraw; peer.stats.prefix_sent_withdraw = stats.prefix_sent_withdraw;
p->stats.msg_queue_len = msgbuf_queuelen(&p->wbuf); peer.stats.prefix_sent_eor = stats.prefix_sent_eor;
peer.stats.pending_update = stats.pending_update;
peer.stats.pending_withdraw = stats.pending_withdraw;
peer.stats.msg_queue_len = msgbuf_queuelen(&p->wbuf);
return imsg_compose(&c->imsgbuf, type, 0, pid, -1, return imsg_compose(&c->imsgbuf, type, 0, pid, -1,
p, sizeof(*p)); &peer, sizeof(peer));
} }
/* if command finished no need to send exit message */ /* if command finished no need to send exit message */

View file

@ -1,4 +1,4 @@
/* $OpenBSD: parse.y,v 1.468 2024/09/20 02:00:46 jsg Exp $ */ /* $OpenBSD: parse.y,v 1.469 2024/10/01 11:49:24 claudio Exp $ */
/* /*
* Copyright (c) 2002, 2003, 2004 Henning Brauer <henning@openbsd.org> * Copyright (c) 2002, 2003, 2004 Henning Brauer <henning@openbsd.org>
@ -2076,59 +2076,59 @@ peeropts : REMOTEAS as4number {
curpeer->conf.max_out_prefix_restart = $4; curpeer->conf.max_out_prefix_restart = $4;
} }
| TCP MD5SIG PASSWORD string { | TCP MD5SIG PASSWORD string {
if (curpeer->conf.auth.method) { if (curpeer->auth_conf.method) {
yyerror("auth method cannot be redefined"); yyerror("auth method cannot be redefined");
free($4); free($4);
YYERROR; YYERROR;
} }
if (strlcpy(curpeer->conf.auth.md5key, $4, if (strlcpy(curpeer->auth_conf.md5key, $4,
sizeof(curpeer->conf.auth.md5key)) >= sizeof(curpeer->auth_conf.md5key)) >=
sizeof(curpeer->conf.auth.md5key)) { sizeof(curpeer->auth_conf.md5key)) {
yyerror("tcp md5sig password too long: max %zu", yyerror("tcp md5sig password too long: max %zu",
sizeof(curpeer->conf.auth.md5key) - 1); sizeof(curpeer->auth_conf.md5key) - 1);
free($4); free($4);
YYERROR; YYERROR;
} }
curpeer->conf.auth.method = AUTH_MD5SIG; curpeer->auth_conf.method = AUTH_MD5SIG;
curpeer->conf.auth.md5key_len = strlen($4); curpeer->auth_conf.md5key_len = strlen($4);
free($4); free($4);
} }
| TCP MD5SIG KEY string { | TCP MD5SIG KEY string {
if (curpeer->conf.auth.method) { if (curpeer->auth_conf.method) {
yyerror("auth method cannot be redefined"); yyerror("auth method cannot be redefined");
free($4); free($4);
YYERROR; YYERROR;
} }
if (str2key($4, curpeer->conf.auth.md5key, if (str2key($4, curpeer->auth_conf.md5key,
sizeof(curpeer->conf.auth.md5key)) == -1) { sizeof(curpeer->auth_conf.md5key)) == -1) {
free($4); free($4);
YYERROR; YYERROR;
} }
curpeer->conf.auth.method = AUTH_MD5SIG; curpeer->auth_conf.method = AUTH_MD5SIG;
curpeer->conf.auth.md5key_len = strlen($4) / 2; curpeer->auth_conf.md5key_len = strlen($4) / 2;
free($4); free($4);
} }
| IPSEC espah IKE { | IPSEC espah IKE {
if (curpeer->conf.auth.method) { if (curpeer->auth_conf.method) {
yyerror("auth method cannot be redefined"); yyerror("auth method cannot be redefined");
YYERROR; YYERROR;
} }
if ($2) if ($2)
curpeer->conf.auth.method = AUTH_IPSEC_IKE_ESP; curpeer->auth_conf.method = AUTH_IPSEC_IKE_ESP;
else else
curpeer->conf.auth.method = AUTH_IPSEC_IKE_AH; curpeer->auth_conf.method = AUTH_IPSEC_IKE_AH;
} }
| IPSEC espah inout SPI NUMBER STRING STRING encspec { | IPSEC espah inout SPI NUMBER STRING STRING encspec {
enum auth_alg auth_alg; enum auth_alg auth_alg;
uint8_t keylen; uint8_t keylen;
if (curpeer->conf.auth.method && if (curpeer->auth_conf.method &&
(((curpeer->conf.auth.spi_in && $3 == 1) || (((curpeer->auth_conf.spi_in && $3 == 1) ||
(curpeer->conf.auth.spi_out && $3 == 0)) || (curpeer->auth_conf.spi_out && $3 == 0)) ||
($2 == 1 && curpeer->conf.auth.method != ($2 == 1 && curpeer->auth_conf.method !=
AUTH_IPSEC_MANUAL_ESP) || AUTH_IPSEC_MANUAL_ESP) ||
($2 == 0 && curpeer->conf.auth.method != ($2 == 0 && curpeer->auth_conf.method !=
AUTH_IPSEC_MANUAL_AH))) { AUTH_IPSEC_MANUAL_AH))) {
yyerror("auth method cannot be redefined"); yyerror("auth method cannot be redefined");
free($6); free($6);
@ -2158,7 +2158,7 @@ peeropts : REMOTEAS as4number {
} }
if ($2) if ($2)
curpeer->conf.auth.method = curpeer->auth_conf.method =
AUTH_IPSEC_MANUAL_ESP; AUTH_IPSEC_MANUAL_ESP;
else { else {
if ($8.enc_alg) { if ($8.enc_alg) {
@ -2167,7 +2167,7 @@ peeropts : REMOTEAS as4number {
free($7); free($7);
YYERROR; YYERROR;
} }
curpeer->conf.auth.method = curpeer->auth_conf.method =
AUTH_IPSEC_MANUAL_AH; AUTH_IPSEC_MANUAL_AH;
} }
@ -2178,37 +2178,37 @@ peeropts : REMOTEAS as4number {
} }
if ($3 == 1) { if ($3 == 1) {
if (str2key($7, curpeer->conf.auth.auth_key_in, if (str2key($7, curpeer->auth_conf.auth_key_in,
sizeof(curpeer->conf.auth.auth_key_in)) == sizeof(curpeer->auth_conf.auth_key_in)) ==
-1) { -1) {
free($7); free($7);
YYERROR; YYERROR;
} }
curpeer->conf.auth.spi_in = $5; curpeer->auth_conf.spi_in = $5;
curpeer->conf.auth.auth_alg_in = auth_alg; curpeer->auth_conf.auth_alg_in = auth_alg;
curpeer->conf.auth.enc_alg_in = $8.enc_alg; curpeer->auth_conf.enc_alg_in = $8.enc_alg;
memcpy(&curpeer->conf.auth.enc_key_in, memcpy(&curpeer->auth_conf.enc_key_in,
&$8.enc_key, &$8.enc_key,
sizeof(curpeer->conf.auth.enc_key_in)); sizeof(curpeer->auth_conf.enc_key_in));
curpeer->conf.auth.enc_keylen_in = curpeer->auth_conf.enc_keylen_in =
$8.enc_key_len; $8.enc_key_len;
curpeer->conf.auth.auth_keylen_in = keylen; curpeer->auth_conf.auth_keylen_in = keylen;
} else { } else {
if (str2key($7, curpeer->conf.auth.auth_key_out, if (str2key($7, curpeer->auth_conf.auth_key_out,
sizeof(curpeer->conf.auth.auth_key_out)) == sizeof(curpeer->auth_conf.auth_key_out)) ==
-1) { -1) {
free($7); free($7);
YYERROR; YYERROR;
} }
curpeer->conf.auth.spi_out = $5; curpeer->auth_conf.spi_out = $5;
curpeer->conf.auth.auth_alg_out = auth_alg; curpeer->auth_conf.auth_alg_out = auth_alg;
curpeer->conf.auth.enc_alg_out = $8.enc_alg; curpeer->auth_conf.enc_alg_out = $8.enc_alg;
memcpy(&curpeer->conf.auth.enc_key_out, memcpy(&curpeer->auth_conf.enc_key_out,
&$8.enc_key, &$8.enc_key,
sizeof(curpeer->conf.auth.enc_key_out)); sizeof(curpeer->auth_conf.enc_key_out));
curpeer->conf.auth.enc_keylen_out = curpeer->auth_conf.enc_keylen_out =
$8.enc_key_len; $8.enc_key_len;
curpeer->conf.auth.auth_keylen_out = keylen; curpeer->auth_conf.auth_keylen_out = keylen;
} }
free($7); free($7);
} }
@ -5073,10 +5073,10 @@ neighbor_consistent(struct peer *p)
} }
/* with any form of ipsec local-address is required */ /* with any form of ipsec local-address is required */
if ((p->conf.auth.method == AUTH_IPSEC_IKE_ESP || if ((p->auth_conf.method == AUTH_IPSEC_IKE_ESP ||
p->conf.auth.method == AUTH_IPSEC_IKE_AH || p->auth_conf.method == AUTH_IPSEC_IKE_AH ||
p->conf.auth.method == AUTH_IPSEC_MANUAL_ESP || p->auth_conf.method == AUTH_IPSEC_MANUAL_ESP ||
p->conf.auth.method == AUTH_IPSEC_MANUAL_AH) && p->auth_conf.method == AUTH_IPSEC_MANUAL_AH) &&
local_addr->aid == AID_UNSPEC) { local_addr->aid == AID_UNSPEC) {
yyerror("neighbors with any form of IPsec configured " yyerror("neighbors with any form of IPsec configured "
"need local-address to be specified"); "need local-address to be specified");
@ -5084,9 +5084,9 @@ neighbor_consistent(struct peer *p)
} }
/* with static keying we need both directions */ /* with static keying we need both directions */
if ((p->conf.auth.method == AUTH_IPSEC_MANUAL_ESP || if ((p->auth_conf.method == AUTH_IPSEC_MANUAL_ESP ||
p->conf.auth.method == AUTH_IPSEC_MANUAL_AH) && p->auth_conf.method == AUTH_IPSEC_MANUAL_AH) &&
(!p->conf.auth.spi_in || !p->conf.auth.spi_out)) { (!p->auth_conf.spi_in || !p->auth_conf.spi_out)) {
yyerror("with manual keyed IPsec, SPIs and keys " yyerror("with manual keyed IPsec, SPIs and keys "
"for both directions are required"); "for both directions are required");
return (-1); return (-1);

View file

@ -1,4 +1,4 @@
/* $OpenBSD: pfkey.c,v 1.68 2022/11/07 22:39:13 mbuhl Exp $ */ /* $OpenBSD: pfkey.c,v 1.71 2024/10/02 09:45:29 claudio Exp $ */
/* /*
* Copyright (c) 2003, 2004 Henning Brauer <henning@openbsd.org> * Copyright (c) 2003, 2004 Henning Brauer <henning@openbsd.org>
@ -45,9 +45,9 @@ static uint32_t sadb_msg_seq = 0;
static uint32_t pid = 0; /* should pid_t but pfkey needs uint32_t */ static uint32_t pid = 0; /* should pid_t but pfkey needs uint32_t */
static int pfkey_fd; static int pfkey_fd;
int pfkey_reply(int, uint32_t *); static int pfkey_reply(int, uint32_t *);
int pfkey_send(int, uint8_t, uint8_t, uint8_t, static int pfkey_send(int, uint8_t, uint8_t, uint8_t,
struct bgpd_addr *, struct bgpd_addr *, const struct bgpd_addr *, const struct bgpd_addr *,
uint32_t, uint8_t, int, char *, uint8_t, int, char *, uint32_t, uint8_t, int, char *, uint8_t, int, char *,
uint16_t, uint16_t); uint16_t, uint16_t);
@ -55,21 +55,9 @@ int pfkey_send(int, uint8_t, uint8_t, uint8_t,
pfkey_send(fd, satype, cmd, dir, from, to, \ pfkey_send(fd, satype, cmd, dir, from, to, \
0, 0, 0, NULL, 0, 0, NULL, sport, dport) 0, 0, 0, NULL, 0, 0, NULL, sport, dport)
static struct bgpd_addr * static int
pfkey_localaddr(struct peer *p)
{
switch (p->conf.remote_addr.aid) {
case AID_INET:
return &p->conf.local_addr_v4;
case AID_INET6:
return &p->conf.local_addr_v6;
}
fatalx("Unknown AID in pfkey_localaddr");
}
int
pfkey_send(int sd, uint8_t satype, uint8_t mtype, uint8_t dir, pfkey_send(int sd, uint8_t satype, uint8_t mtype, uint8_t dir,
struct bgpd_addr *src, struct bgpd_addr *dst, uint32_t spi, const struct bgpd_addr *src, const struct bgpd_addr *dst, uint32_t spi,
uint8_t aalg, int alen, char *akey, uint8_t ealg, int elen, char *ekey, uint8_t aalg, int alen, char *akey, uint8_t ealg, int elen, char *ekey,
uint16_t sport, uint16_t dport) uint16_t sport, uint16_t dport)
{ {
@ -447,7 +435,7 @@ pfkey_read(int sd, struct sadb_msg *h)
return (1); return (1);
} }
int static int
pfkey_reply(int sd, uint32_t *spi) pfkey_reply(int sd, uint32_t *spi)
{ {
struct sadb_msg hdr, *msg; struct sadb_msg hdr, *msg;
@ -511,8 +499,8 @@ pfkey_reply(int sd, uint32_t *spi)
} }
static int static int
pfkey_sa_add(struct bgpd_addr *src, struct bgpd_addr *dst, uint8_t keylen, pfkey_sa_add(const struct bgpd_addr *src, const struct bgpd_addr *dst,
char *key, uint32_t *spi) uint8_t keylen, char *key, uint32_t *spi)
{ {
if (pfkey_send(pfkey_fd, SADB_X_SATYPE_TCPSIGNATURE, SADB_GETSPI, 0, if (pfkey_send(pfkey_fd, SADB_X_SATYPE_TCPSIGNATURE, SADB_GETSPI, 0,
src, dst, 0, 0, 0, NULL, 0, 0, NULL, 0, 0) == -1) src, dst, 0, 0, 0, NULL, 0, 0, NULL, 0, 0) == -1)
@ -528,7 +516,8 @@ pfkey_sa_add(struct bgpd_addr *src, struct bgpd_addr *dst, uint8_t keylen,
} }
static int static int
pfkey_sa_remove(struct bgpd_addr *src, struct bgpd_addr *dst, uint32_t *spi) pfkey_sa_remove(const struct bgpd_addr *src, const struct bgpd_addr *dst,
uint32_t *spi)
{ {
if (pfkey_send(pfkey_fd, SADB_X_SATYPE_TCPSIGNATURE, SADB_DELETE, 0, if (pfkey_send(pfkey_fd, SADB_X_SATYPE_TCPSIGNATURE, SADB_DELETE, 0,
src, dst, *spi, 0, 0, NULL, 0, 0, NULL, 0, 0) == -1) src, dst, *spi, 0, 0, NULL, 0, 0, NULL, 0, 0) == -1)
@ -540,56 +529,52 @@ pfkey_sa_remove(struct bgpd_addr *src, struct bgpd_addr *dst, uint32_t *spi)
} }
static int static int
pfkey_md5sig_establish(struct peer *p) pfkey_md5sig_establish(struct auth_state *as, struct auth_config *auth,
const struct bgpd_addr *local_addr, const struct bgpd_addr *remote_addr)
{ {
uint32_t spi_out = 0; uint32_t spi_out = 0;
uint32_t spi_in = 0; uint32_t spi_in = 0;
if (pfkey_sa_add(pfkey_localaddr(p), &p->conf.remote_addr, if (pfkey_sa_add(local_addr, remote_addr,
p->conf.auth.md5key_len, p->conf.auth.md5key, auth->md5key_len, auth->md5key, &spi_out) == -1)
&spi_out) == -1)
goto fail; goto fail;
if (pfkey_sa_add(&p->conf.remote_addr, pfkey_localaddr(p), if (pfkey_sa_add(remote_addr, local_addr,
p->conf.auth.md5key_len, p->conf.auth.md5key, auth->md5key_len, auth->md5key, &spi_in) == -1)
&spi_in) == -1)
goto fail; goto fail;
/* cleanup old flow if one was present */ /* cleanup old flow if one was present */
if (p->auth.established) { if (pfkey_remove(as) == -1)
if (pfkey_remove(p) == -1)
return (-1); return (-1);
}
p->auth.established = 1; as->established = 1;
p->auth.spi_out = spi_out; as->method = auth->method;
p->auth.spi_in = spi_in; as->local_addr = *local_addr;
as->remote_addr = *remote_addr;
as->spi_out = spi_out;
as->spi_in = spi_in;
return (0); return (0);
fail: fail:
log_peer_warn(&p->conf, "failed to insert md5sig");
return (-1); return (-1);
} }
static int static int
pfkey_md5sig_remove(struct peer *p) pfkey_md5sig_remove(struct auth_state *as)
{ {
if (p->auth.spi_out) if (as->spi_out)
if (pfkey_sa_remove(&p->auth.local_addr, &p->conf.remote_addr, if (pfkey_sa_remove(&as->local_addr, &as->remote_addr,
&p->auth.spi_out) == -1) &as->spi_out) == -1)
goto fail; goto fail;
if (p->auth.spi_in) if (as->spi_in)
if (pfkey_sa_remove(&p->conf.remote_addr, &p->auth.local_addr, if (pfkey_sa_remove(&as->remote_addr, &as->local_addr,
&p->auth.spi_in) == -1) &as->spi_in) == -1)
goto fail; goto fail;
p->auth.established = 0; explicit_bzero(as, sizeof(*as));
p->auth.spi_out = 0;
p->auth.spi_in = 0;
return (0); return (0);
fail: fail:
log_peer_warn(&p->conf, "failed to remove md5sig");
return (-1); return (-1);
} }
@ -620,18 +605,16 @@ pfkey_enc_alg(enum auth_enc_alg alg)
} }
static int static int
pfkey_ipsec_establish(struct peer *p) pfkey_ipsec_establish(struct auth_state *as, struct auth_config *auth,
const struct bgpd_addr *local_addr, const struct bgpd_addr *remote_addr)
{ {
uint8_t satype = SADB_SATYPE_ESP; uint8_t satype = SADB_SATYPE_ESP;
struct bgpd_addr *local_addr = pfkey_localaddr(p);
/* cleanup first, unlike in the TCP MD5 case */ /* cleanup first, unlike in the TCP MD5 case */
if (p->auth.established) { if (pfkey_remove(as) == -1)
if (pfkey_remove(p) == -1)
return (-1); return (-1);
}
switch (p->auth.method) { switch (auth->method) {
case AUTH_IPSEC_IKE_ESP: case AUTH_IPSEC_IKE_ESP:
satype = SADB_SATYPE_ESP; satype = SADB_SATYPE_ESP;
break; break;
@ -640,30 +623,30 @@ pfkey_ipsec_establish(struct peer *p)
break; break;
case AUTH_IPSEC_MANUAL_ESP: case AUTH_IPSEC_MANUAL_ESP:
case AUTH_IPSEC_MANUAL_AH: case AUTH_IPSEC_MANUAL_AH:
satype = p->auth.method == AUTH_IPSEC_MANUAL_ESP ? satype = auth->method == AUTH_IPSEC_MANUAL_ESP ?
SADB_SATYPE_ESP : SADB_SATYPE_AH; SADB_SATYPE_ESP : SADB_SATYPE_AH;
if (pfkey_send(pfkey_fd, satype, SADB_ADD, 0, if (pfkey_send(pfkey_fd, satype, SADB_ADD, 0,
local_addr, &p->conf.remote_addr, local_addr, remote_addr,
p->conf.auth.spi_out, auth->spi_out,
pfkey_auth_alg(p->conf.auth.auth_alg_out), pfkey_auth_alg(auth->auth_alg_out),
p->conf.auth.auth_keylen_out, auth->auth_keylen_out,
p->conf.auth.auth_key_out, auth->auth_key_out,
pfkey_enc_alg(p->conf.auth.enc_alg_out), pfkey_enc_alg(auth->enc_alg_out),
p->conf.auth.enc_keylen_out, auth->enc_keylen_out,
p->conf.auth.enc_key_out, auth->enc_key_out,
0, 0) == -1) 0, 0) == -1)
goto fail_key; goto fail_key;
if (pfkey_reply(pfkey_fd, NULL) == -1) if (pfkey_reply(pfkey_fd, NULL) == -1)
goto fail_key; goto fail_key;
if (pfkey_send(pfkey_fd, satype, SADB_ADD, 0, if (pfkey_send(pfkey_fd, satype, SADB_ADD, 0,
&p->conf.remote_addr, local_addr, remote_addr, local_addr,
p->conf.auth.spi_in, auth->spi_in,
pfkey_auth_alg(p->conf.auth.auth_alg_in), pfkey_auth_alg(auth->auth_alg_in),
p->conf.auth.auth_keylen_in, auth->auth_keylen_in,
p->conf.auth.auth_key_in, auth->auth_key_in,
pfkey_enc_alg(p->conf.auth.enc_alg_in), pfkey_enc_alg(auth->enc_alg_in),
p->conf.auth.enc_keylen_in, auth->enc_keylen_in,
p->conf.auth.enc_key_in, auth->enc_key_in,
0, 0) == -1) 0, 0) == -1)
goto fail_key; goto fail_key;
if (pfkey_reply(pfkey_fd, NULL) == -1) if (pfkey_reply(pfkey_fd, NULL) == -1)
@ -674,49 +657,52 @@ pfkey_ipsec_establish(struct peer *p)
} }
if (pfkey_flow(pfkey_fd, satype, SADB_X_ADDFLOW, IPSP_DIRECTION_OUT, if (pfkey_flow(pfkey_fd, satype, SADB_X_ADDFLOW, IPSP_DIRECTION_OUT,
local_addr, &p->conf.remote_addr, 0, BGP_PORT) == -1) local_addr, remote_addr, 0, BGP_PORT) == -1)
goto fail_flow; goto fail_flow;
if (pfkey_reply(pfkey_fd, NULL) == -1) if (pfkey_reply(pfkey_fd, NULL) == -1)
goto fail_flow; goto fail_flow;
if (pfkey_flow(pfkey_fd, satype, SADB_X_ADDFLOW, IPSP_DIRECTION_OUT, if (pfkey_flow(pfkey_fd, satype, SADB_X_ADDFLOW, IPSP_DIRECTION_OUT,
local_addr, &p->conf.remote_addr, BGP_PORT, 0) == -1) local_addr, remote_addr, BGP_PORT, 0) == -1)
goto fail_flow; goto fail_flow;
if (pfkey_reply(pfkey_fd, NULL) == -1) if (pfkey_reply(pfkey_fd, NULL) == -1)
goto fail_flow; goto fail_flow;
if (pfkey_flow(pfkey_fd, satype, SADB_X_ADDFLOW, IPSP_DIRECTION_IN, if (pfkey_flow(pfkey_fd, satype, SADB_X_ADDFLOW, IPSP_DIRECTION_IN,
&p->conf.remote_addr, local_addr, 0, BGP_PORT) == -1) remote_addr, local_addr, 0, BGP_PORT) == -1)
goto fail_flow; goto fail_flow;
if (pfkey_reply(pfkey_fd, NULL) == -1) if (pfkey_reply(pfkey_fd, NULL) == -1)
goto fail_flow; goto fail_flow;
if (pfkey_flow(pfkey_fd, satype, SADB_X_ADDFLOW, IPSP_DIRECTION_IN, if (pfkey_flow(pfkey_fd, satype, SADB_X_ADDFLOW, IPSP_DIRECTION_IN,
&p->conf.remote_addr, local_addr, BGP_PORT, 0) == -1) remote_addr, local_addr, BGP_PORT, 0) == -1)
goto fail_flow; goto fail_flow;
if (pfkey_reply(pfkey_fd, NULL) == -1) if (pfkey_reply(pfkey_fd, NULL) == -1)
goto fail_flow; goto fail_flow;
/* save SPI so that they can be removed later on */ /* save SPI so that they can be removed later on */
p->auth.spi_in = p->conf.auth.spi_in; as->established = 1;
p->auth.spi_out = p->conf.auth.spi_out; as->method = auth->method;
p->auth.established = 1; as->local_addr = *local_addr;
as->remote_addr = *remote_addr;
as->spi_in = auth->spi_in;
as->spi_out = auth->spi_out;
return (0); return (0);
fail_key: fail_key:
log_peer_warn(&p->conf, "failed to insert ipsec key"); log_warn("failed to insert ipsec key");
return (-1); return (-1);
fail_flow: fail_flow:
log_peer_warn(&p->conf, "failed to insert ipsec flow"); log_warn("failed to insert ipsec flow");
return (-1); return (-1);
} }
static int static int
pfkey_ipsec_remove(struct peer *p) pfkey_ipsec_remove(struct auth_state *as)
{ {
uint8_t satype; uint8_t satype;
switch (p->auth.method) { switch (as->method) {
case AUTH_IPSEC_IKE_ESP: case AUTH_IPSEC_IKE_ESP:
satype = SADB_SATYPE_ESP; satype = SADB_SATYPE_ESP;
break; break;
@ -725,20 +711,18 @@ pfkey_ipsec_remove(struct peer *p)
break; break;
case AUTH_IPSEC_MANUAL_ESP: case AUTH_IPSEC_MANUAL_ESP:
case AUTH_IPSEC_MANUAL_AH: case AUTH_IPSEC_MANUAL_AH:
satype = p->auth.method == AUTH_IPSEC_MANUAL_ESP ? satype = as->method == AUTH_IPSEC_MANUAL_ESP ?
SADB_SATYPE_ESP : SADB_SATYPE_AH; SADB_SATYPE_ESP : SADB_SATYPE_AH;
if (pfkey_send(pfkey_fd, satype, SADB_DELETE, 0, if (pfkey_send(pfkey_fd, satype, SADB_DELETE, 0,
&p->auth.local_addr, &p->conf.remote_addr, &as->local_addr, &as->remote_addr,
p->auth.spi_out, 0, 0, NULL, 0, 0, NULL, as->spi_out, 0, 0, NULL, 0, 0, NULL, 0, 0) == -1)
0, 0) == -1)
goto fail_key; goto fail_key;
if (pfkey_reply(pfkey_fd, NULL) == -1) if (pfkey_reply(pfkey_fd, NULL) == -1)
goto fail_key; goto fail_key;
if (pfkey_send(pfkey_fd, satype, SADB_DELETE, 0, if (pfkey_send(pfkey_fd, satype, SADB_DELETE, 0,
&p->conf.remote_addr, &p->auth.local_addr, &as->remote_addr, &as->local_addr,
p->auth.spi_in, 0, 0, NULL, 0, 0, NULL, as->spi_in, 0, 0, NULL, 0, 0, NULL, 0, 0) == -1)
0, 0) == -1)
goto fail_key; goto fail_key;
if (pfkey_reply(pfkey_fd, NULL) == -1) if (pfkey_reply(pfkey_fd, NULL) == -1)
goto fail_key; goto fail_key;
@ -748,88 +732,68 @@ pfkey_ipsec_remove(struct peer *p)
} }
if (pfkey_flow(pfkey_fd, satype, SADB_X_DELFLOW, IPSP_DIRECTION_OUT, if (pfkey_flow(pfkey_fd, satype, SADB_X_DELFLOW, IPSP_DIRECTION_OUT,
&p->auth.local_addr, &p->conf.remote_addr, 0, BGP_PORT) == -1) &as->local_addr, &as->remote_addr, 0, BGP_PORT) == -1)
goto fail_flow; goto fail_flow;
if (pfkey_reply(pfkey_fd, NULL) == -1) if (pfkey_reply(pfkey_fd, NULL) == -1)
goto fail_flow; goto fail_flow;
if (pfkey_flow(pfkey_fd, satype, SADB_X_DELFLOW, IPSP_DIRECTION_OUT, if (pfkey_flow(pfkey_fd, satype, SADB_X_DELFLOW, IPSP_DIRECTION_OUT,
&p->auth.local_addr, &p->conf.remote_addr, BGP_PORT, 0) == -1) &as->local_addr, &as->remote_addr, BGP_PORT, 0) == -1)
goto fail_flow; goto fail_flow;
if (pfkey_reply(pfkey_fd, NULL) == -1) if (pfkey_reply(pfkey_fd, NULL) == -1)
goto fail_flow; goto fail_flow;
if (pfkey_flow(pfkey_fd, satype, SADB_X_DELFLOW, IPSP_DIRECTION_IN, if (pfkey_flow(pfkey_fd, satype, SADB_X_DELFLOW, IPSP_DIRECTION_IN,
&p->conf.remote_addr, &p->auth.local_addr, 0, BGP_PORT) == -1) &as->remote_addr, &as->local_addr, 0, BGP_PORT) == -1)
goto fail_flow; goto fail_flow;
if (pfkey_reply(pfkey_fd, NULL) == -1) if (pfkey_reply(pfkey_fd, NULL) == -1)
goto fail_flow; goto fail_flow;
if (pfkey_flow(pfkey_fd, satype, SADB_X_DELFLOW, IPSP_DIRECTION_IN, if (pfkey_flow(pfkey_fd, satype, SADB_X_DELFLOW, IPSP_DIRECTION_IN,
&p->conf.remote_addr, &p->auth.local_addr, BGP_PORT, 0) == -1) &as->remote_addr, &as->local_addr, BGP_PORT, 0) == -1)
goto fail_flow; goto fail_flow;
if (pfkey_reply(pfkey_fd, NULL) == -1) if (pfkey_reply(pfkey_fd, NULL) == -1)
goto fail_flow; goto fail_flow;
p->auth.established = 0; explicit_bzero(as, sizeof(*as));
p->auth.spi_out = 0;
p->auth.spi_in = 0;
return (0); return (0);
fail_key: fail_key:
log_peer_warn(&p->conf, "failed to remove ipsec key"); log_warn("failed to remove ipsec key");
return (-1); return (-1);
fail_flow: fail_flow:
log_peer_warn(&p->conf, "failed to remove ipsec flow"); log_warn("failed to remove ipsec flow");
return (-1); return (-1);
} }
int int
pfkey_establish(struct peer *p) pfkey_establish(struct auth_state *as, struct auth_config *auth,
const struct bgpd_addr *local_addr, const struct bgpd_addr *remote_addr)
{ {
int rv; switch (auth->method) {
switch (p->conf.auth.method) {
case AUTH_NONE: case AUTH_NONE:
rv = 0; return pfkey_remove(as);
if (p->auth.established)
rv = pfkey_remove(p);
break;
case AUTH_MD5SIG: case AUTH_MD5SIG:
rv = pfkey_md5sig_establish(p); return pfkey_md5sig_establish(as, auth, local_addr,
break; remote_addr);
default: default:
rv = pfkey_ipsec_establish(p); return pfkey_ipsec_establish(as, auth, local_addr, remote_addr);
break;
} }
/*
* make sure we keep copies of everything we need to
* remove SAs and flows later again, even if the
* info in p->conf changed due to reload.
* We need: SPIs, method, local_addr, remote_addr.
* remote_addr cannot change, so no copy, SPI are
* handled by the method specific functions.
*/
memcpy(&p->auth.local_addr, pfkey_localaddr(p),
sizeof(p->auth.local_addr));
p->auth.method = p->conf.auth.method;
return (rv);
} }
int int
pfkey_remove(struct peer *p) pfkey_remove(struct auth_state *as)
{ {
if (p->auth.established == 0) if (as->established == 0)
return (0); return (0);
switch (p->auth.method) { switch (as->method) {
case AUTH_NONE: case AUTH_NONE:
return (0); return (0);
case AUTH_MD5SIG: case AUTH_MD5SIG:
return (pfkey_md5sig_remove(p)); return (pfkey_md5sig_remove(as));
default: default:
return (pfkey_ipsec_remove(p)); return (pfkey_ipsec_remove(as));
} }
} }
@ -847,26 +811,40 @@ pfkey_init(void)
return (pfkey_fd); return (pfkey_fd);
} }
/* verify that connection is using TCP MD5UM if required by config */
int int
tcp_md5_check(int fd, struct peer *p) pfkey_send_conf(struct imsgbuf *imsgbuf, uint32_t id, struct auth_config *auth)
{
/* SE only needs the auth method */
return imsg_compose(imsgbuf, IMSG_RECONF_PEER_AUTH, id, 0, -1,
&auth->method, sizeof(auth->method));
}
int
pfkey_recv_conf(struct peer *p, struct imsg *imsg)
{
struct auth_config *auth = &p->auth_conf;
return imsg_get_data(imsg, &auth->method, sizeof(auth->method));
}
/* verify that connection is using TCP MD5SIG if required by config */
int
tcp_md5_check(int fd, struct auth_config *auth)
{ {
socklen_t len; socklen_t len;
int opt; int opt;
if (p->conf.auth.method == AUTH_MD5SIG) { if (auth->method == AUTH_MD5SIG) {
if (sysdep.no_md5sig) { if (sysdep.no_md5sig) {
log_peer_warnx(&p->conf, errno = ENOPROTOOPT;
"md5sig configured but not available");
return -1; return -1;
} }
len = sizeof(opt); len = sizeof(opt);
if (getsockopt(fd, IPPROTO_TCP, TCP_MD5SIG, if (getsockopt(fd, IPPROTO_TCP, TCP_MD5SIG,
&opt, &len) == -1) &opt, &len) == -1)
fatal("getsockopt TCP_MD5SIG"); return -1;
if (!opt) { /* non-md5'd connection! */ if (!opt) { /* non-md5'd connection! */
log_peer_warnx(&p->conf, errno = ECONNREFUSED;
"connection attempt without md5 signature");
return -1; return -1;
} }
} }
@ -875,22 +853,19 @@ tcp_md5_check(int fd, struct peer *p)
/* enable or set TCP MD5SIG on a new client connection */ /* enable or set TCP MD5SIG on a new client connection */
int int
tcp_md5_set(int fd, struct peer *p) tcp_md5_set(int fd, struct auth_config *auth, struct bgpd_addr *remote_addr)
{ {
int opt = 1; int opt = 1;
if (p->conf.auth.method == AUTH_MD5SIG) { if (auth->method == AUTH_MD5SIG) {
if (sysdep.no_md5sig) { if (sysdep.no_md5sig) {
log_peer_warnx(&p->conf, errno = ENOPROTOOPT;
"md5sig configured but not available");
return -1; return -1;
} }
if (setsockopt(fd, IPPROTO_TCP, TCP_MD5SIG, if (setsockopt(fd, IPPROTO_TCP, TCP_MD5SIG,
&opt, sizeof(opt)) == -1) { &opt, sizeof(opt)) == -1)
log_peer_warn(&p->conf, "setsockopt md5sig");
return -1; return -1;
} }
}
return 0; return 0;
} }

View file

@ -1,4 +1,4 @@
/* $OpenBSD: printconf.c,v 1.174 2024/08/14 19:09:51 claudio Exp $ */ /* $OpenBSD: printconf.c,v 1.175 2024/10/01 11:49:24 claudio Exp $ */
/* /*
* Copyright (c) 2003, 2004 Henning Brauer <henning@openbsd.org> * Copyright (c) 2003, 2004 Henning Brauer <henning@openbsd.org>
@ -45,8 +45,7 @@ void print_originsets(struct prefixset_head *);
void print_roa(struct roa_tree *); void print_roa(struct roa_tree *);
void print_aspa(struct aspa_tree *); void print_aspa(struct aspa_tree *);
void print_rtrs(struct rtr_config_head *); void print_rtrs(struct rtr_config_head *);
void print_peer(struct peer_config *, struct bgpd_config *, void print_peer(struct peer *, struct bgpd_config *, const char *);
const char *);
const char *print_auth_alg(enum auth_alg); const char *print_auth_alg(enum auth_alg);
const char *print_enc_alg(enum auth_enc_alg); const char *print_enc_alg(enum auth_enc_alg);
void print_announce(struct peer_config *, const char *); void print_announce(struct peer_config *, const char *);
@ -729,10 +728,12 @@ print_rtrs(struct rtr_config_head *rh)
} }
void void
print_peer(struct peer_config *p, struct bgpd_config *conf, const char *c) print_peer(struct peer *peer, struct bgpd_config *conf, const char *c)
{ {
char *method;
struct in_addr ina; struct in_addr ina;
char *method;
struct peer_config *p = &peer->conf;
struct auth_config *auth = &peer->auth_conf;
if ((p->remote_addr.aid == AID_INET && p->remote_masklen != 32) || if ((p->remote_addr.aid == AID_INET && p->remote_masklen != 32) ||
(p->remote_addr.aid == AID_INET6 && p->remote_masklen != 128)) (p->remote_addr.aid == AID_INET6 && p->remote_masklen != 128))
@ -831,30 +832,30 @@ print_peer(struct peer_config *p, struct bgpd_config *conf, const char *c)
if (p->flags & PEERFLAG_LOG_UPDATES) if (p->flags & PEERFLAG_LOG_UPDATES)
printf("%s\tlog updates\n", c); printf("%s\tlog updates\n", c);
if (p->auth.method == AUTH_MD5SIG) if (auth->method == AUTH_MD5SIG)
printf("%s\ttcp md5sig\n", c); printf("%s\ttcp md5sig\n", c);
else if (p->auth.method == AUTH_IPSEC_MANUAL_ESP || else if (auth->method == AUTH_IPSEC_MANUAL_ESP ||
p->auth.method == AUTH_IPSEC_MANUAL_AH) { auth->method == AUTH_IPSEC_MANUAL_AH) {
if (p->auth.method == AUTH_IPSEC_MANUAL_ESP) if (auth->method == AUTH_IPSEC_MANUAL_ESP)
method = "esp"; method = "esp";
else else
method = "ah"; method = "ah";
printf("%s\tipsec %s in spi %u %s XXXXXX", c, method, printf("%s\tipsec %s in spi %u %s XXXXXX", c, method,
p->auth.spi_in, print_auth_alg(p->auth.auth_alg_in)); auth->spi_in, print_auth_alg(auth->auth_alg_in));
if (p->auth.enc_alg_in) if (auth->enc_alg_in)
printf(" %s XXXXXX", print_enc_alg(p->auth.enc_alg_in)); printf(" %s XXXXXX", print_enc_alg(auth->enc_alg_in));
printf("\n"); printf("\n");
printf("%s\tipsec %s out spi %u %s XXXXXX", c, method, printf("%s\tipsec %s out spi %u %s XXXXXX", c, method,
p->auth.spi_out, print_auth_alg(p->auth.auth_alg_out)); auth->spi_out, print_auth_alg(auth->auth_alg_out));
if (p->auth.enc_alg_out) if (auth->enc_alg_out)
printf(" %s XXXXXX", printf(" %s XXXXXX",
print_enc_alg(p->auth.enc_alg_out)); print_enc_alg(auth->enc_alg_out));
printf("\n"); printf("\n");
} else if (p->auth.method == AUTH_IPSEC_IKE_AH) } else if (auth->method == AUTH_IPSEC_IKE_AH)
printf("%s\tipsec ah ike\n", c); printf("%s\tipsec ah ike\n", c);
else if (p->auth.method == AUTH_IPSEC_IKE_ESP) else if (auth->method == AUTH_IPSEC_IKE_ESP)
printf("%s\tipsec esp ike\n", c); printf("%s\tipsec esp ike\n", c);
if (p->ttlsec) if (p->ttlsec)
@ -1196,39 +1197,36 @@ print_mrt(struct bgpd_config *conf, uint32_t pid, uint32_t gid,
void void
print_groups(struct bgpd_config *conf) print_groups(struct bgpd_config *conf)
{ {
struct peer_config **peerlist; struct peer **peerlist;
struct peer *p; struct peer *p;
u_int peer_cnt, i; u_int peer_cnt, i;
uint32_t prev_groupid; uint32_t prev_groupid;
const char *tab = "\t";
const char *nada = "";
const char *c; const char *c;
peer_cnt = 0; peer_cnt = 0;
RB_FOREACH(p, peer_head, &conf->peers) RB_FOREACH(p, peer_head, &conf->peers)
peer_cnt++; peer_cnt++;
if ((peerlist = calloc(peer_cnt, sizeof(*peerlist))) == NULL)
if ((peerlist = calloc(peer_cnt, sizeof(struct peer_config *))) == NULL)
fatal("print_groups calloc"); fatal("print_groups calloc");
i = 0; i = 0;
RB_FOREACH(p, peer_head, &conf->peers) RB_FOREACH(p, peer_head, &conf->peers)
peerlist[i++] = &p->conf; peerlist[i++] = p;
qsort(peerlist, peer_cnt, sizeof(struct peer_config *), peer_compare); qsort(peerlist, peer_cnt, sizeof(*peerlist), peer_compare);
prev_groupid = 0; prev_groupid = 0;
for (i = 0; i < peer_cnt; i++) { for (i = 0; i < peer_cnt; i++) {
if (peerlist[i]->groupid) { if (peerlist[i]->conf.groupid) {
c = tab; c = "\t";
if (peerlist[i]->groupid != prev_groupid) { if (peerlist[i]->conf.groupid != prev_groupid) {
if (prev_groupid) if (prev_groupid)
printf("}\n\n"); printf("}\n\n");
printf("group \"%s\" {\n", peerlist[i]->group); printf("group \"%s\" {\n",
prev_groupid = peerlist[i]->groupid; peerlist[i]->conf.group);
prev_groupid = peerlist[i]->conf.groupid;
} }
} else } else
c = nada; c = "";
print_peer(peerlist[i], conf, c); print_peer(peerlist[i], conf, c);
} }
@ -1242,13 +1240,13 @@ print_groups(struct bgpd_config *conf)
int int
peer_compare(const void *aa, const void *bb) peer_compare(const void *aa, const void *bb)
{ {
const struct peer_config * const *a; const struct peer * const *a;
const struct peer_config * const *b; const struct peer * const *b;
a = aa; a = aa;
b = bb; b = bb;
return ((*a)->groupid - (*b)->groupid); return ((*a)->conf.groupid - (*b)->conf.groupid);
} }
void void

View file

@ -1,4 +1,4 @@
/* $OpenBSD: session.c,v 1.482 2024/09/09 12:59:49 claudio Exp $ */ /* $OpenBSD: session.c,v 1.484 2024/10/01 18:29:34 claudio Exp $ */
/* /*
* Copyright (c) 2003, 2004, 2005 Henning Brauer <henning@openbsd.org> * Copyright (c) 2003, 2004, 2005 Henning Brauer <henning@openbsd.org>
@ -1032,14 +1032,15 @@ session_accept(int listenfd)
} }
open: open:
if (p->conf.auth.method != AUTH_NONE && sysdep.no_pfkey) { if (p->auth_conf.method != AUTH_NONE && sysdep.no_pfkey) {
log_peer_warnx(&p->conf, log_peer_warnx(&p->conf,
"ipsec or md5sig configured but not available"); "ipsec or md5sig configured but not available");
close(connfd); close(connfd);
return; return;
} }
if (tcp_md5_check(connfd, p) == -1) { if (tcp_md5_check(connfd, &p->auth_conf) == -1) {
log_peer_warn(&p->conf, "check md5sig");
close(connfd); close(connfd);
return; return;
} }
@ -1066,7 +1067,7 @@ int
session_connect(struct peer *peer) session_connect(struct peer *peer)
{ {
struct sockaddr *sa; struct sockaddr *sa;
struct bgpd_addr *bind_addr = NULL; struct bgpd_addr *bind_addr;
socklen_t sa_len; socklen_t sa_len;
/* /*
@ -1084,25 +1085,20 @@ session_connect(struct peer *peer)
return (-1); return (-1);
} }
if (peer->conf.auth.method != AUTH_NONE && sysdep.no_pfkey) { if (peer->auth_conf.method != AUTH_NONE && sysdep.no_pfkey) {
log_peer_warnx(&peer->conf, log_peer_warnx(&peer->conf,
"ipsec or md5sig configured but not available"); "ipsec or md5sig configured but not available");
bgp_fsm(peer, EVNT_CON_OPENFAIL); bgp_fsm(peer, EVNT_CON_OPENFAIL);
return (-1); return (-1);
} }
tcp_md5_set(peer->fd, peer); if (tcp_md5_set(peer->fd, &peer->auth_conf,
&peer->conf.remote_addr) == -1)
log_peer_warn(&peer->conf, "setting md5sig");
peer->wbuf.fd = peer->fd; peer->wbuf.fd = peer->fd;
/* if local-address is set we need to bind() */ /* if local-address is set we need to bind() */
switch (peer->conf.remote_addr.aid) { bind_addr = session_localaddr(peer);
case AID_INET:
bind_addr = &peer->conf.local_addr_v4;
break;
case AID_INET6:
bind_addr = &peer->conf.local_addr_v6;
break;
}
if ((sa = addr2sa(bind_addr, 0, &sa_len)) != NULL) { if ((sa = addr2sa(bind_addr, 0, &sa_len)) != NULL) {
if (bind(peer->fd, sa, sa_len) == -1) { if (bind(peer->fd, sa, sa_len) == -1) {
log_peer_warn(&peer->conf, "session_connect bind"); log_peer_warn(&peer->conf, "session_connect bind");
@ -3003,6 +2999,16 @@ session_dispatch_imsg(struct imsgbuf *imsgbuf, int idx, u_int *listener_cnt)
if (RB_INSERT(peer_head, &nconf->peers, p) != NULL) if (RB_INSERT(peer_head, &nconf->peers, p) != NULL)
fatalx("%s: peer tree is corrupt", __func__); fatalx("%s: peer tree is corrupt", __func__);
break; break;
case IMSG_RECONF_PEER_AUTH:
if (idx != PFD_PIPE_MAIN)
fatalx("reconf request not from parent");
if ((p = getpeerbyid(nconf, peerid)) == NULL) {
log_warnx("no such peer: id=%u", peerid);
break;
}
if (pfkey_recv_conf(p, &imsg) == -1)
fatal("pfkey_recv_conf");
break;
case IMSG_RECONF_LISTENER: case IMSG_RECONF_LISTENER:
if (idx != PFD_PIPE_MAIN) if (idx != PFD_PIPE_MAIN)
fatalx("reconf request not from parent"); fatalx("reconf request not from parent");
@ -3641,6 +3647,18 @@ session_stop(struct peer *peer, uint8_t subcode, const char *reason)
bgp_fsm(peer, EVNT_STOP); bgp_fsm(peer, EVNT_STOP);
} }
struct bgpd_addr *
session_localaddr(struct peer *p)
{
switch (p->conf.remote_addr.aid) {
case AID_INET:
return &p->conf.local_addr_v4;
case AID_INET6:
return &p->conf.local_addr_v6;
}
fatalx("Unknown AID in %s", __func__);
}
void void
merge_peers(struct bgpd_config *c, struct bgpd_config *nc) merge_peers(struct bgpd_config *c, struct bgpd_config *nc)
{ {
@ -3657,13 +3675,14 @@ merge_peers(struct bgpd_config *c, struct bgpd_config *nc)
} }
/* peer no longer uses TCP MD5SIG so deconfigure */ /* peer no longer uses TCP MD5SIG so deconfigure */
if (p->conf.auth.method == AUTH_MD5SIG && if (p->auth_conf.method == AUTH_MD5SIG &&
np->conf.auth.method != AUTH_MD5SIG) np->auth_conf.method != AUTH_MD5SIG)
tcp_md5_del_listener(c, p); tcp_md5_del_listener(c, p);
else if (np->conf.auth.method == AUTH_MD5SIG) else if (np->auth_conf.method == AUTH_MD5SIG)
tcp_md5_add_listener(c, np); tcp_md5_add_listener(c, np);
memcpy(&p->conf, &np->conf, sizeof(p->conf)); memcpy(&p->conf, &np->conf, sizeof(p->conf));
memcpy(&p->auth_conf, &np->auth_conf, sizeof(p->auth_conf));
RB_REMOVE(peer_head, &nc->peers, np); RB_REMOVE(peer_head, &nc->peers, np);
free(np); free(np);
@ -3706,7 +3725,7 @@ merge_peers(struct bgpd_config *c, struct bgpd_config *nc)
RB_REMOVE(peer_head, &nc->peers, np); RB_REMOVE(peer_head, &nc->peers, np);
if (RB_INSERT(peer_head, &c->peers, np) != NULL) if (RB_INSERT(peer_head, &c->peers, np) != NULL)
fatalx("%s: peer tree is corrupt", __func__); fatalx("%s: peer tree is corrupt", __func__);
if (np->conf.auth.method == AUTH_MD5SIG) if (np->auth_conf.method == AUTH_MD5SIG)
tcp_md5_add_listener(c, np); tcp_md5_add_listener(c, np);
} }
} }

View file

@ -1,4 +1,4 @@
/* $OpenBSD: session.h,v 1.173 2024/09/04 13:30:10 claudio Exp $ */ /* $OpenBSD: session.h,v 1.174 2024/10/01 11:49:24 claudio Exp $ */
/* /*
* Copyright (c) 2003, 2004 Henning Brauer <henning@openbsd.org> * Copyright (c) 2003, 2004 Henning Brauer <henning@openbsd.org>
@ -163,6 +163,15 @@ struct peer_stats {
char last_reason[REASON_LEN]; char last_reason[REASON_LEN];
}; };
struct auth_state {
struct bgpd_addr local_addr;
struct bgpd_addr remote_addr;
uint32_t spi_in;
uint32_t spi_out;
enum auth_method method;
uint8_t established;
};
enum Timer { enum Timer {
Timer_None, Timer_None,
Timer_ConnectRetry, Timer_ConnectRetry,
@ -197,13 +206,8 @@ struct peer {
struct capabilities peer; struct capabilities peer;
struct capabilities neg; struct capabilities neg;
} capa; } capa;
struct { struct auth_state auth_state;
struct bgpd_addr local_addr; struct auth_config auth_conf;
uint32_t spi_in;
uint32_t spi_out;
enum auth_method method;
uint8_t established;
} auth;
struct bgpd_addr local; struct bgpd_addr local;
struct bgpd_addr local_alt; struct bgpd_addr local_alt;
struct bgpd_addr remote; struct bgpd_addr remote;
@ -278,11 +282,14 @@ void mrt_done(struct mrt *);
/* pfkey.c */ /* pfkey.c */
struct sadb_msg; struct sadb_msg;
int pfkey_read(int, struct sadb_msg *); int pfkey_read(int, struct sadb_msg *);
int pfkey_establish(struct peer *); int pfkey_establish(struct auth_state *, struct auth_config *,
int pfkey_remove(struct peer *); const struct bgpd_addr *, const struct bgpd_addr *);
int pfkey_remove(struct auth_state *);
int pfkey_init(void); int pfkey_init(void);
int tcp_md5_check(int, struct peer *); int pfkey_send_conf(struct imsgbuf *, uint32_t, struct auth_config *);
int tcp_md5_set(int, struct peer *); int pfkey_recv_conf(struct peer *, struct imsg *);
int tcp_md5_check(int, struct auth_config *);
int tcp_md5_set(int, struct auth_config *, struct bgpd_addr *);
int tcp_md5_prep_listener(struct listen_addr *, struct peer_head *); int tcp_md5_prep_listener(struct listen_addr *, struct peer_head *);
void tcp_md5_add_listener(struct bgpd_config *, struct peer *); void tcp_md5_add_listener(struct bgpd_config *, struct peer *);
void tcp_md5_del_listener(struct bgpd_config *, struct peer *); void tcp_md5_del_listener(struct bgpd_config *, struct peer *);
@ -334,6 +341,7 @@ int imsg_ctl_parent(struct imsg *);
int imsg_ctl_rde(struct imsg *); int imsg_ctl_rde(struct imsg *);
int imsg_ctl_rde_msg(int, uint32_t, pid_t); int imsg_ctl_rde_msg(int, uint32_t, pid_t);
void session_stop(struct peer *, uint8_t, const char *); void session_stop(struct peer *, uint8_t, const char *);
struct bgpd_addr *session_localaddr(struct peer *);
/* timer.c */ /* timer.c */
struct timer *timer_get(struct timer_head *, enum Timer); struct timer *timer_get(struct timer_head *, enum Timer);

View file

@ -1,5 +1,5 @@
# ex:ts=8 sw=4: # ex:ts=8 sw=4:
# $OpenBSD: Log.pm,v 1.10 2023/06/13 09:07:17 espie Exp $ # $OpenBSD: Log.pm,v 1.11 2024/10/01 18:48:29 tb Exp $
# #
# Copyright (c) 2007-2010 Marc Espie <espie@openbsd.org> # Copyright (c) 2007-2010 Marc Espie <espie@openbsd.org>
# #
@ -104,7 +104,24 @@ sub fatal($self, @p)
sub system($self, @p) sub system($self, @p)
{ {
if (open(my $grab, "-|", @p)) { my ($todo, $todo2);
if (ref $p[0] eq 'CODE') {
$todo = shift @p;
} else {
$todo = sub() {};
}
if (ref $p[0] eq 'CODE') {
$todo2 = shift @p;
} else {
$todo2 = sub() {};
}
my $child_pid = open(my $grab, "-|");
if (!defined $child_pid) {
$self->{p}->say("system(#1) was not run: #2 #3",
join(", ", @p), $!, $self->{p}->child_error);
}
if ($child_pid) {
&$todo2();
while (<$grab>) { while (<$grab>) {
$self->{p}->_print($_); $self->{p}->_print($_);
} }
@ -115,8 +132,9 @@ sub system($self, @p)
} }
return $?; return $?;
} else { } else {
$self->{p}->say("system(#1) was not run: #2 #3", $DB::inhibit_exit = 0;
join(", ", @p), $!, $self->{p}->child_error); &$todo();
exec {$p[0]} (@p) or exit 1;
} }
} }

View file

@ -1,4 +1,4 @@
.\" $OpenBSD: pkg_add.1,v 1.167 2022/08/12 10:38:37 landry Exp $ .\" $OpenBSD: pkg_add.1,v 1.168 2024/10/02 09:14:08 tb Exp $
.\" .\"
.\" Documentation and design originally from FreeBSD. All the code has .\" Documentation and design originally from FreeBSD. All the code has
.\" been rewritten since. We keep the documentation's notice: .\" been rewritten since. We keep the documentation's notice:
@ -15,7 +15,7 @@
.\" Jordan K. Hubbard .\" Jordan K. Hubbard
.\" .\"
.\" .\"
.Dd $Mdocdate: August 12 2022 $ .Dd $Mdocdate: October 2 2024 $
.Dt PKG_ADD 1 .Dt PKG_ADD 1
.Os .Os
.Sh NAME .Sh NAME
@ -161,11 +161,6 @@ are defined,
will use will use
.Sq ./:installpath .Sq ./:installpath
as a default. as a default.
Specifying
.Ql -
as a package name causes
.Nm
to read from the standard input.
.Pp .Pp
.Nm .Nm
also understands also understands

View file

@ -1,4 +1,4 @@
/* $OpenBSD: pci.c,v 1.34 2024/09/26 01:45:13 jsg Exp $ */ /* $OpenBSD: pci.c,v 1.35 2024/10/02 17:05:56 dv Exp $ */
/* /*
* Copyright (c) 2015 Mike Larkin <mlarkin@openbsd.org> * Copyright (c) 2015 Mike Larkin <mlarkin@openbsd.org>
@ -73,7 +73,7 @@ pci_add_bar(uint8_t id, uint32_t type, void *barfn, void *cookie)
/* Compute BAR address and add */ /* Compute BAR address and add */
bar_reg_idx = (PCI_MAPREG_START + (bar_ct * 4)) / 4; bar_reg_idx = (PCI_MAPREG_START + (bar_ct * 4)) / 4;
if (type == PCI_MAPREG_TYPE_MEM) { if (type == PCI_MAPREG_TYPE_MEM) {
if (pci.pci_next_mmio_bar >= VMM_PCI_MMIO_BAR_END) if (pci.pci_next_mmio_bar >= PCI_MMIO_BAR_END)
return (1); return (1);
pci.pci_devices[id].pd_cfg_space[bar_reg_idx] = pci.pci_devices[id].pd_cfg_space[bar_reg_idx] =
@ -216,7 +216,7 @@ pci_init(void)
uint8_t id; uint8_t id;
memset(&pci, 0, sizeof(pci)); memset(&pci, 0, sizeof(pci));
pci.pci_next_mmio_bar = VMM_PCI_MMIO_BAR_BASE; pci.pci_next_mmio_bar = PCI_MMIO_BAR_BASE;
#ifdef __amd64__ #ifdef __amd64__
pci.pci_next_io_bar = VM_PCI_IO_BAR_BASE; pci.pci_next_io_bar = VM_PCI_IO_BAR_BASE;

View file

@ -1,4 +1,4 @@
/* $OpenBSD: pci.h,v 1.11 2024/07/10 09:27:33 dv Exp $ */ /* $OpenBSD: pci.h,v 1.12 2024/10/02 17:05:56 dv Exp $ */
/* /*
* Copyright (c) 2015 Mike Larkin <mlarkin@openbsd.org> * Copyright (c) 2015 Mike Larkin <mlarkin@openbsd.org>
@ -34,6 +34,9 @@
#define PCI_BAR_TYPE_IO 0x0 #define PCI_BAR_TYPE_IO 0x0
#define PCI_BAR_TYPE_MMIO 0x1 #define PCI_BAR_TYPE_MMIO 0x1
#define PCI_MMIO_BAR_BASE 0xF0000000ULL
#define PCI_MMIO_BAR_END 0xFFDFFFFFULL /* 2 MiB below 4 GiB */
#define PCI_MAX_PIC_IRQS 10 #define PCI_MAX_PIC_IRQS 10
typedef int (*pci_cs_fn_t)(int dir, uint8_t reg, uint32_t *data); typedef int (*pci_cs_fn_t)(int dir, uint8_t reg, uint32_t *data);

View file

@ -1,4 +1,4 @@
/* $OpenBSD: x86_vm.c,v 1.4 2024/09/26 01:45:13 jsg Exp $ */ /* $OpenBSD: x86_vm.c,v 1.5 2024/10/02 17:05:56 dv Exp $ */
/* /*
* Copyright (c) 2015 Mike Larkin <mlarkin@openbsd.org> * Copyright (c) 2015 Mike Larkin <mlarkin@openbsd.org>
* *
@ -192,7 +192,7 @@ create_memory_map(struct vm_create_params *vcp)
/* If we have less than 2MB remaining, still create a 2nd BIOS area. */ /* If we have less than 2MB remaining, still create a 2nd BIOS area. */
if (mem_bytes <= MB(2)) { if (mem_bytes <= MB(2)) {
vcp->vcp_memranges[2].vmr_gpa = VMM_PCI_MMIO_BAR_END; vcp->vcp_memranges[2].vmr_gpa = PCI_MMIO_BAR_END;
vcp->vcp_memranges[2].vmr_size = MB(2); vcp->vcp_memranges[2].vmr_size = MB(2);
vcp->vcp_memranges[2].vmr_type = VM_MEM_RESERVED; vcp->vcp_memranges[2].vmr_type = VM_MEM_RESERVED;
vcp->vcp_nmemranges = 3; vcp->vcp_nmemranges = 3;
@ -204,8 +204,8 @@ create_memory_map(struct vm_create_params *vcp)
* boundary while making sure we do not place physical memory into * boundary while making sure we do not place physical memory into
* MMIO ranges. * MMIO ranges.
*/ */
if (mem_bytes > VMM_PCI_MMIO_BAR_BASE - MB(1)) { if (mem_bytes > PCI_MMIO_BAR_BASE - MB(1)) {
above_1m = VMM_PCI_MMIO_BAR_BASE - MB(1); above_1m = PCI_MMIO_BAR_BASE - MB(1);
above_4g = mem_bytes - above_1m; above_4g = mem_bytes - above_1m;
} else { } else {
above_1m = mem_bytes; above_1m = mem_bytes;
@ -218,13 +218,13 @@ create_memory_map(struct vm_create_params *vcp)
vcp->vcp_memranges[2].vmr_type = VM_MEM_RAM; vcp->vcp_memranges[2].vmr_type = VM_MEM_RAM;
/* Fourth region: PCI MMIO range */ /* Fourth region: PCI MMIO range */
vcp->vcp_memranges[3].vmr_gpa = VMM_PCI_MMIO_BAR_BASE; vcp->vcp_memranges[3].vmr_gpa = PCI_MMIO_BAR_BASE;
vcp->vcp_memranges[3].vmr_size = VMM_PCI_MMIO_BAR_END - vcp->vcp_memranges[3].vmr_size = PCI_MMIO_BAR_END -
VMM_PCI_MMIO_BAR_BASE + 1; PCI_MMIO_BAR_BASE + 1;
vcp->vcp_memranges[3].vmr_type = VM_MEM_MMIO; vcp->vcp_memranges[3].vmr_type = VM_MEM_MMIO;
/* Fifth region: 2nd copy of BIOS above MMIO ending at 4GB */ /* Fifth region: 2nd copy of BIOS above MMIO ending at 4GB */
vcp->vcp_memranges[4].vmr_gpa = VMM_PCI_MMIO_BAR_END + 1; vcp->vcp_memranges[4].vmr_gpa = PCI_MMIO_BAR_END + 1;
vcp->vcp_memranges[4].vmr_size = MB(2); vcp->vcp_memranges[4].vmr_size = MB(2);
vcp->vcp_memranges[4].vmr_type = VM_MEM_RESERVED; vcp->vcp_memranges[4].vmr_type = VM_MEM_RESERVED;