Finish removal of iconv_convenience in public API's.
[bbaumbach/samba-autobuild/.git] / source4 / rpc_server / spoolss / dcesrv_spoolss.c
index d041d79b3e4c8acdd4622373d2161382951450ad..f6212da2502f8c175abb2264a4de442f9879cd98 100644 (file)
 #include "includes.h"
 #include "rpc_server/dcerpc_server.h"
 #include "librpc/gen_ndr/ndr_spoolss.h"
-#include "rpc_server/common/common.h"
 #include "ntptr/ntptr.h"
-#include "lib/socket/socket.h"
-#include "smbd/service_stream.h"
+#include "lib/tsocket/tsocket.h"
 #include "librpc/gen_ndr/ndr_spoolss_c.h"
 #include "auth/credentials/credentials.h"
 #include "param/param.h"
@@ -35,13 +33,13 @@ enum spoolss_handle {
        SPOOLSS_NOTIFY
 };
 
-#define SPOOLSS_BUFFER_UNION(fn,ic,info,level) \
-       ((info)?ndr_size_##fn(info, level, ic, 0):0)
+#define SPOOLSS_BUFFER_UNION(fn,info,level) \
+       ((info)?ndr_size_##fn(info, level, 0):0)
 
-#define SPOOLSS_BUFFER_UNION_ARRAY(fn,ic,info,level,count) \
-       ((info)?ndr_size_##fn##_info(dce_call, ic, level, count, info):0)
+#define SPOOLSS_BUFFER_UNION_ARRAY(fn,info,level,count) \
+       ((info)?ndr_size_##fn##_info(dce_call, level, count, info):0)
 
-#define SPOOLSS_BUFFER_OK(val_true,val_false) ((r->in.offered >= r->out.needed)?val_true:val_false)
+#define SPOOLSS_BUFFER_OK(val_true,val_false) ((r->in.offered >= *r->out.needed)?val_true:val_false)
 
 static WERROR dcesrv_spoolss_parse_printer_name(TALLOC_CTX *mem_ctx, const char *name,
                                         const char **_server_name,
@@ -150,9 +148,11 @@ static WERROR dcesrv_spoolss_check_server_name(struct dcesrv_call_state *dce_cal
                                        const char *server_name)
 {
        bool ret;
-       struct socket_address *myaddr;
+       const struct tsocket_address *local_address;
+       char *myaddr;
        const char **aliases;
-       int i;
+       const char *dnsdomain;
+       unsigned int i;
 
        /* NULL is ok */
        if (!server_name) return WERR_OK;
@@ -188,12 +188,13 @@ static WERROR dcesrv_spoolss_check_server_name(struct dcesrv_call_state *dce_cal
        /* DNS NAME is ok
         * TODO: we need to check if aliases are also ok
         */
-       if (lp_realm(dce_call->conn->dce_ctx->lp_ctx)) {
+       dnsdomain = lp_dnsdomain(dce_call->conn->dce_ctx->lp_ctx);
+       if (dnsdomain != NULL) {
                char *str;
 
                str = talloc_asprintf(mem_ctx, "%s.%s",
                                                lp_netbios_name(dce_call->conn->dce_ctx->lp_ctx),
-                                               lp_realm(dce_call->conn->dce_ctx->lp_ctx));
+                                               dnsdomain);
                W_ERROR_HAVE_NO_MEMORY(str);
 
                ret = strequal(str, server_name);
@@ -201,10 +202,12 @@ static WERROR dcesrv_spoolss_check_server_name(struct dcesrv_call_state *dce_cal
                if (ret) return WERR_OK;
        }
 
-       myaddr = dcesrv_connection_get_my_addr(dce_call->conn, mem_ctx);
+       local_address = dcesrv_connection_get_local_address(dce_call->conn);
+
+       myaddr = tsocket_address_inet_addr_string(local_address, mem_ctx);
        W_ERROR_HAVE_NO_MEMORY(myaddr);
 
-       ret = strequal(myaddr->addr, server_name);
+       ret = strequal(myaddr, server_name);
        talloc_free(myaddr);
        if (ret) return WERR_OK;
 
@@ -220,7 +223,7 @@ static NTSTATUS dcerpc_spoolss_bind(struct dcesrv_call_state *dce_call, const st
                                    lp_ntptr_providor(dce_call->conn->dce_ctx->lp_ctx), &ntptr);
        NT_STATUS_NOT_OK_RETURN(status);
 
-       dce_call->context->private = ntptr;
+       dce_call->context->private_data = ntptr;
 
        return NT_STATUS_OK;
 }
@@ -233,9 +236,8 @@ static NTSTATUS dcerpc_spoolss_bind(struct dcesrv_call_state *dce_call, const st
 static WERROR dcesrv_spoolss_EnumPrinters(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
                       struct spoolss_EnumPrinters *r)
 {
-       struct ntptr_context *ntptr = talloc_get_type(dce_call->context->private, struct ntptr_context);
+       struct ntptr_context *ntptr = talloc_get_type(dce_call->context->private_data, struct ntptr_context);
        WERROR status;
-       struct smb_iconv_convenience *ic = lp_iconv_convenience(ntptr->lp_ctx);
 
        status = dcesrv_spoolss_check_server_name(dce_call, mem_ctx, r->in.server);
        W_ERROR_NOT_OK_RETURN(status);
@@ -243,9 +245,9 @@ static WERROR dcesrv_spoolss_EnumPrinters(struct dcesrv_call_state *dce_call, TA
        status = ntptr_EnumPrinters(ntptr, mem_ctx, r);
        W_ERROR_NOT_OK_RETURN(status);
 
-       r->out.needed   = SPOOLSS_BUFFER_UNION_ARRAY(spoolss_EnumPrinters, ic, r->out.info, r->in.level, r->out.count);
-       r->out.info     = SPOOLSS_BUFFER_OK(r->out.info, NULL);
-       r->out.count    = SPOOLSS_BUFFER_OK(r->out.count, 0);
+       *r->out.needed  = SPOOLSS_BUFFER_UNION_ARRAY(spoolss_EnumPrinters, *r->out.info, r->in.level, *r->out.count);
+       *r->out.info    = SPOOLSS_BUFFER_OK(*r->out.info, NULL);
+       *r->out.count   = SPOOLSS_BUFFER_OK(*r->out.count, 0);
        return SPOOLSS_BUFFER_OK(WERR_OK, WERR_INSUFFICIENT_BUFFER);
 }
 
@@ -369,9 +371,8 @@ static WERROR dcesrv_spoolss_AddPrinterDriver(struct dcesrv_call_state *dce_call
 static WERROR dcesrv_spoolss_EnumPrinterDrivers(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
                       struct spoolss_EnumPrinterDrivers *r)
 {
-       struct ntptr_context *ntptr = talloc_get_type(dce_call->context->private, struct ntptr_context);
+       struct ntptr_context *ntptr = talloc_get_type(dce_call->context->private_data, struct ntptr_context);
        WERROR status;
-       struct smb_iconv_convenience *ic = lp_iconv_convenience(ntptr->lp_ctx);
 
        status = dcesrv_spoolss_check_server_name(dce_call, mem_ctx, r->in.server);
        W_ERROR_NOT_OK_RETURN(status);
@@ -379,9 +380,9 @@ static WERROR dcesrv_spoolss_EnumPrinterDrivers(struct dcesrv_call_state *dce_ca
        status = ntptr_EnumPrinterDrivers(ntptr, mem_ctx, r);
        W_ERROR_NOT_OK_RETURN(status);
 
-       r->out.needed   = SPOOLSS_BUFFER_UNION_ARRAY(spoolss_EnumPrinterDrivers, ic, r->out.info, r->in.level, r->out.count);
-       r->out.info     = SPOOLSS_BUFFER_OK(r->out.info, NULL);
-       r->out.count    = SPOOLSS_BUFFER_OK(r->out.count, 0);
+       *r->out.needed  = SPOOLSS_BUFFER_UNION_ARRAY(spoolss_EnumPrinterDrivers, *r->out.info, r->in.level, *r->out.count);
+       *r->out.info    = SPOOLSS_BUFFER_OK(*r->out.info, NULL);
+       *r->out.count   = SPOOLSS_BUFFER_OK(*r->out.count, 0);
        return SPOOLSS_BUFFER_OK(WERR_OK, WERR_INSUFFICIENT_BUFFER);
 }
 
@@ -402,9 +403,8 @@ static WERROR dcesrv_spoolss_GetPrinterDriver(struct dcesrv_call_state *dce_call
 static WERROR dcesrv_spoolss_GetPrinterDriverDirectory(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
                       struct spoolss_GetPrinterDriverDirectory *r)
 {
-       struct ntptr_context *ntptr = talloc_get_type(dce_call->context->private, struct ntptr_context);
+       struct ntptr_context *ntptr = talloc_get_type(dce_call->context->private_data, struct ntptr_context);
        WERROR status;
-       struct smb_iconv_convenience *ic = lp_iconv_convenience(ntptr->lp_ctx);
 
        status = dcesrv_spoolss_check_server_name(dce_call, mem_ctx, r->in.server);
        W_ERROR_NOT_OK_RETURN(status);
@@ -412,7 +412,7 @@ static WERROR dcesrv_spoolss_GetPrinterDriverDirectory(struct dcesrv_call_state
        status = ntptr_GetPrinterDriverDirectory(ntptr, mem_ctx, r);
        W_ERROR_NOT_OK_RETURN(status);
 
-       r->out.needed   = SPOOLSS_BUFFER_UNION(spoolss_DriverDirectoryInfo, ic, r->out.info, r->in.level);
+       *r->out.needed  = SPOOLSS_BUFFER_UNION(spoolss_DriverDirectoryInfo, r->out.info, r->in.level);
        r->out.info     = SPOOLSS_BUFFER_OK(r->out.info, NULL);
        return SPOOLSS_BUFFER_OK(WERR_OK, WERR_INSUFFICIENT_BUFFER);
 }
@@ -454,7 +454,18 @@ static WERROR dcesrv_spoolss_EnumPrintProcessors(struct dcesrv_call_state *dce_c
 static WERROR dcesrv_spoolss_GetPrintProcessorDirectory(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
                       struct spoolss_GetPrintProcessorDirectory *r)
 {
-       DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
+       struct ntptr_context *ntptr = talloc_get_type(dce_call->context->private_data, struct ntptr_context);
+       WERROR status;
+
+       status = dcesrv_spoolss_check_server_name(dce_call, mem_ctx, r->in.server);
+       W_ERROR_NOT_OK_RETURN(status);
+
+       status = ntptr_GetPrintProcessorDirectory(ntptr, mem_ctx, r);
+       W_ERROR_NOT_OK_RETURN(status);
+
+       *r->out.needed  = SPOOLSS_BUFFER_UNION(spoolss_PrintProcessorDirectoryInfo, r->out.info, r->in.level);
+       r->out.info     = SPOOLSS_BUFFER_OK(r->out.info, NULL);
+       return SPOOLSS_BUFFER_OK(WERR_OK, WERR_INSUFFICIENT_BUFFER);
 }
 
 
@@ -534,7 +545,11 @@ static WERROR dcesrv_spoolss_EndDocPrinter(struct dcesrv_call_state *dce_call, T
 static WERROR dcesrv_spoolss_AddJob(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
                       struct spoolss_AddJob *r)
 {
-       DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
+       if (r->in.level != 1) {
+               return WERR_UNKNOWN_LEVEL;
+       }
+
+       return WERR_INVALID_PARAM;
 }
 
 
@@ -557,7 +572,15 @@ static WERROR dcesrv_spoolss_GetPrinterData(struct dcesrv_call_state *dce_call,
        struct ntptr_GenericHandle *handle;
        struct dcesrv_handle *h;
        WERROR status;
-       struct smb_iconv_convenience *ic = lp_iconv_convenience(dce_call->conn->dce_ctx->lp_ctx);
+
+       r->out.type = talloc_zero(mem_ctx, enum winreg_Type);
+       W_ERROR_HAVE_NO_MEMORY(r->out.type);
+
+       r->out.needed = talloc_zero(mem_ctx, uint32_t);
+       W_ERROR_HAVE_NO_MEMORY(r->out.needed);
+
+       r->out.data = talloc_zero_array(mem_ctx, uint8_t, r->in.offered);
+       W_ERROR_HAVE_NO_MEMORY(r->out.data);
 
        DCESRV_PULL_HANDLE_WERR(h, r->in.handle, DCESRV_HANDLE_ANY);
        handle = talloc_get_type(h->data, struct ntptr_GenericHandle);
@@ -575,8 +598,7 @@ static WERROR dcesrv_spoolss_GetPrinterData(struct dcesrv_call_state *dce_call,
 
        W_ERROR_NOT_OK_RETURN(status);
 
-       r->out.needed   = ndr_size_spoolss_PrinterData(&r->out.data, r->out.type, ic, 0);
-       r->out.type     = SPOOLSS_BUFFER_OK(r->out.type, SPOOLSS_PRINTER_DATA_TYPE_NULL);
+       *r->out.type    = SPOOLSS_BUFFER_OK(*r->out.type, REG_NONE);
        r->out.data     = SPOOLSS_BUFFER_OK(r->out.data, r->out.data);
        return SPOOLSS_BUFFER_OK(WERR_OK, WERR_MORE_DATA);
 }
@@ -695,7 +717,6 @@ static WERROR dcesrv_spoolss_GetForm(struct dcesrv_call_state *dce_call, TALLOC_
        struct ntptr_GenericHandle *handle;
        struct dcesrv_handle *h;
        WERROR status;
-       struct smb_iconv_convenience *ic = lp_iconv_convenience(dce_call->conn->dce_ctx->lp_ctx);
 
        DCESRV_PULL_HANDLE_WERR(h, r->in.handle, DCESRV_HANDLE_ANY);
        handle = talloc_get_type(h->data, struct ntptr_GenericHandle);
@@ -716,7 +737,7 @@ static WERROR dcesrv_spoolss_GetForm(struct dcesrv_call_state *dce_call, TALLOC_
                        return WERR_FOOBAR;
        }
 
-       r->out.needed   = SPOOLSS_BUFFER_UNION(spoolss_FormInfo, ic, r->out.info, r->in.level);
+       *r->out.needed  = SPOOLSS_BUFFER_UNION(spoolss_FormInfo, r->out.info, r->in.level);
        r->out.info     = SPOOLSS_BUFFER_OK(r->out.info, NULL);
        return SPOOLSS_BUFFER_OK(WERR_OK, WERR_INSUFFICIENT_BUFFER);
 }
@@ -763,7 +784,6 @@ static WERROR dcesrv_spoolss_EnumForms(struct dcesrv_call_state *dce_call, TALLO
        struct ntptr_GenericHandle *handle;
        struct dcesrv_handle *h;
        WERROR status;
-       struct smb_iconv_convenience *ic = lp_iconv_convenience(dce_call->conn->dce_ctx->lp_ctx);
 
        DCESRV_PULL_HANDLE_WERR(h, r->in.handle, DCESRV_HANDLE_ANY);
        handle = talloc_get_type(h->data, struct ntptr_GenericHandle);
@@ -783,9 +803,9 @@ static WERROR dcesrv_spoolss_EnumForms(struct dcesrv_call_state *dce_call, TALLO
                        return WERR_FOOBAR;
        }
 
-       r->out.needed   = SPOOLSS_BUFFER_UNION_ARRAY(spoolss_EnumForms, ic, r->out.info, r->in.level, r->out.count);
-       r->out.info     = SPOOLSS_BUFFER_OK(r->out.info, NULL);
-       r->out.count    = SPOOLSS_BUFFER_OK(r->out.count, 0);
+       *r->out.needed  = SPOOLSS_BUFFER_UNION_ARRAY(spoolss_EnumForms, *r->out.info, r->in.level, *r->out.count);
+       *r->out.info    = SPOOLSS_BUFFER_OK(*r->out.info, NULL);
+       *r->out.count   = SPOOLSS_BUFFER_OK(*r->out.count, 0);
        return SPOOLSS_BUFFER_OK(WERR_OK, WERR_INSUFFICIENT_BUFFER);
 }
 
@@ -796,9 +816,8 @@ static WERROR dcesrv_spoolss_EnumForms(struct dcesrv_call_state *dce_call, TALLO
 static WERROR dcesrv_spoolss_EnumPorts(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
                       struct spoolss_EnumPorts *r)
 {
-       struct ntptr_context *ntptr = talloc_get_type(dce_call->context->private, struct ntptr_context);
+       struct ntptr_context *ntptr = talloc_get_type(dce_call->context->private_data, struct ntptr_context);
        WERROR status;
-       struct smb_iconv_convenience *ic = lp_iconv_convenience(ntptr->lp_ctx);
 
        status = dcesrv_spoolss_check_server_name(dce_call, mem_ctx, r->in.servername);
        W_ERROR_NOT_OK_RETURN(status);
@@ -806,9 +825,9 @@ static WERROR dcesrv_spoolss_EnumPorts(struct dcesrv_call_state *dce_call, TALLO
        status = ntptr_EnumPorts(ntptr, mem_ctx, r);
        W_ERROR_NOT_OK_RETURN(status);
 
-       r->out.needed   = SPOOLSS_BUFFER_UNION_ARRAY(spoolss_EnumPorts, ic, r->out.info, r->in.level, r->out.count);
-       r->out.info     = SPOOLSS_BUFFER_OK(r->out.info, NULL);
-       r->out.count    = SPOOLSS_BUFFER_OK(r->out.count, 0);
+       *r->out.needed  = SPOOLSS_BUFFER_UNION_ARRAY(spoolss_EnumPorts, *r->out.info, r->in.level, *r->out.count);
+       *r->out.info    = SPOOLSS_BUFFER_OK(*r->out.info, NULL);
+       *r->out.count   = SPOOLSS_BUFFER_OK(*r->out.count, 0);
        return SPOOLSS_BUFFER_OK(WERR_OK, WERR_INSUFFICIENT_BUFFER);
 }
 
@@ -819,9 +838,8 @@ static WERROR dcesrv_spoolss_EnumPorts(struct dcesrv_call_state *dce_call, TALLO
 static WERROR dcesrv_spoolss_EnumMonitors(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
                       struct spoolss_EnumMonitors *r)
 {
-       struct ntptr_context *ntptr = talloc_get_type(dce_call->context->private, struct ntptr_context);
+       struct ntptr_context *ntptr = talloc_get_type(dce_call->context->private_data, struct ntptr_context);
        WERROR status;
-       struct smb_iconv_convenience *ic = lp_iconv_convenience(ntptr->lp_ctx);
 
        status = dcesrv_spoolss_check_server_name(dce_call, mem_ctx, r->in.servername);
        W_ERROR_NOT_OK_RETURN(status);
@@ -829,9 +847,9 @@ static WERROR dcesrv_spoolss_EnumMonitors(struct dcesrv_call_state *dce_call, TA
        status = ntptr_EnumMonitors(ntptr, mem_ctx, r);
        W_ERROR_NOT_OK_RETURN(status);
 
-       r->out.needed   = SPOOLSS_BUFFER_UNION_ARRAY(spoolss_EnumMonitors, ic, r->out.info, r->in.level, r->out.count);
-       r->out.info     = SPOOLSS_BUFFER_OK(r->out.info, NULL);
-       r->out.count    = SPOOLSS_BUFFER_OK(r->out.count, 0);
+       *r->out.needed  = SPOOLSS_BUFFER_UNION_ARRAY(spoolss_EnumMonitors, *r->out.info, r->in.level, *r->out.count);
+       *r->out.info    = SPOOLSS_BUFFER_OK(*r->out.info, NULL);
+       *r->out.count   = SPOOLSS_BUFFER_OK(*r->out.count, 0);
        return SPOOLSS_BUFFER_OK(WERR_OK, WERR_INSUFFICIENT_BUFFER);
 }
 
@@ -982,7 +1000,7 @@ static WERROR dcesrv_spoolss_DeletePrintProvidor(struct dcesrv_call_state *dce_c
 static WERROR dcesrv_spoolss_EnumPrintProcDataTypes(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
                       struct spoolss_EnumPrintProcDataTypes *r)
 {
-       DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
+       return WERR_OK;
 }
 
 
@@ -1145,7 +1163,7 @@ static WERROR dcesrv_spoolss_RemoteFindFirstPrinterChangeNotifyEx(struct dcesrv_
        struct cli_credentials *creds;
        struct policy_handle notify_handle;
 
-       DEBUG(2, ("Received RFFPCNex from %s\n", r->in.str));
+       DEBUG(2, ("Received RFFPCNex from %s\n", r->in.local_machine));
 
        /*
         * TODO: for now just open a connection to the client and drop it again
@@ -1157,9 +1175,9 @@ static WERROR dcesrv_spoolss_RemoteFindFirstPrinterChangeNotifyEx(struct dcesrv_
        binding = talloc_zero(mem_ctx, struct dcerpc_binding);
 
        binding->transport = NCACN_NP; 
-       if (strncmp(r->in.str, "\\\\", 2))
+       if (strncmp(r->in.local_machine, "\\\\", 2))
                return WERR_INVALID_COMPUTERNAME;
-       binding->host = r->in.str+2;
+       binding->host = r->in.local_machine+2;
 
        creds = cli_credentials_init_anon(mem_ctx); /* FIXME: Use machine credentials instead ? */
 
@@ -1168,7 +1186,7 @@ static WERROR dcesrv_spoolss_RemoteFindFirstPrinterChangeNotifyEx(struct dcesrv_
                                       dce_call->conn->dce_ctx->lp_ctx);
 
        if (NT_STATUS_IS_ERR(status)) {
-               DEBUG(0, ("unable to call back to %s\n", r->in.str));
+               DEBUG(0, ("unable to call back to %s\n", r->in.local_machine));
                return WERR_SERVER_UNAVAILABLE;
        }
 
@@ -1177,13 +1195,14 @@ static WERROR dcesrv_spoolss_RemoteFindFirstPrinterChangeNotifyEx(struct dcesrv_
        W_ERROR_HAVE_NO_MEMORY(rop.in.server_name);
        rop.in.printer_local = 0;
        rop.in.type = REG_NONE;
-       rop.in.unknown1 = 0;
-       rop.in.unknown2 = 0;
+       rop.in.bufsize = 0;
+       rop.in.buffer = NULL;
        rop.out.handle = &notify_handle;
 
-       status = dcerpc_spoolss_ReplyOpenPrinter(p, mem_ctx, &rop);
+       status = dcerpc_spoolss_ReplyOpenPrinter_r(p->binding_handle, mem_ctx, &rop);
        if (NT_STATUS_IS_ERR(status)) {
-               DEBUG(0, ("unable to open remote printer %s\n", r->in.str));
+               DEBUG(0, ("unable to open remote printer %s\n",
+                       r->in.local_machine));
                return WERR_SERVER_UNAVAILABLE;
        }
 
@@ -1194,20 +1213,20 @@ static WERROR dcesrv_spoolss_RemoteFindFirstPrinterChangeNotifyEx(struct dcesrv_
 
 
 /* 
-  spoolss_RouterRefreshPrinterChangeNotification 
+  spoolss_RouterReplyPrinterEx
 */
-static WERROR dcesrv_spoolss_RouterRefreshPrinterChangeNotification(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
-                      struct spoolss_RouterRefreshPrinterChangeNotification *r)
+static WERROR dcesrv_spoolss_RouterReplyPrinterEx(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
+                      struct spoolss_RouterReplyPrinterEx *r)
 {
        DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
 }
 
 
 /* 
-  spoolss_RemoteFindNextPrinterChangeNotifyEx 
+  spoolss_RouterRefreshPrinterChangeNotify
 */
-static WERROR dcesrv_spoolss_RemoteFindNextPrinterChangeNotifyEx(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
-                      struct spoolss_RemoteFindNextPrinterChangeNotifyEx *r)
+static WERROR dcesrv_spoolss_RouterRefreshPrinterChangeNotify(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
+                      struct spoolss_RouterRefreshPrinterChangeNotify *r)
 {
        DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
 }
@@ -1228,7 +1247,7 @@ static WERROR dcesrv_spoolss_44(struct dcesrv_call_state *dce_call, TALLOC_CTX *
 static WERROR dcesrv_spoolss_OpenPrinterEx(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
                       struct spoolss_OpenPrinterEx *r)
 {
-       struct ntptr_context *ntptr = talloc_get_type(dce_call->context->private, struct ntptr_context);
+       struct ntptr_context *ntptr = talloc_get_type(dce_call->context->private_data, struct ntptr_context);
        struct ntptr_GenericHandle *handle;
        struct dcesrv_handle *h;
        const char *server;
@@ -1563,6 +1582,146 @@ static WERROR dcesrv_spoolss_5f(struct dcesrv_call_state *dce_call, TALLOC_CTX *
        DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
 }
 
+/*
+  spoolss_60
+*/
+static WERROR dcesrv_spoolss_60(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
+                      struct spoolss_60 *r)
+{
+       DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
+}
+
+
+/*
+  spoolss_61
+*/
+static WERROR dcesrv_spoolss_61(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
+                      struct spoolss_61 *r)
+{
+       DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
+}
+
+
+/*
+  spoolss_62
+*/
+static WERROR dcesrv_spoolss_62(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
+                      struct spoolss_62 *r)
+{
+       DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
+}
+
+
+/*
+  spoolss_63
+*/
+static WERROR dcesrv_spoolss_63(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
+                      struct spoolss_63 *r)
+{
+       DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
+}
+
+
+/*
+  spoolss_64
+*/
+static WERROR dcesrv_spoolss_64(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
+                      struct spoolss_64 *r)
+{
+       DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
+}
+
+
+/*
+  spoolss_65
+*/
+static WERROR dcesrv_spoolss_65(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
+                      struct spoolss_65 *r)
+{
+       DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
+}
+
+
+/*
+  spoolss_GetCorePrinterDrivers
+*/
+static WERROR dcesrv_spoolss_GetCorePrinterDrivers(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
+                      struct spoolss_GetCorePrinterDrivers *r)
+{
+       DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
+}
+
+
+/*
+  spoolss_67
+*/
+static WERROR dcesrv_spoolss_67(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
+                      struct spoolss_67 *r)
+{
+       DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
+}
+
+
+/*
+  spoolss_GetPrinterDriverPackagePath
+*/
+static WERROR dcesrv_spoolss_GetPrinterDriverPackagePath(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
+                      struct spoolss_GetPrinterDriverPackagePath *r)
+{
+       DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
+}
+
+
+/*
+  spoolss_69
+*/
+static WERROR dcesrv_spoolss_69(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
+                      struct spoolss_69 *r)
+{
+       DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
+}
+
+
+/*
+  spoolss_6a
+*/
+static WERROR dcesrv_spoolss_6a(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
+                      struct spoolss_6a *r)
+{
+       DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
+}
+
+
+/*
+  spoolss_6b
+*/
+static WERROR dcesrv_spoolss_6b(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
+                      struct spoolss_6b *r)
+{
+       DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
+}
+
+
+/*
+  spoolss_6c
+*/
+static WERROR dcesrv_spoolss_6c(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
+                      struct spoolss_6c *r)
+{
+       DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
+}
+
+
+/*
+  spoolss_6d
+*/
+static WERROR dcesrv_spoolss_6d(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
+                      struct spoolss_6d *r)
+{
+       DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
+}
+
+
 
 /* include the generated boilerplate */
 #include "librpc/gen_ndr/ndr_spoolss_s.c"