Path: blob/main/crypto/krb5/src/ccapi/lib/ccapi_context_change_time.c
39536 views
/* ccapi/lib/ccapi_context_change_time.c */1/*2* Copyright 2006, 2007 Massachusetts Institute of Technology.3* All Rights Reserved.4*5* Export of this software from the United States of America may6* require a specific license from the United States Government.7* It is the responsibility of any person or organization contemplating8* export to obtain such a license before exporting.9*10* WITHIN THAT CONSTRAINT, permission to use, copy, modify, and11* distribute this software and its documentation for any purpose and12* without fee is hereby granted, provided that the above copyright13* notice appear in all copies and that both that copyright notice and14* this permission notice appear in supporting documentation, and that15* the name of M.I.T. not be used in advertising or publicity pertaining16* to distribution of the software without specific, written prior17* permission. Furthermore if you modify this software you must label18* your software as modified software and not distribute it in such a19* fashion that it might be confused with the original M.I.T. software.20* M.I.T. makes no representations about the suitability of21* this software for any purpose. It is provided "as is" without express22* or implied warranty.23*/2425#include "ccapi_context_change_time.h"26#include "cci_common.h"2728#include "k5-thread.h"2930static cci_identifier_t g_change_time_identifer = NULL;31static cc_time_t g_change_time = 0;32static cc_time_t g_change_time_offset = 0;33static k5_mutex_t g_change_time_mutex = K5_MUTEX_PARTIAL_INITIALIZER;3435/* ------------------------------------------------------------------------ */3637cc_int32 cci_context_change_time_thread_init (void)38{39return k5_mutex_finish_init(&g_change_time_mutex);40}4142/* ------------------------------------------------------------------------ */4344void cci_context_change_time_thread_fini (void)45{46k5_mutex_destroy(&g_change_time_mutex);47}4849/* ------------------------------------------------------------------------ */50/* WARNING! Mutex must be locked when calling this! */5152static cc_int32 cci_context_change_time_update_identifier (cci_identifier_t in_new_identifier,53cc_uint32 *out_server_ids_match,54cc_uint32 *out_old_server_running,55cc_uint32 *out_new_server_running)56{57cc_int32 err = ccNoError;58cc_uint32 server_ids_match = 0;59cc_uint32 old_server_running = 0;60cc_uint32 new_server_running = 0;6162if (!in_new_identifier) { err = cci_check_error (err); }6364if (!err && !g_change_time_identifer) {65g_change_time_identifer = cci_identifier_uninitialized;66}6768if (!err) {69err = cci_identifier_compare_server_id (g_change_time_identifer,70in_new_identifier,71&server_ids_match);72}7374if (!err && out_old_server_running) {75err = cci_identifier_is_initialized (g_change_time_identifer, &old_server_running);76}7778if (!err && out_new_server_running) {79err = cci_identifier_is_initialized (in_new_identifier, &new_server_running);80}8182if (!err && !server_ids_match) {83cci_identifier_t new_change_time_identifer = NULL;8485err = cci_identifier_copy (&new_change_time_identifer, in_new_identifier);8687if (!err) {88/* Save the new identifier */89if (g_change_time_identifer) {90cci_identifier_release (g_change_time_identifer);91}92g_change_time_identifer = new_change_time_identifer;93}94}9596if (!err) {97if (out_server_ids_match ) { *out_server_ids_match = server_ids_match; }98if (out_old_server_running) { *out_old_server_running = old_server_running; }99if (out_new_server_running) { *out_new_server_running = new_server_running; }100}101102103return cci_check_error (err);104}105106#ifdef TARGET_OS_MAC107#pragma mark -108#endif109110/* ------------------------------------------------------------------------ */111112cc_int32 cci_context_change_time_get (cc_time_t *out_change_time)113{114cc_int32 err = ccNoError;115116k5_mutex_lock (&g_change_time_mutex);117118*out_change_time = g_change_time + g_change_time_offset;119k5_mutex_unlock (&g_change_time_mutex);120121return err;122}123124/* ------------------------------------------------------------------------ */125126cc_int32 cci_context_change_time_update (cci_identifier_t in_identifier,127cc_time_t in_new_change_time)128{129cc_int32 err = ccNoError;130k5_mutex_lock (&g_change_time_mutex);131132if (!in_identifier) { err = cci_check_error (err); }133134if (!err) {135if (g_change_time < in_new_change_time) {136/* Only update if it increases the time. May be a different server. */137g_change_time = in_new_change_time;138cci_debug_printf ("%s: setting change time to %d",139__FUNCTION__, in_new_change_time);140}141}142143if (!err) {144err = cci_context_change_time_update_identifier (in_identifier,145NULL, NULL, NULL);146}147148k5_mutex_unlock (&g_change_time_mutex);149150return err;151}152153/* ------------------------------------------------------------------------ */154155cc_int32 cci_context_change_time_sync (cci_identifier_t in_new_identifier)156{157cc_int32 err = ccNoError;158cc_uint32 server_ids_match = 0;159cc_uint32 server_was_running = 0;160cc_uint32 server_is_running = 0;161162k5_mutex_lock (&g_change_time_mutex);163164if (!in_new_identifier) { err = cci_check_error (err); }165166if (!err) {167err = cci_context_change_time_update_identifier (in_new_identifier,168&server_ids_match,169&server_was_running,170&server_is_running);171}172173if (!err && !server_ids_match) {174/* Increment the change time so callers re-read */175g_change_time_offset++;176177/* If the server died, absorb the offset */178if (server_was_running && !server_is_running) {179cc_time_t now = time (NULL);180181g_change_time += g_change_time_offset;182g_change_time_offset = 0;183184/* Make sure the change time increases, ideally with the current time */185g_change_time = (g_change_time < now) ? now : g_change_time;186}187188cci_debug_printf ("%s noticed server changed ("189"server_was_running = %d; server_is_running = %d; "190"g_change_time = %d; g_change_time_offset = %d",191__FUNCTION__, server_was_running, server_is_running,192g_change_time, g_change_time_offset);193}194195k5_mutex_unlock (&g_change_time_mutex);196197return err;198}199200201