+/********************************************************************
+ * construct_printer_info_4
+ * fill a printer_info_4 struct
+ ********************************************************************/
+
+static WERROR construct_printer_driver_info_4(TALLOC_CTX *mem_ctx,
+ struct spoolss_DriverInfo4 *r,
+ int snum,
+ const char *servername,
+ const char *architecture,
+ uint32_t version)
+{
+ NT_PRINTER_INFO_LEVEL *printer = NULL;
+ struct spoolss_DriverInfo8 *driver;
+ WERROR status;
+
+ status=get_a_printer(NULL, &printer, 2, lp_const_servicename(snum) );
+
+ DEBUG(8,("construct_printer_driver_info_4: status: %s\n", win_errstr(status)));
+
+ if (!W_ERROR_IS_OK(status))
+ return WERR_INVALID_PRINTER_NAME;
+
+ status = get_a_printer_driver(mem_ctx, &driver, printer->info_2->drivername, architecture, version);
+
+ DEBUG(8,("construct_printer_driver_info_4: status: %s\n", win_errstr(status)));
+
+ if (!W_ERROR_IS_OK(status))
+ {
+ /*
+ * Is this a W2k client ?
+ */
+
+ if (version < 3) {
+ free_a_printer(&printer,2);
+ return WERR_UNKNOWN_PRINTER_DRIVER;
+ }
+
+ /* Yes - try again with a WinNT driver. */
+ version = 2;
+ status = get_a_printer_driver(mem_ctx, &driver, printer->info_2->drivername, architecture, version);
+ DEBUG(8,("construct_printer_driver_info_4: status: %s\n", win_errstr(status)));
+ if (!W_ERROR_IS_OK(status)) {
+ free_a_printer(&printer,2);
+ return WERR_UNKNOWN_PRINTER_DRIVER;
+ }
+ }
+
+ status = fill_printer_driver_info4(mem_ctx, r, driver, servername);
+
+ free_a_printer(&printer,2);
+ free_a_printer_driver(driver);
+
+ return status;
+}
+
+/********************************************************************
+ * construct_printer_info_5
+ * fill a printer_info_5 struct
+ ********************************************************************/
+
+static WERROR construct_printer_driver_info_5(TALLOC_CTX *mem_ctx,
+ struct spoolss_DriverInfo5 *r,
+ int snum,
+ const char *servername,
+ const char *architecture,
+ uint32_t version)
+{
+ NT_PRINTER_INFO_LEVEL *printer = NULL;
+ struct spoolss_DriverInfo8 *driver;
+ WERROR status;
+
+ status=get_a_printer(NULL, &printer, 2, lp_const_servicename(snum) );
+
+ DEBUG(8,("construct_printer_driver_info_5: status: %s\n", win_errstr(status)));
+
+ if (!W_ERROR_IS_OK(status))
+ return WERR_INVALID_PRINTER_NAME;
+
+ status = get_a_printer_driver(mem_ctx, &driver, printer->info_2->drivername, architecture, version);
+
+ DEBUG(8,("construct_printer_driver_info_5: status: %s\n", win_errstr(status)));
+
+ if (!W_ERROR_IS_OK(status))
+ {
+ /*
+ * Is this a W2k client ?
+ */
+
+ if (version < 3) {
+ free_a_printer(&printer,2);
+ return WERR_UNKNOWN_PRINTER_DRIVER;
+ }
+
+ /* Yes - try again with a WinNT driver. */
+ version = 2;
+ status = get_a_printer_driver(mem_ctx, &driver, printer->info_2->drivername, architecture, version);
+ DEBUG(8,("construct_printer_driver_info_5: status: %s\n", win_errstr(status)));
+ if (!W_ERROR_IS_OK(status)) {
+ free_a_printer(&printer,2);
+ return WERR_UNKNOWN_PRINTER_DRIVER;
+ }
+ }
+
+ status = fill_printer_driver_info5(mem_ctx, r, driver, servername);
+
+ free_a_printer(&printer,2);
+ free_a_printer_driver(driver);
+
+ return status;
+}
+