(from Derrick Brashear): Propagating a large database without this

means the slave kdcs can get erroneous HDB_NOENTRY and return the
resulting errors. This creates a new db handle, populates it, and
moves it into place.


git-svn-id: svn://svn.h5l.se/heimdal/trunk/heimdal@11514 ec53bebd-3082-4978-b11e-865c3cabbd6b
This commit is contained in:
Johan Danielsson
2002-10-21 15:51:44 +00:00
parent 27cc22110f
commit 1c74114ff4

View File

@@ -229,9 +229,24 @@ receive_everything (krb5_context context, int fd,
int32_t opcode;
unsigned long tmp;
ret = server_context->db->open(context,
server_context->db,
O_RDWR | O_CREAT | O_TRUNC, 0600);
char *dbname;
HDB *mydb;
asprintf(&dbname, "%s-NEW", server_context->db->name);
ret = hdb_create(context, &mydb, dbname);
if(ret)
krb5_err(context,1, ret, "hdb_create");
free(dbname);
ret = hdb_set_master_keyfile (context,
mydb, server_context->config.stash_file);
if(ret)
krb5_err(context,1, ret, "hdb_set_master_keyfile");
/* I really want to use O_EXCL here, but given that I can't easily clean
up on error, I won't */
ret = mydb->open(context, mydb, O_RDWR | O_CREAT | O_TRUNC, 0600);
if (ret)
krb5_err (context, 1, ret, "db->open");
@@ -255,9 +270,9 @@ receive_everything (krb5_context context, int fd,
ret = hdb_value2entry (context, &fake_data, &entry);
if (ret)
krb5_err (context, 1, ret, "hdb_value2entry");
ret = server_context->db->store(server_context->context,
server_context->db,
0, &entry);
ret = mydb->store(server_context->context,
mydb,
0, &entry);
if (ret)
krb5_err (context, 1, ret, "hdb_store");
@@ -286,9 +301,15 @@ receive_everything (krb5_context context, int fd,
krb5_data_free (&data);
ret = server_context->db->close (context, server_context->db);
ret = mydb->close (context, mydb);
if (ret)
krb5_err (context, 1, ret, "db->close");
ret = mydb->rename (context, mydb, server_context->db->name);
if (ret)
krb5_err (context, 1, ret, "db->rename");
ret = mydb->destroy (context, mydb);
if (ret)
krb5_err (context, 1, ret, "db->destroy");
}
static char *realm;