104 |
* if unlink do job normally, those who already open tag file can use |
* if unlink do job normally, those who already open tag file can use |
105 |
* it until closing. |
* it until closing. |
106 |
*/ |
*/ |
107 |
if (mode == 1 && test("f", path)) |
if (path != NULL && mode == 1 && test("f", path)) |
108 |
(void)unlink(path); |
(void)unlink(path); |
109 |
db = dbopen(path, rw, 0600, DB_BTREE, &info); |
db = dbopen(path, rw, 0600, DB_BTREE, &info); |
110 |
if (!db) |
if (!db) |
111 |
return NULL; |
return NULL; |
112 |
if (!(dbop = (DBOP *)malloc(sizeof(DBOP)))) |
if (!(dbop = (DBOP *)malloc(sizeof(DBOP)))) |
113 |
die("short of memory."); |
die("short of memory."); |
114 |
strlimcpy(dbop->dbname, path, sizeof(dbop->dbname)); |
if (path == NULL) |
115 |
|
dbop->dbname[0] = '\0'; |
116 |
|
else |
117 |
|
strlimcpy(dbop->dbname, path, sizeof(dbop->dbname)); |
118 |
dbop->db = db; |
dbop->db = db; |
119 |
dbop->openflags = flags; |
dbop->openflags = flags; |
120 |
dbop->perm = (mode == 1) ? perm : 0; |
dbop->perm = (mode == 1) ? perm : 0; |
410 |
/* |
/* |
411 |
* If DBOP_REMOVE is specified, omit writing to the disk in __bt_close(). |
* If DBOP_REMOVE is specified, omit writing to the disk in __bt_close(). |
412 |
*/ |
*/ |
413 |
(void)db->close(db, (dbop->openflags & DBOP_REMOVE) ? 1 : 0); |
(void)db->close(db, (dbop->openflags & DBOP_REMOVE || dbop->dbname[0] == '\0') ? 1 : 0); |
414 |
#endif |
#endif |
415 |
if (dbop->openflags & DBOP_REMOVE) |
if (dbop->dbname[0] != '\0') { |
416 |
(void)unlink(dbop->dbname); |
if (dbop->openflags & DBOP_REMOVE) |
417 |
else if (dbop->perm && chmod(dbop->dbname, dbop->perm) < 0) |
(void)unlink(dbop->dbname); |
418 |
die("cannot change file mode."); |
else if (dbop->perm && chmod(dbop->dbname, dbop->perm) < 0) |
419 |
|
die("cannot change file mode."); |
420 |
|
} |
421 |
(void)free(dbop); |
(void)free(dbop); |
422 |
} |
} |