some initial code for AddPrinterEx() project. Most is ifdef'd out
authorGerald Carter <jerry@samba.org>
Tue, 25 Jul 2000 21:07:46 +0000 (21:07 +0000)
committerGerald Carter <jerry@samba.org>
Tue, 25 Jul 2000 21:07:46 +0000 (21:07 +0000)
'cause it's not all written.

-jerry
(This used to be commit 2c0f6bcc8f926ee9c17de12671075e8a9239bb94)

source3/rpc_client/msrpc_spoolss.c
source3/rpcclient/cmd_spoolss.c
source3/rpcclient/spoolss_cmds.c

index 34e6d4404c1ccd782c95ff8d7c7944386a1feb5c..72ca7ee5c09957ae44ed4f84f90380a242f17264 100644 (file)
@@ -182,8 +182,11 @@ static void decode_printerdriverdir_info_1(NEW_BUFFER *buffer, DRIVER_DIRECTORY_
 }
 
 
-static void decode_port_info_2(NEW_BUFFER *buffer, uint32 returned, 
-                              PORT_INFO_2 **info)
+/**********************************************************************
+ Decode a PORT_INFO_2 struct from a NEW_BUFFER 
+**********************************************************************/
+void decode_port_info_2(NEW_BUFFER *buffer, uint32 returned, 
+                       PORT_INFO_2 **info)
 {
         uint32 i;
         PORT_INFO_2 *inf;
@@ -199,6 +202,28 @@ static void decode_port_info_2(NEW_BUFFER *buffer, uint32 returned,
         *info=inf;
 }
 
+/**********************************************************************
+ Decode a PORT_INFO_1 struct from a NEW_BUFFER 
+**********************************************************************/
+void decode_port_info_1(NEW_BUFFER *buffer, uint32 returned, 
+                       PORT_INFO_1 **info)
+{
+        uint32 i;
+        PORT_INFO_1 *inf;
+
+        inf=(PORT_INFO_1*)malloc(returned*sizeof(PORT_INFO_1));
+
+        prs_set_offset(&buffer->prs, 0);
+
+        for (i=0; i<returned; i++) {
+               /* WRITEME!!!! yet to be written --jerry */
+                /* new_smb_io_port_info_1("", buffer, &(inf[i]), 0); */
+               ;;
+        }
+
+        *info=inf;
+}
+
 /****************************************************************************
 nt spoolss query
 ****************************************************************************/
@@ -282,6 +307,9 @@ BOOL msrpc_spoolss_enum_ports(char* srv_name,
        if (returned != 0)
        {
                switch (level) {
+               case 1:
+                       decode_port_info_1(&buffer, returned, &ctr->port.info_1);
+                       break;
                case 2:
                        decode_port_info_2(&buffer, returned, &ctr->port.info_2);
                        break;
index 3a80e5d0e7917eca00a92c190f3600a4f800f47e..7ed6dd80ce135aec77a600f2a5a9aa0fcd1cad18 100644 (file)
@@ -5,6 +5,7 @@
    Copyright (C) Andrew Tridgell              1994-2000
    Copyright (C) Luke Kenneth Casson Leighton 1996-2000
    Copyright (C) Jean-Francois Micouleau      1999-2000
+   Copyright (C) Gerald Carter                     2000
    
    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
@@ -457,7 +458,7 @@ uint32 cmd_spoolss_getprinterdriverdir(struct client_info *info, int argc, char
         uint32 level = 1;
 
         fstring srv_name;
-        fstring env;
+       fstring env;
 
         fstrcpy(srv_name, "\\\\");
         fstrcat(srv_name, info->dest_host);
@@ -483,3 +484,116 @@ uint32 cmd_spoolss_getprinterdriverdir(struct client_info *info, int argc, char
         return NT_STATUS_NOPROBLEMO;
 }
 
+/********************************************************************************
+ send an AddPrinterEx() request
+********************************************************************************/
+uint32 cmd_spoolss_addprinterex(struct client_info *info, int argc, char *argv[])
+{
+#if 0
+        PRINTER_INFO_CTR ctr;
+       uint32 level = 2;
+        fstring        srv_name, 
+                       printer_name, 
+                       driver_name,
+                       port_name;
+       POLICY_HND hnd;
+       PRINTER_INFO_2  print_info_2;
+       PORT_INFO_1     *port_info_1 = NULL;
+       NEW_BUFFER      buffer;
+       uint32          status,
+                       needed,
+                       returned;
+       uint32          i;
+       fstring         srv_port_name;
+       BOOL            valid_port = False;
+
+        fstrcpy(srv_name, "\\\\");
+        fstrcat(srv_name, info->dest_host);
+        strupper(srv_name);
+
+       /* check (and copy) the command line arguments */
+        if (argc < 2) {
+                report(out_hnd, "spooladdprinterex <name> <driver>\n");
+                return NT_STATUS_NOPROBLEMO;
+        }
+
+       fstrcpy(printer_name, argv[1]);
+        fstrcpy(driver_name, argv[2]);
+       fstrcpy(port_name, argv[3]);
+       
+       
+       /* Verify that the specified port is ok; spoolss_enum_ports() should 
+          be a level 1 since all we need is the name */
+       init_buffer (&buffer, 0);
+       
+       /* send a NULL buffer first */
+       status=spoolss_enum_ports(srv_name, 1, &buffer, 0, 
+                                    &needed, &returned);
+       
+       /* send the right amount of space this time */
+       if (status==ERROR_INSUFFICIENT_BUFFER) {
+               init_buffer(&buffer, needed);
+               status=spoolss_enum_ports(srv_name, 1, &buffer, 
+                                         needed, &needed, &returned);
+                                         
+               /* if the call succeeded, then decode the buffer into 
+                  an PRINTER_INFO_1 structre */
+               if (status == NT_STATUS_NO_PROBLEMO)
+               {
+                       decode_port_info_1 (&buffer, returned, &port_info_1);
+               }
+               else
+               {
+                       report (out_hnd, "cmd_spoolss_addprinterex: FAILED to enumerate ports\n"));
+                       return NT_STATUS_NOPROBLEMO;
+               }
+                                       
+       }
+       
+       /*
+        * now we have an array of port names and we can interate
+        * through it to verify port_name before actually attempting 
+        * to add the printer on the server.
+        */
+       for (i=0; i<returned; i++)
+       {
+               /* compare port_info_1[i].port_name to the port_name specified */
+               unistr_to_ascii(srv_port_name, port_info_1[i].port_name, sizeof(srv_port_name)-1);
+               if (strequal(srv_port_name, port_name))
+               {
+                       valid_port = True;
+                       break;
+               }
+       }
+       if (!valid_port)
+       {
+               report (out_hnd, "cmd_spoolss_addprinterex: Invalid port specified!\n");
+               return NT_STATUS_NOPROBLEMO;
+       }
+       
+        
+       /*
+        * Need to build the PRINTER_INFO_2 struct here 
+        */
+       ;;
+       
+       /* if successful, spoolss_addprinterex() should return True and hnd 
+          should be a valid handle to an open printer */
+       if (spoolss_addprinterex(&hnd, 2, &print_info_2))
+       {
+               if (!spoolss_closeprinter( &hnd ))
+               {
+                       report (out_hnd, "cmd_spoolss_addprinterex: spoolss_closeprinter FAILED!\n");
+               }
+       }
+       else
+       {
+               report (out_hnd, "cmd_spoolss_addprinterex: spoolss_addprinterex FAILED!\n");
+       }
+
+       
+#endif         
+        return NT_STATUS_NOPROBLEMO;
+}
+        
+       
index 630d2f2aa55e9a809ec7f5724ff0c6fa62978315..1041ae158c6289e563029bb0000ea8af2f9eca92 100644 (file)
@@ -68,6 +68,10 @@ static const struct command_set spl_commands[] = {
        {"spoolgetprinterdriverdir", cmd_spoolss_getprinterdriverdir,
         "Spool get printer driver directory",
         {NULL, NULL}},
+
+       {"spooladdprinter", cmd_spoolss_addprinterex,
+        "<name> <driver> Spool AddPrinterEx()",
+        {NULL, NULL}},
        /*
         * oop!
         */