summaryrefslogtreecommitdiff
path: root/source3
diff options
context:
space:
mode:
Diffstat (limited to 'source3')
-rw-r--r--source3/printing/nt_printing.c8
-rw-r--r--source3/printing/printing.c25
-rw-r--r--source3/smbd/server.c11
3 files changed, 25 insertions, 19 deletions
diff --git a/source3/printing/nt_printing.c b/source3/printing/nt_printing.c
index 6e4bb1e977..7b19b74025 100644
--- a/source3/printing/nt_printing.c
+++ b/source3/printing/nt_printing.c
@@ -252,7 +252,7 @@ static BOOL upgrade_to_version_3(void)
}
/****************************************************************************
- Open the NT printing tdb.
+ Open the NT printing tdbs. Done once before fork().
****************************************************************************/
BOOL nt_printing_init(void)
@@ -263,6 +263,8 @@ BOOL nt_printing_init(void)
if (tdb_drivers && tdb_printers && tdb_forms && local_pid == sys_getpid())
return True;
+ if (tdb_drivers)
+ tdb_close(tdb_drivers);
tdb_drivers = tdb_open_log(lock_path("ntdrivers.tdb"), 0, TDB_DEFAULT, O_RDWR|O_CREAT, 0600);
if (!tdb_drivers) {
DEBUG(0,("nt_printing_init: Failed to open nt drivers database %s (%s)\n",
@@ -270,6 +272,8 @@ BOOL nt_printing_init(void)
return False;
}
+ if (tdb_printers)
+ tdb_close(tdb_printers);
tdb_printers = tdb_open_log(lock_path("ntprinters.tdb"), 0, TDB_DEFAULT, O_RDWR|O_CREAT, 0600);
if (!tdb_printers) {
DEBUG(0,("nt_printing_init: Failed to open nt printers database %s (%s)\n",
@@ -277,6 +281,8 @@ BOOL nt_printing_init(void)
return False;
}
+ if (tdb_forms)
+ tdb_close(tdb_forms);
tdb_forms = tdb_open_log(lock_path("ntforms.tdb"), 0, TDB_DEFAULT, O_RDWR|O_CREAT, 0600);
if (!tdb_forms) {
DEBUG(0,("nt_printing_init: Failed to open nt forms database %s (%s)\n",
diff --git a/source3/printing/printing.c b/source3/printing/printing.c
index 2d75699ac5..2121fb20a3 100644
--- a/source3/printing/printing.c
+++ b/source3/printing/printing.c
@@ -154,6 +154,7 @@ static struct tdb_print_db *get_print_db_byname(const char *printername)
struct tdb_print_db *p = NULL, *last_entry = NULL;
int num_open = 0;
pstring printdb_path;
+ BOOL done_become_root = False;
for (p = print_db_head, last_entry = print_db_head; p; p = p->next) {
/* Ensure the list terminates... JRA. */
@@ -209,9 +210,15 @@ static struct tdb_print_db *get_print_db_byname(const char *printername)
pstrcat(printdb_path, printername);
pstrcat(printdb_path, ".tdb");
- become_root();
+ if (geteuid() != 0) {
+ become_root();
+ done_become_root = True;
+ }
+
p->tdb = tdb_open_log(printdb_path, 0, TDB_DEFAULT, O_RDWR|O_CREAT, 0600);
- unbecome_root();
+
+ if (done_become_root)
+ unbecome_root();
if (!p->tdb) {
DEBUG(0,("get_print_db: Failed to open printer backend database %s.\n",
@@ -255,8 +262,7 @@ static void close_all_print_db(void)
}
/****************************************************************************
- Initialise the printing backend. Called once at startup.
- Does not survive a fork
+ Initialise the printing backend. Called once at startup before the fork().
****************************************************************************/
BOOL print_backend_init(void)
@@ -316,16 +322,7 @@ BOOL print_backend_init(void)
void printing_end(void)
{
- struct tdb_print_db *p;
-
- for (p = print_db_head; p; ) {
- struct tdb_print_db *next_p = p->next;
- if (p->tdb)
- tdb_close(p->tdb);
- DLIST_REMOVE(print_db_head, p);
- SAFE_FREE(p);
- p = next_p;
- }
+ close_all_print_db(); /* Don't leave any open. */
}
/****************************************************************************
diff --git a/source3/smbd/server.c b/source3/smbd/server.c
index 39d5e3bcd3..ad00794bd7 100644
--- a/source3/smbd/server.c
+++ b/source3/smbd/server.c
@@ -370,7 +370,10 @@ static BOOL open_sockets_smbd(BOOL is_daemon,const char *smb_ports)
reset_globals_after_fork();
/* tdb needs special fork handling */
- tdb_reopen_all();
+ if (tdb_reopen_all() == -1) {
+ DEBUG(0,("tdb_reopen_all failed.\n"));
+ return False;
+ }
return True;
}
@@ -859,6 +862,9 @@ static void usage(char *pname)
register_msg_pool_usage();
register_dmalloc_msgs();
+ if (!print_backend_init())
+ exit(1);
+
/* Setup the main smbd so that we can get messages. */
claim_connection(NULL,"",0,True,FLAG_MSG_GENERAL|FLAG_MSG_SMBD);
@@ -881,9 +887,6 @@ static void usage(char *pname)
if (!locking_init(0))
exit(1);
- if (!print_backend_init())
- exit(1);
-
if (!share_info_db_init())
exit(1);