extern pstring global_myname;
extern DOM_SID global_sid_World;
-static TDB_CONTEXT *tdb; /* used for driver files */
+/*static TDB_CONTEXT *tdb; *//* used for driver files */
+
+static TDB_CONTEXT *tdb_forms; /* used for forms files */
+static TDB_CONTEXT *tdb_drivers; /* used for driver files */
+static TDB_CONTEXT *tdb_printers; /* used for printers files */
#define FORMS_PREFIX "FORMS/"
#define DRIVERS_PREFIX "DRIVERS/"
#define PRINTERS_PREFIX "PRINTERS/"
+#define SECDESC_PREFIX "SECDESC/"
+
+#define NTDRIVERS_DATABASE_VERSION_1 1
+#define NTDRIVERS_DATABASE_VERSION_2 2
-#define NTDRIVERS_DATABASE_VERSION 1
+#define NTDRIVERS_DATABASE_VERSION NTDRIVERS_DATABASE_VERSION_2
/* Map generic permissions to printer object specific permissions */
{"PRC Envelope #10 Rotated",0x1,0x6fd10,0x4f1a0,0x0,0x0,0x6fd10,0x4f1a0}
};
+static void upgrade_to_version_2(void)
+{
+ TDB_DATA kbuf, newkey, dbuf;
+ nt_forms_struct form;
+ int ret;
+ int i;
+ int n = 0;
+
+ DEBUG(0,("upgrade_to_version_2:upgrading to version 2\n"));
+
+ for (kbuf = tdb_firstkey(tdb_drivers);
+ kbuf.dptr;
+ newkey = tdb_nextkey(tdb_drivers, kbuf), safe_free(kbuf.dptr), kbuf=newkey) {
+ dbuf = tdb_fetch(tdb_drivers, kbuf);
+
+ if (strncmp(kbuf.dptr, FORMS_PREFIX, strlen(FORMS_PREFIX)) == 0) {
+ DEBUG(0,("upgrade_to_version_2:moving form\n"));
+ if (tdb_store(tdb_forms, kbuf, dbuf, TDB_REPLACE) != 0) break;
+ tdb_delete(tdb_drivers, kbuf);
+ }
+
+ if (strncmp(kbuf.dptr, PRINTERS_PREFIX, strlen(PRINTERS_PREFIX)) == 0) {
+ DEBUG(0,("upgrade_to_version_2:moving printer\n"));
+ if (tdb_store(tdb_printers, kbuf, dbuf, TDB_REPLACE) != 0) break;
+ tdb_delete(tdb_drivers, kbuf);
+ }
+
+ if (strncmp(kbuf.dptr, SECDESC_PREFIX, strlen(SECDESC_PREFIX)) == 0) {
+ DEBUG(0,("upgrade_to_version_2:moving secdesc\n"));
+ if (tdb_store(tdb_printers, kbuf, dbuf, TDB_REPLACE) != 0) break;
+ tdb_delete(tdb_drivers, kbuf);
+ }
+
+ safe_free(dbuf.dptr);
+ }
+
+
+
+}
+
/****************************************************************************
open the NT printing tdb
static pid_t local_pid;
char *vstring = "INFO/version";
- if (tdb && local_pid == sys_getpid()) return True;
- tdb = tdb_open_log(lock_path("ntdrivers.tdb"), 0, 0, O_RDWR|O_CREAT, 0600);
- if (!tdb) {
+ fstring *list=NULL;
+ int count;
+ int i;
+
+ if (tdb_drivers && tdb_printers && tdb_forms && local_pid == sys_getpid()) return True;
+
+ tdb_drivers = tdb_open_log(lock_path("ntdrivers.tdb"), 0, 0, O_RDWR|O_CREAT, 0600);
+ if (!tdb_drivers) {
DEBUG(0,("Failed to open nt drivers database %s (%s)\n",
lock_path("ntdrivers.tdb"), strerror(errno) ));
return False;
}
+ tdb_printers = tdb_open_log(lock_path("ntprinters.tdb"), 0, 0, O_RDWR|O_CREAT, 0600);
+ if (!tdb_printers) {
+ DEBUG(0,("Failed to open nt printers database %s (%s)\n",
+ lock_path("ntprinters.tdb"), strerror(errno) ));
+ return False;
+ }
+
+ tdb_forms = tdb_open_log(lock_path("ntforms.tdb"), 0, 0, O_RDWR|O_CREAT, 0600);
+ if (!tdb_forms) {
+ DEBUG(0,("Failed to open nt forms database %s (%s)\n",
+ lock_path("ntforms.tdb"), strerror(errno) ));
+ return False;
+ }
+
local_pid = sys_getpid();
/* handle a Samba upgrade */
- tdb_lock_bystring(tdb, vstring);
- if (tdb_fetch_int(tdb, vstring) != NTDRIVERS_DATABASE_VERSION) {
- tdb_traverse(tdb, (tdb_traverse_func)tdb_delete, NULL);
- tdb_store_int(tdb, vstring, NTDRIVERS_DATABASE_VERSION);
+ tdb_lock_bystring(tdb_drivers, vstring);
+ if (tdb_fetch_int(tdb_drivers, vstring) != NTDRIVERS_DATABASE_VERSION) {
+
+ if (tdb_fetch_int(tdb_drivers, vstring) == NTDRIVERS_DATABASE_VERSION_1)
+ upgrade_to_version_2();
+ else
+ tdb_traverse(tdb_drivers, (tdb_traverse_func)tdb_delete, NULL);
+
+ tdb_store_int(tdb_drivers, vstring, NTDRIVERS_DATABASE_VERSION);
}
- tdb_unlock_bystring(tdb, vstring);
+ tdb_unlock_bystring(tdb_drivers, vstring);
+/*
+ tdb_create_index(tdb, "DRIVERS/");
+
+ tdb_lookup_index(tdb, "DRIVERS/", &list, &count);
+
+ DEBUG(0,("nt_printing_init: got %d drivers\n", count));
+
+ for (i=0;i<count;i++)
+ DEBUG(0,("nt_printing_init: [%s]\n", list[i]));
+*/
return True;
}
int i;
int n = 0;
- for (kbuf = tdb_firstkey(tdb);
+ for (kbuf = tdb_firstkey(tdb_forms);
kbuf.dptr;
- newkey = tdb_nextkey(tdb, kbuf), safe_free(kbuf.dptr), kbuf=newkey) {
+ newkey = tdb_nextkey(tdb_forms, kbuf), safe_free(kbuf.dptr), kbuf=newkey) {
if (strncmp(kbuf.dptr, FORMS_PREFIX, strlen(FORMS_PREFIX)) != 0) continue;
- dbuf = tdb_fetch(tdb, kbuf);
+ dbuf = tdb_fetch(tdb_forms, kbuf);
if (!dbuf.dptr) continue;
fstrcpy(form.name, kbuf.dptr+strlen(FORMS_PREFIX));
kbuf.dptr = key;
dbuf.dsize = len;
dbuf.dptr = buf;
- if (tdb_store(tdb, kbuf, dbuf, TDB_REPLACE) != 0) break;
+ if (tdb_store(tdb_forms, kbuf, dbuf, TDB_REPLACE) != 0) break;
}
return i;
slprintf(key, sizeof(key)-1, "%s%s", FORMS_PREFIX, (*list)[n].name);
kbuf.dsize = strlen(key)+1;
kbuf.dptr = key;
- if (tdb_delete(tdb, kbuf) != 0) {
+ if (tdb_delete(tdb_forms, kbuf) != 0) {
*ret = ERROR_NOT_ENOUGH_MEMORY;
return False;
}
get_short_archi(short_archi, architecture);
slprintf(key, sizeof(key)-1, "%s%s/%d/", DRIVERS_PREFIX, short_archi, version);
- for (kbuf = tdb_firstkey(tdb);
+ for (kbuf = tdb_firstkey(tdb_drivers);
kbuf.dptr;
- newkey = tdb_nextkey(tdb, kbuf), safe_free(kbuf.dptr), kbuf=newkey) {
+ newkey = tdb_nextkey(tdb_drivers, kbuf), safe_free(kbuf.dptr), kbuf=newkey) {
if (strncmp(kbuf.dptr, key, strlen(key)) != 0) continue;
if((*list = Realloc(*list, sizeof(fstring)*(total+1))) == NULL)
dbuf.dptr = buf;
dbuf.dsize = len;
- ret = tdb_store(tdb, kbuf, dbuf, TDB_REPLACE);
+ ret = tdb_store(tdb_drivers, kbuf, dbuf, TDB_REPLACE);
if (ret)
DEBUG(0,("add_a_printer_driver_3: Adding driver with key %s failed.\n", key ));
kbuf.dptr = key;
kbuf.dsize = strlen(key)+1;
- dbuf = tdb_fetch(tdb, kbuf);
+ dbuf = tdb_fetch(tdb_drivers, kbuf);
#if 0
if (!dbuf.dptr) return get_a_printer_driver_3_default(info_ptr, in_prt, in_arch);
#else
kbuf.dptr = key;
kbuf.dsize = strlen(key)+1;
- if (!tdb_exists(tdb, kbuf)) return False;
+ if (!tdb_exists(tdb_drivers, kbuf)) return False;
ZERO_STRUCT(info3);
get_a_printer_driver_3(&info3, model, "Windows 4.0", 0);
kbuf.dptr=key;
kbuf.dsize=strlen(key)+1;
- tdb_delete(tdb, kbuf);
+ tdb_delete(tdb_printers, kbuf);
return 0;
}
dbuf.dptr = buf;
dbuf.dsize = len;
- ret = tdb_store(tdb, kbuf, dbuf, TDB_REPLACE);
+ ret = tdb_store(tdb_printers, kbuf, dbuf, TDB_REPLACE);
if (ret == -1)
DEBUG(8, ("error updating printer to tdb on disk\n"));
kbuf.dptr = key;
kbuf.dsize = strlen(key)+1;
- dbuf = tdb_fetch(tdb, kbuf);
+ dbuf = tdb_fetch(tdb_printers, kbuf);
if (!dbuf.dptr)
return get_a_printer_2_default(info_ptr, sharename);
NT_PRINTER_INFO_LEVEL_2 info;
int ret;
- if (!tdb)
+ if (!tdb_printers)
nt_printing_init();
DEBUG(5,("printer_driver_in_use: Beginning search through printers.tdb...\n"));
/* loop through the printers.tdb and check for the drivername */
- for (kbuf = tdb_firstkey(tdb); kbuf.dptr;
- newkey = tdb_nextkey(tdb, kbuf), safe_free(kbuf.dptr), kbuf=newkey)
+ for (kbuf = tdb_firstkey(tdb_printers); kbuf.dptr;
+ newkey = tdb_nextkey(tdb_printers, kbuf), safe_free(kbuf.dptr), kbuf=newkey)
{
- dbuf = tdb_fetch(tdb, kbuf);
+ dbuf = tdb_fetch(tdb_printers, kbuf);
if (!dbuf.dptr)
continue;
kbuf.dptr=key;
kbuf.dsize=strlen(key)+1;
- if (tdb_delete(tdb, kbuf) == -1) {
+ if (tdb_delete(tdb_drivers, kbuf) == -1) {
DEBUG (0,("delete_printer_driver: fail to delete %s!\n", key));
return NT_STATUS_ACCESS_VIOLATION;
}
goto out;
}
- slprintf(key, sizeof(key)-1, "SECDESC/%s", printername);
+ slprintf(key, sizeof(key)-1, "%s%s", SECDESC_PREFIX, printername);
- if (tdb_prs_store(tdb, key, &ps)==0) {
+ if (tdb_prs_store(tdb_printers, key, &ps)==0) {
status = 0;
} else {
DEBUG(1,("Failed to store secdesc for %s\n", printername));
/* Fetch security descriptor from tdb */
- slprintf(key, sizeof(key)-1, "SECDESC/%s", printername);
+ slprintf(key, sizeof(key)-1, "%s%s", SECDESC_PREFIX, printername);
- if (tdb_prs_fetch(tdb, key, &ps, ctx)!=0 ||
+ if (tdb_prs_fetch(tdb_printers, key, &ps, ctx)!=0 ||
!sec_io_desc_buf("nt_printing_getsec", secdesc_ctr, &ps, 1)) {
DEBUG(4,("using default secdesc for %s\n", printername));