The branch, master has been updated
       via  232273bfac3 s4:torture: Enforce Printer Class
       via  669b135b49d s4:torture: Uninstall driver and cleanup
       via  38967fd954b s4:torture: Add test_ValidatePrinterDriverInstalled
       via  c627b4e33b4 s4:torture: Add test_InstallPrinterDriverFromPackage
       via  a9f283c84ff s4:torture: Add test_UploadPrinterDriverPackage
       via  a9619abb95f s4:torture: Add test_CopyDriverFiles
       via  01f1bd3ff1c s4:torture: Add test_init_driver_info function
       via  1ac1b3e12fb s4:torture: Add driver parsing wrapper
       via  7783c62bbf7 lib:printer_driver: Retrieve Class value
       via  5442355cdb5 lib:printer_driver: Don't overwrite printprocessor
       via  166380111ba lib:printer_driver: Parse SourceDisksNames section
       via  04d92b00202 lib:printer_driver: Handle PrintProcessor string
       via  b6712ab902a lib:printer_driver: Add printer_driver library to parse 
printer driver inf files
       via  7d42029ff79 utils:libgpo: re-add libgpo as library, it should not 
be part of gpext
       via  7abf1d03394 util: Add file tree walk interface
       via  5e97d3cda81 s4:torture: Use test client user and machine name 
defaults
       via  a9c50a71e6e s4:torture: Add iremotewinspool driver torture template
       via  5c1514e677f librpc:idl: Fix pszDestInfPath winspool parameter type
       via  8f240b12f95 s4:torture: Seperate out function calls inside params
       via  e2eadf9a926 s4:torture: Share test iremotewinspool functions
      from  ed209cfee37 s3:nmbd: small improvements in --help strings

https://git.samba.org/?p=samba.git;a=shortlog;h=master


- Log -----------------------------------------------------------------
commit 232273bfac3e65e69c4b9f4527f93cdfe4724f6b
Author: Justin Stephenson <[email protected]>
Date:   Tue Nov 20 11:25:49 2018 -0500

    s4:torture: Enforce Printer Class
    
    Ensure that the provided inf defines Class=Printer for driver installation
    to succeed.
    
    Some driver packages(HP Universal Print Driver) include inf files with
    other device types such as Class=USB. Attempting to install these will fail
    when tested against Windows Server 2016 Print server using
    iremotewinspool RPC calls.
    
    Signed-off-by: Justin Stephenson <[email protected]>
    Reviewed-by: Andreas Schneider <[email protected]>
    Reviewed-by: Bjoern Jacke <[email protected]>
    
    Autobuild-User(master): Björn Jacke <[email protected]>
    Autobuild-Date(master): Mon Jan 28 19:34:41 CET 2019 on sn-devel-144

commit 669b135b49db0bb7e89dfe44073ae9dd70500f97
Author: Justin Stephenson <[email protected]>
Date:   Mon Oct 15 17:02:03 2018 -0400

    s4:torture: Uninstall driver and cleanup
    
    Uninstall and remove the print driver packages to cleanup
    after the install. Cleanup and remove smb directory created
    inside print$.
    
    Signed-off-by: Justin Stephenson <[email protected]>
    Reviewed-by: Andreas Schneider <[email protected]>
    Reviewed-by: Bjoern Jacke <[email protected]>

commit 38967fd954bf143bc2496b03bd1fdbbefffc4421
Author: Justin Stephenson <[email protected]>
Date:   Mon Oct 15 17:01:21 2018 -0400

    s4:torture: Add test_ValidatePrinterDriverInstalled
    
    Perform checks against the print driver registry information
    to ensure the driver was installed as expected.
    
    Signed-off-by: Justin Stephenson <[email protected]>
    Reviewed-by: Andreas Schneider <[email protected]>
    Reviewed-by: Bjoern Jacke <[email protected]>

commit c627b4e33b4dfde7cf79502fea4e58cbeecee7fa
Author: Justin Stephenson <[email protected]>
Date:   Fri Sep 14 15:51:44 2018 -0400

    s4:torture: Add test_InstallPrinterDriverFromPackage
    
    Install a previous uploaded driver package.
    
    Signed-off-by: Justin Stephenson <[email protected]>
    Reviewed-by: Andreas Schneider <[email protected]>
    Reviewed-by: Bjoern Jacke <[email protected]>

commit a9f283c84ff9c429620f9e7fdc28b063174e4605
Author: Justin Stephenson <[email protected]>
Date:   Tue Sep 11 15:57:14 2018 -0400

    s4:torture: Add test_UploadPrinterDriverPackage
    
    Add test to Upload Print Driver, a prerequisite RPC call before
    installing the print driver. The inf driver file to use in this test
    will be provided using torture option:inf_file
    
    Signed-off-by: Justin Stephenson <[email protected]>
    Reviewed-by: Andreas Schneider <[email protected]>
    Reviewed-by: Bjoern Jacke <[email protected]>

commit a9619abb95f5d87686cded5754e4c33f34244ac3
Author: Justin Stephenson <[email protected]>
Date:   Mon Aug 27 11:32:29 2018 -0400

    s4:torture: Add test_CopyDriverFiles
    
    Add test to copy driver files from a torture option provided local 
driver_path
    to the print$ share of //server/.
    
    Signed-off-by: Justin Stephenson <[email protected]>
    Reviewed-by: Andreas Schneider <[email protected]>
    Reviewed-by: Bjoern Jacke <[email protected]>

commit 01f1bd3ff1c8916c26e2fc833cedd7120cc76f6e
Author: Justin Stephenson <[email protected]>
Date:   Mon Oct 15 13:55:37 2018 -0400

    s4:torture: Add test_init_driver_info function
    
    Validate torture options, obtain and retrieve driver information, and
    call driver parsing function to retrieve driver info needed for
    performing the test.
    
    Signed-off-by: Justin Stephenson <[email protected]>
    Reviewed-by: Andreas Schneider <[email protected]>
    Reviewed-by: Bjoern Jacke <[email protected]>

commit 1ac1b3e12fb5d981e94887e30669f7326ff5d6f7
Author: Justin Stephenson <[email protected]>
Date:   Mon Oct 15 13:28:01 2018 -0400

    s4:torture: Add driver parsing wrapper
    
    Add wrapper function to parse inf driver file and get
    validated driver information.
    
    Signed-off-by: Justin Stephenson <[email protected]>
    Reviewed-by: Andreas Schneider <[email protected]>
    Reviewed-by: Bjoern Jacke <[email protected]>

commit 7783c62bbf7d4237a3df02a02196c43d1152ed27
Author: Justin Stephenson <[email protected]>
Date:   Tue Nov 20 11:24:34 2018 -0500

    lib:printer_driver: Retrieve Class value
    
    Retrieve the Class value from the inf file [Version] section.
    
    Signed-off-by: Justin Stephenson <[email protected]>
    Reviewed-by: Andreas Schneider <[email protected]>
    Reviewed-by: Bjoern Jacke <[email protected]>

commit 5442355cdb527ddcaae509538c751b801a77a78c
Author: Justin Stephenson <[email protected]>
Date:   Fri Nov 16 16:53:33 2018 -0500

    lib:printer_driver: Don't overwrite printprocessor
    
    If the printprocessor is parsed from the inf file in the codepath:
    
    setup_driver_name
      find_driver_files
        process_driver_section_printprocessor
    
    Don't overwrite the value later on in setup_driver_name with the default 
"winprint"
    
    Signed-off-by: Justin Stephenson <[email protected]>
    Reviewed-by: Andreas Schneider <[email protected]>
    Reviewed-by: Bjoern Jacke <[email protected]>

commit 166380111ba3a82b087ab3a54687d0ecabe5e819
Author: Justin Stephenson <[email protected]>
Date:   Fri Nov 16 16:11:02 2018 -0500

    lib:printer_driver: Parse SourceDisksNames section
    
    This allows a driver inf with a [SourceDisksNames] section
    excluding the system architecture to be parsed.
    
    
https://docs.microsoft.com/en-us/windows-hardware/drivers/install/inf-sourcedisksnames-section?f=255&MSPPError=-2147217396
    
    Signed-off-by: Justin Stephenson <[email protected]>
    Reviewed-by: Andreas Schneider <[email protected]>
    Reviewed-by: Bjoern Jacke <[email protected]>

commit 04d92b002024c5265c93ce7bd2a7064aaa187abc
Author: Justin Stephenson <[email protected]>
Date:   Fri Nov 16 16:03:00 2018 -0500

    lib:printer_driver: Handle PrintProcessor string
    
    This fixes an issue parsing the section of a certain HP
    driver inf file:
    
    PrintProcessor=%PRINT_PROCESSOR%
    
    where %PRINT_PROCESSOR% is a [Strings] substituted value,
    gp_inifile_getstring_ext() performs the substitution correctly.
    
    Signed-off-by: Justin Stephenson <[email protected]>
    Reviewed-by: Andreas Schneider <[email protected]>
    Reviewed-by: Bjoern Jacke <[email protected]>

commit b6712ab902ab160bc66a3040eba8fc5c7d921dde
Author: Guenther Deschner <[email protected]>
Date:   Mon Oct 8 11:14:37 2018 -0400

    lib:printer_driver: Add printer_driver library to parse printer driver inf 
files
    
    Pair-Programmed-With: Justin Stephenson <[email protected]>
    Signed-off-by: Guenther Deschner <[email protected]>
    Reviewed-by: Andreas Schneider <[email protected]>
    Reviewed-by: Bjoern Jacke <[email protected]>

commit 7d42029ff79358684c1bfc51bde3cbd31ed840bd
Author: Günther Deschner <[email protected]>
Date:   Fri Jun 8 16:13:22 2018 +0200

    utils:libgpo: re-add libgpo as library, it should not be part of gpext
    
    It was initially removed in 78fd02cf31dfe72d596030f342aebefba1e72263 but
    is needed by the inf file parsing.
    
    Guenther
    
    Signed-off-by: Guenther Deschner <[email protected]>
    Reviewed-by: Andreas Schneider <[email protected]>
    Reviewed-by: Bjoern Jacke <[email protected]>

commit 7abf1d03394fb7a97b2f8ca58c95ab1916c7583f
Author: Andreas Schneider <[email protected]>
Date:   Mon Sep 10 15:20:03 2018 +0200

    util: Add file tree walk interface
    
    Add tftw() utility to emulate nftw() behavior with a userdata pointer.
    This is repurposed from the csync project custom file tree walker.
    
    Signed-off-by: Justin Stephenson <[email protected]>
    Reviewed-by: Andreas Schneider <[email protected]>
    Reviewed-by: Bjoern Jacke <[email protected]>

commit 5e97d3cda81628de8d23237d2f7d4ead55c729f6
Author: Justin Stephenson <[email protected]>
Date:   Fri Sep 21 09:45:33 2018 -0400

    s4:torture: Use test client user and machine name defaults
    
    Use "testclient_machine" and "testclient_user" in open printer calls.
    
    Signed-off-by: Justin Stephenson <[email protected]>
    Reviewed-by: Andreas Schneider <[email protected]>
    Reviewed-by: Bjoern Jacke <[email protected]>

commit a9c50a71e6ea9351c5dca902e123767b99dc31bf
Author: Justin Stephenson <[email protected]>
Date:   Fri Aug 24 14:28:05 2018 -0400

    s4:torture: Add iremotewinspool driver torture template
    
    Add the template with setup and teardown functions
    for the iremotewinspool_driver torture suite, and
    add this to the list of torture tests
    
    Signed-off-by: Justin Stephenson <[email protected]>
    Reviewed-by: Andreas Schneider <[email protected]>
    Reviewed-by: Bjoern Jacke <[email protected]>

commit 5c1514e677f9b6abc91be9dcf94375fbece9fdcc
Author: Justin Stephenson <[email protected]>
Date:   Mon Sep 17 11:19:02 2018 -0400

    librpc:idl: Fix pszDestInfPath winspool parameter type
    
    The in/out type of pszDestInfPath needs to be a string type for
    RPC call UploadPrinterDriverPackage.
    
    Per the Spec:
    
    [in, out, unique, size_is(*pcchDestInfPath)] wchar_t* pszDestInfPath,
    
     pszDestInfPath: A pointer to a buffer that receives a string that
     specifies the full path of the directory to which the driver
     installation control file was copied.
    
    Signed-off-by: Justin Stephenson <[email protected]>
    Reviewed-by: Andreas Schneider <[email protected]>
    Reviewed-by: Bjoern Jacke <[email protected]>

commit 8f240b12f95fa9a1cf91f7403347abec84997dd6
Author: Justin Stephenson <[email protected]>
Date:   Fri Aug 24 09:36:55 2018 -0400

    s4:torture: Seperate out function calls inside params
    
    Minor change to allow for easier debugging
    
    Signed-off-by: Justin Stephenson <[email protected]>
    Reviewed-by: Andreas Schneider <[email protected]>
    Reviewed-by: Bjoern Jacke <[email protected]>

commit e2eadf9a926b3d627ff8cda72a5a142655a210e6
Author: Justin Stephenson <[email protected]>
Date:   Thu Aug 23 13:16:40 2018 -0400

    s4:torture: Share test iremotewinspool functions
    
    Create iremotewinspool_common.c and iremotewinspool_common.h to make
    test functions available for additional tests
    
    Signed-off-by: Justin Stephenson <[email protected]>
    Reviewed-by: Andreas Schneider <[email protected]>
    Reviewed-by: Bjoern Jacke <[email protected]>

-----------------------------------------------------------------------

Summary of changes:
 lib/printer_driver/printer_driver.c                | 1259 ++++++++++++++++++++
 .../printer_driver/printer_driver.h                |   18 +-
 lib/printer_driver/wscript_build                   |    6 +
 lib/util/tftw.c                                    |  126 ++
 lib/util/tftw.h                                    |   32 +
 lib/util/wscript_build                             |    3 +-
 libgpo/wscript_build                               |   15 +-
 librpc/idl/winspool.idl                            |    2 +-
 source3/utils/wscript_build                        |    2 +-
 source4/torture/rpc/iremotewinspool.c              |  231 +---
 source4/torture/rpc/iremotewinspool_common.c       |  247 ++++
 source4/torture/rpc/iremotewinspool_common.h       |  101 ++
 source4/torture/rpc/iremotewinspool_driver.c       |  840 +++++++++++++
 source4/torture/rpc/rpc.c                          |    1 +
 source4/torture/wscript_build                      |    8 +
 wscript_build                                      |    1 +
 16 files changed, 2661 insertions(+), 231 deletions(-)
 create mode 100644 lib/printer_driver/printer_driver.c
 copy librpc/ndr/ndr_cab.h => lib/printer_driver/printer_driver.h (60%)
 create mode 100644 lib/printer_driver/wscript_build
 create mode 100644 lib/util/tftw.c
 create mode 100644 lib/util/tftw.h
 create mode 100644 source4/torture/rpc/iremotewinspool_common.c
 create mode 100644 source4/torture/rpc/iremotewinspool_common.h
 create mode 100644 source4/torture/rpc/iremotewinspool_driver.c


Changeset truncated at 500 lines:

diff --git a/lib/printer_driver/printer_driver.c 
b/lib/printer_driver/printer_driver.c
new file mode 100644
index 00000000000..2176d4ae948
--- /dev/null
+++ b/lib/printer_driver/printer_driver.c
@@ -0,0 +1,1259 @@
+/*
+   Unix SMB/CIFS implementation.
+
+   Copyright (C) Guenther Deschner 2016
+
+   This program is free software; you can redistribute it and/or modify
+   it under the terms of the GNU General Public License as published by
+   the Free Software Foundation; either version 3 of the License, or
+   (at your option) any later version.
+
+   This program is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU General Public License for more details.
+
+   You should have received a copy of the GNU General Public License
+   along with this program.  If not, see <http://www.gnu.org/licenses/>.
+*/
+
+#include "includes.h"
+#include "librpc/gen_ndr/ndr_spoolss.h"
+#include "rpc_client/init_spoolss.h"
+#include "libgpo/gpo_ini.h"
+#include "printer_driver.h"
+
+#define ADD_TO_ARRAY(mem_ctx, type, elem, array, num) \
+do { \
+       *(array) = talloc_realloc(mem_ctx, (*(array)), type, (*(num))+1); \
+       SMB_ASSERT((*(array)) != NULL); \
+       (*(array))[*(num)] = (elem); \
+       (*(num)) += 1; \
+} while (0)
+
+
+/* GetPrinterDriverDirectory  -> drivers and dependent files */
+#define PRINTER_INF_DIRID_66000
+
+/* GetPrintProcessorDirectory -> print processors */
+#define PRINTER_INF_DIRID_66001
+
+/* GetColorDirectory -> color profiles */
+#define PRINTER_INF_DIRID_66003
+
+static const char *get_string_unquote(const char *s)
+{
+       bool ok;
+       size_t len;
+
+       if (s == NULL) {
+               return NULL;
+       }
+
+       len = strlen(s);
+       if (len < 2) {
+               return s;
+       }
+
+       if (s[0] == '"' && s[len-1] == '"') {
+               ok = trim_string(discard_const(s), "\"", "\"");
+               if (!ok) {
+                       return NULL;
+               }
+       }
+
+       return s;
+}
+
+/*
+ * '%STRING%' indicates STRING is localized in the [Strings] section
+ */
+
+static const char *get_string_token(struct gp_inifile_context *ctx,
+                                   const char *s)
+{
+       NTSTATUS status;
+       bool ok;
+       char *key;
+       const char *s2;
+
+       if (s != NULL &&  s[0] != '%' && s[strlen(s)-1] != '%') {
+               return s;
+       }
+
+       ok = trim_string(discard_const(s), "%", "%");
+       if (!ok) {
+               return NULL;
+       }
+
+       key = talloc_asprintf(ctx, "Strings:%s", s);
+       if (key == NULL) {
+               return NULL;
+       }
+
+       status = gp_inifile_getstring(ctx, key, &s2);
+       talloc_free(key);
+       if (!NT_STATUS_IS_OK(status)) {
+               /* what can you do... */
+               return s;
+       }
+
+       return s2;
+}
+
+static NTSTATUS gp_inifile_getstring_ext(struct gp_inifile_context *ctx,
+                                        const char *key,
+                                        const char **ret)
+{
+       NTSTATUS status;
+       const char *s;
+
+       status = gp_inifile_getstring(ctx, key, &s);
+       if (!NT_STATUS_IS_OK(status)) {
+               return status;
+       }
+
+       s = get_string_unquote(s);
+       if (s == NULL) {
+               return NT_STATUS_INTERNAL_ERROR;
+       }
+
+       if (s[0] == '%' && s[strlen(s)-1] == '%') {
+               s = get_string_token(ctx, s);
+       }
+
+       s = get_string_unquote(s);
+       if (s == NULL) {
+               return NT_STATUS_INTERNAL_ERROR;
+       }
+
+       *ret = s;
+
+       return NT_STATUS_OK;
+}
+
+static NTSTATUS find_manufacturer_name(struct gp_inifile_context *ctx,
+                                      TALLOC_CTX *mem_ctx,
+                                      const char *section_name,
+                                      const char **manufacturer_name)
+{
+       NTSTATUS status;
+       size_t num_keys = 0;
+       const char **keys = NULL;
+       const char **values = NULL;
+       const char *s;
+       char *p;
+
+       status = gp_inifile_enum_section(ctx, section_name, &num_keys, &keys, 
&values);
+       if (!NT_STATUS_IS_OK(status)) {
+               return status;
+       }
+
+       if (num_keys < 1) {
+               return NT_STATUS_INVALID_PARAMETER;
+       }
+
+       s = talloc_strdup(mem_ctx, keys[0]);
+       if (s == NULL) {
+               return NT_STATUS_NO_MEMORY;
+       }
+
+       p = strchr(s, ':');
+       if (p == NULL) {
+               return NT_STATUS_NO_MEMORY;
+       }
+       *p = '\0';
+       p++;
+
+       s = get_string_unquote(p);
+       if (s == NULL) {
+               return NT_STATUS_INTERNAL_ERROR;
+       }
+
+       s = get_string_token(ctx, s);
+
+       s = get_string_unquote(s);
+       if (s == NULL) {
+               return NT_STATUS_INTERNAL_ERROR;
+       }
+
+       if (s != NULL) {
+               *manufacturer_name = talloc_strdup(mem_ctx, s);
+               if (*manufacturer_name == NULL) {
+                       return NT_STATUS_NO_MEMORY;
+               }
+       }
+
+       talloc_free(keys);
+       talloc_free(values);
+
+       return NT_STATUS_OK;
+}
+
+static NTSTATUS find_manufacturer_url(struct gp_inifile_context *ctx,
+                                     TALLOC_CTX *mem_ctx,
+                                     const char *section_name,
+                                     const char *manufacturer_name,
+                                     const char **manufacturer_url)
+{
+       NTSTATUS status;
+       size_t num_keys = 0;
+       const char **keys = NULL;
+       const char **values = NULL;
+       const char *s;
+       char *p;
+
+       status = gp_inifile_enum_section(ctx, section_name, &num_keys, &keys, 
&values);
+
+       if (!NT_STATUS_IS_OK(status)) {
+               return status;
+       }
+
+       if (num_keys < 1) {
+               return NT_STATUS_INVALID_PARAMETER;
+       }
+
+       p = strchr(keys[0], ':');
+       if (p == NULL) {
+               return NT_STATUS_NO_MEMORY;
+       }
+       *p = '\0';
+       p++;
+
+       s = get_string_unquote(p);
+       if (s == NULL) {
+               return NT_STATUS_INTERNAL_ERROR;
+       }
+
+       s = get_string_token(ctx, s);
+
+       s = get_string_unquote(s);
+       if (s == NULL) {
+               return NT_STATUS_INTERNAL_ERROR;
+       }
+
+       if (strequal(s, manufacturer_name)) {
+               s = get_string_unquote(values[0]);
+               if (s == NULL) {
+                       return NT_STATUS_INTERNAL_ERROR;
+               }
+       }
+
+       if (s != NULL) {
+               *manufacturer_url = talloc_strdup(mem_ctx, s);
+               if (*manufacturer_url == NULL) {
+                       return NT_STATUS_NO_MEMORY;
+               }
+       }
+
+       talloc_free(keys);
+       talloc_free(values);
+
+       return NT_STATUS_OK;
+}
+
+static NTSTATUS add_string_to_spoolss_array(TALLOC_CTX *mem_ctx,
+                                           const char *s,
+                                           struct spoolss_StringArray **r)
+{
+       size_t count = 2;
+       struct spoolss_StringArray *a = *r;
+       bool ok;
+       int i;
+
+       if (a == NULL) {
+               a = talloc_zero(mem_ctx, struct spoolss_StringArray);
+               if (a == NULL) {
+                       return NT_STATUS_NO_MEMORY;
+               }
+       }
+
+       if (a->string == NULL) {
+               a->string = talloc_zero_array(a, const char *, count);
+               if (a->string == NULL) {
+                       return NT_STATUS_NO_MEMORY;
+               }
+       }
+
+       for (i = 0; a->string[i] != NULL; i++) { ;; }
+       count = i;
+
+       ok = add_string_to_array(mem_ctx, s, &a->string, &count);
+       if (!ok) {
+               return NT_STATUS_NO_MEMORY;
+       }
+
+       a->string = talloc_realloc(mem_ctx, a->string, const char *, count + 1);
+       if (a->string == NULL) {
+               return NT_STATUS_NO_MEMORY;
+       }
+       a->string[count] = NULL;
+
+       *r = a;
+
+       return NT_STATUS_OK;
+}
+
+static NTSTATUS add_dependent_driver_file(TALLOC_CTX *mem_ctx,
+                                         const char *file,
+                                         struct spoolss_StringArray **r)
+{
+       char *p;
+
+       if (file == NULL) {
+               return NT_STATUS_INVALID_PARAMETER;
+       }
+
+       if (file[0] == '@') {
+               file++;
+       }
+
+       p = strchr(file, ',');
+       if (p != NULL) {
+               *p = '\0';
+       }
+
+       return add_string_to_spoolss_array(mem_ctx, file, r);
+}
+
+/*
+ * 
https://msdn.microsoft.com/de-de/windows/hardware/drivers/install/inf-manufacturer-section
+ *
+ * [Manufacturer]
+ * "Kyocera"=Kyocera,NTx86.5.1,NTx86.6.0,NTamd64.5.1,NTamd64.6.0
+ */
+
+static NTSTATUS enum_devices_in_toc(struct gp_inifile_context *ctx,
+                                   TALLOC_CTX *mem_ctx,
+                                   size_t *pnum_devices,
+                                   const char ***pdevices,
+                                   const char ***pdevice_values)
+{
+       NTSTATUS status;
+       size_t num_manufacturers = 0;
+       const char **manufacturers = NULL;
+       const char **values = NULL;
+       char *p;
+       int i;
+       bool ok;
+
+       status = gp_inifile_enum_section(ctx, "Manufacturer", 
&num_manufacturers, &manufacturers, &values);
+       if (!NT_STATUS_IS_OK(status)) {
+               return status;
+       }
+
+       for (i = 0; i < num_manufacturers; i++) {
+
+               const char *models_section_name;
+               const char *s;
+               char **decorations;
+               int j;
+
+               DEBUG(11,("processing manufacturer: %s\n", manufacturers[i]));
+
+               status = gp_inifile_getstring(ctx, manufacturers[i], &s);
+               if (!NT_STATUS_IS_OK(status)) {
+                       return status;
+               }
+
+               decorations = str_list_make_v3(mem_ctx, s, ",");
+               if (decorations == NULL) {
+                       return NT_STATUS_NO_MEMORY;
+               }
+
+               models_section_name = decorations[0];
+
+               for (j = 1; decorations[j] != NULL; j++) {
+
+                       /*
+                        * 
https://msdn.microsoft.com/de-de/windows/hardware/drivers/install/inf-models-section
+                        */
+
+                       const char *decorated_models_section_name;
+                       size_t num_devices = 0;
+                       const char **devices = NULL;
+                       const char **device_values = NULL;
+                       int d;
+                       size_t c = 0;
+
+                       decorated_models_section_name = 
talloc_asprintf(mem_ctx, "%s.%s",
+                                                                       
models_section_name,
+                                                                       
decorations[j]);
+                       if (decorated_models_section_name == NULL) {
+                               return NT_STATUS_NO_MEMORY;
+                       }
+
+                       DEBUG(11,("processing decorated models_section_name: 
%s\n",
+                               decorated_models_section_name));
+
+                       status = gp_inifile_enum_section(ctx, 
decorated_models_section_name,
+                                                        &num_devices, &devices,
+                                                        &device_values);
+                       for (d = 0; d < num_devices; d++) {
+
+                               DEBUG(11,("processing device: %s\n",
+                                       devices[d]));
+
+                               s = talloc_strdup(mem_ctx, devices[d]);
+                               if (s == NULL) {
+                                       return NT_STATUS_NO_MEMORY;
+                               }
+
+                               p = strchr(s, ':');
+                               if (p == NULL) {
+                                       return NT_STATUS_DRIVER_INTERNAL_ERROR;
+                               }
+
+                               *p = '\0';
+                               p++;
+
+                               s = get_string_unquote(p);
+
+                               ok = add_string_to_array(mem_ctx, s, pdevices, 
pnum_devices);
+                               if (!ok) {
+                                       return NT_STATUS_NO_MEMORY;
+                               }
+                               ok = add_string_to_array(mem_ctx, 
device_values[d], pdevice_values, &c);
+                               if (!ok) {
+                                       return NT_STATUS_NO_MEMORY;
+                               }
+                       }
+               }
+       }
+
+       return NT_STATUS_OK;
+}
+
+static NTSTATUS find_device_in_toc(struct gp_inifile_context *ctx,
+                                  TALLOC_CTX *mem_ctx,
+                                  const char *device_description,
+                                  const char **value)
+{
+       NTSTATUS status;
+       size_t num_devices = 0;
+       const char **devices = NULL;
+       const char **device_values = NULL;
+       int d;
+
+       if (device_description == NULL) {
+               return NT_STATUS_INVALID_PARAMETER;
+       }
+
+       status = enum_devices_in_toc(ctx, mem_ctx,
+                                    &num_devices,
+                                    &devices,
+                                    &device_values);
+       if (!NT_STATUS_IS_OK(status)) {
+               return status;
+       }
+
+       for (d = 0; d < num_devices; d++) {
+
+               if (strequal(device_description, devices[d])) {
+
+                       DEBUG(10,("found device_description: %s\n",
+                               device_description));
+
+                       *value = talloc_strdup(mem_ctx, device_values[d]);
+                       if (*value == NULL) {
+                               return NT_STATUS_NO_MEMORY;
+                       }
+                       DEBUGADD(10,("and returned: %s\n", *value));
+
+                       return NT_STATUS_OK;
+               }
+       }
+
+       return NT_STATUS_DRIVER_INTERNAL_ERROR;
+}
+
+/*
+ * 
https://msdn.microsoft.com/de-de/windows/hardware/drivers/install/inf-copyfiles-directive
+ */
+
+static NTSTATUS process_driver_section_copyfiles(struct gp_inifile_context 
*ctx,
+                                                TALLOC_CTX *mem_ctx,
+                                                const char *driver_section,
+                                                struct spoolss_AddDriverInfo8 
*r)
+{
+       NTSTATUS status;
+       size_t num_keys = 0;
+       char *p, *key;
+       const char **keys = NULL;
+       const char **values = NULL;
+       int i;
+       char *str;
+       const char *s;
+
+       key = talloc_asprintf(mem_ctx, "%s:%s", driver_section, "CopyFiles");
+       if (key == NULL) {
+               return NT_STATUS_NO_MEMORY;
+       }
+
+       DEBUG(10,("Checking for CopyFiles entry in %s\n", driver_section));
+


-- 
Samba Shared Repository

Reply via email to