[1363] in Kerberos-V5-bugs
dbm differences under BSDi v2.0
daemon@ATHENA.MIT.EDU (Kurt J. Lidl)
Mon May 8 11:38:41 1995
From: "Kurt J. Lidl" <lidl@Pix.COM>
To: krb5-bugs@MIT.EDU
Date: Mon, 8 May 1995 11:37:50 -0400 (EDT)
Cc: stripes@uu.net, jmalcolm@uu.net, tgsmith@uunet.uu
Here's a set of diffs that will allow the "make check" pass
under BSDi v2.0 and the K5.B5 software.
You will need to configure with --ccp-opts=-DDB_DBM to get
this to work.
I've #ifdef'd the code around DB_DBM.
These patches are necesary for anybody who wants to run the
kerberos server on a machine that uses the "libdb" routines,
rather than a traditional "ndbm" or "dbm" database. This
certainly includes BSDi v1.1 and v2.0, as well as the
NetBSD and FreeBSD efforts. I have no reason to suspect that
these changes will not work on all these platforms.
Hope this helps the V5 effort a little bit.
-Kurt
===================================================================
RCS file: admin/destroy/RCS/kdb5_destroy.c,v
retrieving revision 1.1
diff -u -r1.1 admin/destroy/kdb5_destroy.c
--- 1.1 1995/05/07 16:26:40
+++ admin/destroy/kdb5_destroy.c 1995/05/08 15:06:15
@@ -88,7 +88,11 @@
printf("OK, deleting database '%s'...\n", dbname);
}
(void) strcpy(dbfilename, dbname);
+#if defined(DB_DBM)
+ (void) strcat(dbfilename, ".db");
+#else
(void) strcat(dbfilename, ".dir");
+#endif
if (unlink(dbfilename) == -1) {
retval = errno;
com_err(argv[0], retval, "deleting database file '%s'",dbfilename);
@@ -100,6 +104,7 @@
"Database may be partially deleted--inspect files manually!\n");
exit(1);
}
+#if !defined(DB_DBM)
(void) strcpy(dbfilename, dbname);
(void) strcat(dbfilename, ".pag");
if (unlink(dbfilename) == -1) {
@@ -109,6 +114,7 @@
"Database may be partially deleted--inspect files manually!\n");
exit(1);
}
+#endif
(void) strcpy(dbfilename, dbname);
(void) strcat(dbfilename, ".ok");
if (unlink(dbfilename) == -1) {
===================================================================
RCS file: lib/kdb/RCS/kdb_dbm.c,v
retrieving revision 1.1
diff -u -r1.1 lib/kdb/kdb_dbm.c
--- 1.1 1995/05/07 16:45:56
+++ lib/kdb/kdb_dbm.c 1995/05/07 17:03:09
@@ -923,9 +923,18 @@
else
dbm_close(db);
#else /* OLD DBM */
+#if defined(DB_DBM)
+ char *dbname;
+#else
char *dirname;
char *pagname;
+#endif
+#if defined(DB_DBM)
+ dbname = gen_dbsuffix(db_name, ".db");
+ if (!dirname)
+ return ENOMEM;
+#else
dirname = gen_dbsuffix(db_name, ".dir");
if (!dirname)
return ENOMEM;
@@ -934,7 +943,18 @@
free_dbsuffix(dirname);
return ENOMEM;
}
+#endif
+#if defined(DB_DBM)
+ fd = open(dbname, O_RDWR|O_CREAT|O_EXCL, 0600);
+ if (fd < 0)
+ retval = errno;
+ else
+ close(fd);
+ if (dbminit(db_name) < 0)
+ retval = errno;
+ free_dbsuffix(dbname);
+#else
fd = open(dirname, O_RDWR|O_CREAT|O_EXCL, 0600);
if (fd < 0)
retval = errno;
@@ -950,6 +970,7 @@
}
free_dbsuffix(dirname);
free_dbsuffix(pagname);
+#endif
#endif /* ODBM */
if (retval == 0) {
okname = gen_dbsuffix(db_name, ".ok");
@@ -1030,10 +1051,15 @@
{
krb5_error_code retval;
+#if defined(DB_DBM)
+ if (retval = destroy_file_suffix(dbname, ".db"))
+ return(retval);
+#else
if (retval = destroy_file_suffix(dbname, ".pag"))
return(retval);
if (retval = destroy_file_suffix(dbname, ".dir"))
return(retval);
+#endif
if (retval = destroy_file_suffix(dbname, ".ok"))
return(retval);
return(0);
@@ -1053,14 +1079,29 @@
char *from;
char *to;
{
+#if defined(DB_DBM)
+ char *fromdb = 0;
+ char *todb = 0;
+#else
char *fromdir = 0;
char *todir = 0;
char *frompag = 0;
char *topag = 0;
+#endif
char *fromok = 0;
time_t trans;
krb5_error_code retval;
+#if defined(DB_DBM)
+ fromdb = gen_dbsuffix (from, ".db");
+ if (!fromdb)
+ return ENOMEM;
+ todb = gen_dbsuffix (to, ".db");
+ if (!todb) {
+ retval = ENOMEM;
+ goto errout;
+ }
+#else
fromdir = gen_dbsuffix (from, ".dir");
if (!fromdir)
return ENOMEM;
@@ -1079,6 +1120,8 @@
retval = ENOMEM;
goto errout;
}
+#endif
+
fromok = gen_dbsuffix(from, ".ok");
if (!fromok) {
retval = ENOMEM;
@@ -1088,8 +1131,13 @@
if (retval = krb5_dbm_db_start_update(context, to, &trans))
goto errout;
+#if defined(DB_DBM)
+ if (rename (fromdb, todb) == 0)
+#else
if ((rename (fromdir, todir) == 0)
- && (rename (frompag, topag) == 0)) {
+ && (rename (frompag, topag) == 0))
+#endif
+ {
(void) unlink (fromok);
retval = 0;
} else
@@ -1098,6 +1146,12 @@
errout:
if (fromok)
free_dbsuffix (fromok);
+#if defined(DB_DBM)
+ if (todb)
+ free_dbsuffix (todb);
+ if (fromdb)
+ free_dbsuffix (fromdb);
+#else
if (topag)
free_dbsuffix (topag);
if (frompag)
@@ -1106,6 +1160,7 @@
free_dbsuffix (todir);
if (fromdir)
free_dbsuffix (fromdir);
+#endif
if (retval == 0)
return krb5_dbm_db_end_update(context, to, trans);