printing: Create default architecture directories on init.
authorAndreas Schneider <asn@samba.org>
Thu, 17 Jan 2013 16:18:04 +0000 (17:18 +0100)
committerAndreas Schneider <asn@cryptomilk.org>
Thu, 17 Jan 2013 19:36:17 +0000 (20:36 +0100)
Reviewed-by: Guenther Deschner <gd@samba.org>
Autobuild-User(master): Andreas Schneider <asn@cryptomilk.org>
Autobuild-Date(master): Thu Jan 17 20:36:17 CET 2013 on sn-devel-104

source3/printing/nt_printing.c

index e09ee8968fab2c10a57eb313e936d97b39188ce0..7bf2c5530d24e1b08f36db396f0ceacb44156d64 100644 (file)
@@ -74,6 +74,61 @@ static const struct print_architecture_table_node archi_table[]= {
        {NULL,                   "",            -1 }
 };
 
+static bool print_driver_directories_init(void)
+{
+       int service, i;
+       char *driver_path;
+       bool ok;
+       TALLOC_CTX *mem_ctx = talloc_stackframe();
+
+       service = lp_servicenumber("print$");
+       if (service < 0) {
+               /* We don't have a print$ share */
+               DEBUG(5, ("No print$ share has been configured.\n"));
+               return true;
+       }
+
+       driver_path = lp_pathname(mem_ctx, service);
+       if (driver_path == NULL) {
+               return false;
+       }
+
+       ok = directory_create_or_exist(driver_path, sec_initial_uid(), 0755);
+       if (!ok) {
+               DEBUG(1, ("Failed to create printer driver directory %s\n",
+                         driver_path));
+               talloc_free(mem_ctx);
+               return false;
+       }
+
+       for (i = 0; archi_table[i].long_archi != NULL; i++) {
+               const char *arch_path;
+
+               arch_path = talloc_asprintf(mem_ctx,
+                                           "%s/%s",
+                                           driver_path,
+                                           archi_table[i].short_archi);
+               if (arch_path == NULL) {
+                       talloc_free(mem_ctx);
+                       return false;
+               }
+
+               ok = directory_create_or_exist(arch_path,
+                                              sec_initial_uid(),
+                                              0755);
+               if (!ok) {
+                       DEBUG(1, ("Failed to create printer driver "
+                                 "architecture directory %s\n",
+                                 arch_path));
+                       talloc_free(mem_ctx);
+                       return false;
+               }
+       }
+
+       talloc_free(mem_ctx);
+       return true;
+}
+
 /****************************************************************************
  Open the NT printing tdbs. Done once before fork().
 ****************************************************************************/
@@ -82,6 +137,10 @@ bool nt_printing_init(struct messaging_context *msg_ctx)
 {
        WERROR win_rc;
 
+       if (!print_driver_directories_init()) {
+               return false;
+       }
+
        if (!nt_printing_tdb_upgrade()) {
                return false;
        }