rpc_client/cli_spoolss.c

説明を見る。
00001 /*
00002    Unix SMB/CIFS implementation.
00003    RPC pipe client
00004 
00005    Copyright (C) Gerald Carter                2001-2005,
00006    Copyright (C) Tim Potter                   2000-2002,
00007    Copyright (C) Andrew Tridgell              1994-2000,
00008    Copyright (C) Jean-Francois Micouleau      1999-2000.
00009    Copyright (C) Jeremy Allison                         2005.
00010 
00011    This program is free software; you can redistribute it and/or modify
00012    it under the terms of the GNU General Public License as published by
00013    the Free Software Foundation; either version 2 of the License, or
00014    (at your option) any later version.
00015 
00016    This program is distributed in the hope that it will be useful,
00017    but WITHOUT ANY WARRANTY; without even the implied warranty of
00018    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
00019    GNU General Public License for more details.
00020 
00021    You should have received a copy of the GNU General Public License
00022    along with this program; if not, write to the Free Software
00023    Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
00024 */
00025 
00026 #include "includes.h"
00027 #include "rpc_client.h"
00028 
00029 /*********************************************************************
00030  Decode various spoolss rpc's and info levels
00031  ********************************************************************/
00032 
00033 /**********************************************************************
00034 **********************************************************************/
00035 
00036 static BOOL decode_printer_info_0(TALLOC_CTX *mem_ctx, RPC_BUFFER *buffer,
00037                                 uint32 returned, PRINTER_INFO_0 **info)
00038 {
00039         uint32 i;
00040         PRINTER_INFO_0  *inf;
00041 
00042         if (returned) {
00043                 inf=TALLOC_ARRAY(mem_ctx, PRINTER_INFO_0, returned);
00044                 if (!inf) {
00045                         return False;
00046                 }
00047                 memset(inf, 0, returned*sizeof(PRINTER_INFO_0));
00048         } else {
00049                 inf = NULL;
00050         }
00051 
00052         prs_set_offset(&buffer->prs,0);
00053 
00054         for (i=0; i<returned; i++) {
00055                 if (!smb_io_printer_info_0("", buffer, &inf[i], 0)) {
00056                         return False;
00057                 }
00058         }
00059 
00060         *info=inf;
00061         return True;
00062 }
00063 
00064 /**********************************************************************
00065 **********************************************************************/
00066 
00067 static BOOL decode_printer_info_1(TALLOC_CTX *mem_ctx, RPC_BUFFER *buffer,
00068                                 uint32 returned, PRINTER_INFO_1 **info)
00069 {
00070         uint32 i;
00071         PRINTER_INFO_1  *inf;
00072 
00073         if (returned) {
00074                 inf=TALLOC_ARRAY(mem_ctx, PRINTER_INFO_1, returned);
00075                 if (!inf) {
00076                         return False;
00077                 }
00078                 memset(inf, 0, returned*sizeof(PRINTER_INFO_1));
00079         } else {
00080                 inf = NULL;
00081         }
00082 
00083         prs_set_offset(&buffer->prs,0);
00084 
00085         for (i=0; i<returned; i++) {
00086                 if (!smb_io_printer_info_1("", buffer, &inf[i], 0)) {
00087                         return False;
00088                 }
00089         }
00090 
00091         *info=inf;
00092         return True;
00093 }
00094 
00095 /**********************************************************************
00096 **********************************************************************/
00097 
00098 static BOOL decode_printer_info_2(TALLOC_CTX *mem_ctx, RPC_BUFFER *buffer, 
00099                                 uint32 returned, PRINTER_INFO_2 **info)
00100 {
00101         uint32 i;
00102         PRINTER_INFO_2  *inf;
00103 
00104         if (returned) {
00105                 inf=TALLOC_ARRAY(mem_ctx, PRINTER_INFO_2, returned);
00106                 if (!inf) {
00107                         return False;
00108                 }
00109                 memset(inf, 0, returned*sizeof(PRINTER_INFO_2));
00110         } else {
00111                 inf = NULL;
00112         }
00113 
00114         prs_set_offset(&buffer->prs,0);
00115 
00116         for (i=0; i<returned; i++) {
00117                 /* a little initialization as we go */
00118                 inf[i].secdesc = NULL;
00119                 if (!smb_io_printer_info_2("", buffer, &inf[i], 0)) {
00120                         return False;
00121                 }
00122         }
00123 
00124         *info=inf;
00125         return True;
00126 }
00127 
00128 /**********************************************************************
00129 **********************************************************************/
00130 
00131 static BOOL decode_printer_info_3(TALLOC_CTX *mem_ctx, RPC_BUFFER *buffer, 
00132                                 uint32 returned, PRINTER_INFO_3 **info)
00133 {
00134         uint32 i;
00135         PRINTER_INFO_3  *inf;
00136 
00137         if (returned) {
00138                 inf=TALLOC_ARRAY(mem_ctx, PRINTER_INFO_3, returned);
00139                 if (!inf) {
00140                         return False;
00141                 }
00142                 memset(inf, 0, returned*sizeof(PRINTER_INFO_3));
00143         } else {
00144                 inf = NULL;
00145         }
00146 
00147         prs_set_offset(&buffer->prs,0);
00148 
00149         for (i=0; i<returned; i++) {
00150                 inf[i].secdesc = NULL;
00151                 if (!smb_io_printer_info_3("", buffer, &inf[i], 0)) {
00152                         return False;
00153                 }
00154         }
00155 
00156         *info=inf;
00157         return True;
00158 }
00159 
00160 /**********************************************************************
00161 **********************************************************************/
00162 
00163 static BOOL decode_printer_info_7(TALLOC_CTX *mem_ctx, RPC_BUFFER *buffer,
00164                                 uint32 returned, PRINTER_INFO_7 **info)
00165 {
00166         uint32 i;
00167         PRINTER_INFO_7  *inf;
00168 
00169         if (returned) {
00170                 inf=TALLOC_ARRAY(mem_ctx, PRINTER_INFO_7, returned);
00171                 if (!inf) {
00172                         return False;
00173                 }
00174                 memset(inf, 0, returned*sizeof(PRINTER_INFO_7));
00175         } else {
00176                 inf = NULL;
00177         }
00178 
00179         prs_set_offset(&buffer->prs,0);
00180 
00181         for (i=0; i<returned; i++) {
00182                 if (!smb_io_printer_info_7("", buffer, &inf[i], 0)) {
00183                         return False;
00184                 }
00185         }
00186 
00187         *info=inf;
00188         return True;
00189 }
00190 
00191 
00192 /**********************************************************************
00193 **********************************************************************/
00194 
00195 static BOOL decode_port_info_1(TALLOC_CTX *mem_ctx, RPC_BUFFER *buffer, 
00196                         uint32 returned, PORT_INFO_1 **info)
00197 {
00198         uint32 i;
00199         PORT_INFO_1 *inf;
00200 
00201         if (returned) {
00202                 inf=TALLOC_ARRAY(mem_ctx, PORT_INFO_1, returned);
00203                 if (!inf) {
00204                         return False;
00205                 }
00206                 memset(inf, 0, returned*sizeof(PORT_INFO_1));
00207         } else {
00208                 inf = NULL;
00209         }
00210 
00211         prs_set_offset(&buffer->prs, 0);
00212 
00213         for (i=0; i<returned; i++) {
00214                 if (!smb_io_port_info_1("", buffer, &(inf[i]), 0)) {
00215                         return False;
00216                 }
00217         }
00218 
00219         *info=inf;
00220         return True;
00221 }
00222 
00223 /**********************************************************************
00224 **********************************************************************/
00225 
00226 static BOOL decode_port_info_2(TALLOC_CTX *mem_ctx, RPC_BUFFER *buffer, 
00227                         uint32 returned, PORT_INFO_2 **info)
00228 {
00229         uint32 i;
00230         PORT_INFO_2 *inf;
00231 
00232         if (returned) {
00233                 inf=TALLOC_ARRAY(mem_ctx, PORT_INFO_2, returned);
00234                 if (!inf) {
00235                         return False;
00236                 }
00237                 memset(inf, 0, returned*sizeof(PORT_INFO_2));
00238         } else {
00239                 inf = NULL;
00240         }
00241 
00242         prs_set_offset(&buffer->prs, 0);
00243 
00244         for (i=0; i<returned; i++) {
00245                 if (!smb_io_port_info_2("", buffer, &(inf[i]), 0)) {
00246                         return False;
00247                 }
00248         }
00249 
00250         *info=inf;
00251         return True;
00252 }
00253 
00254 /**********************************************************************
00255 **********************************************************************/
00256 
00257 static BOOL decode_printer_driver_1(TALLOC_CTX *mem_ctx, RPC_BUFFER *buffer, 
00258                         uint32 returned, DRIVER_INFO_1 **info)
00259 {
00260         uint32 i;
00261         DRIVER_INFO_1 *inf;
00262 
00263         if (returned) {
00264                 inf=TALLOC_ARRAY(mem_ctx, DRIVER_INFO_1, returned);
00265                 if (!inf) {
00266                         return False;
00267                 }
00268                 memset(inf, 0, returned*sizeof(DRIVER_INFO_1));
00269         } else {
00270                 inf = NULL;
00271         }
00272 
00273         prs_set_offset(&buffer->prs,0);
00274 
00275         for (i=0; i<returned; i++) {
00276                 if (!smb_io_printer_driver_info_1("", buffer, &(inf[i]), 0)) {
00277                         return False;
00278                 }
00279         }
00280 
00281         *info=inf;
00282         return True;
00283 }
00284 
00285 /**********************************************************************
00286 **********************************************************************/
00287 
00288 static BOOL decode_printer_driver_2(TALLOC_CTX *mem_ctx, RPC_BUFFER *buffer, 
00289                         uint32 returned, DRIVER_INFO_2 **info)
00290 {
00291         uint32 i;
00292         DRIVER_INFO_2 *inf;
00293 
00294         if (returned) {
00295                 inf=TALLOC_ARRAY(mem_ctx, DRIVER_INFO_2, returned);
00296                 if (!inf) {
00297                         return False;
00298                 }
00299                 memset(inf, 0, returned*sizeof(DRIVER_INFO_2));
00300         } else {
00301                 inf = NULL;
00302         }
00303 
00304         prs_set_offset(&buffer->prs,0);
00305 
00306         for (i=0; i<returned; i++) {
00307                 if (!smb_io_printer_driver_info_2("", buffer, &(inf[i]), 0)) {
00308                         return False;
00309                 }
00310         }
00311 
00312         *info=inf;
00313         return True;
00314 }
00315 
00316 /**********************************************************************
00317 **********************************************************************/
00318 
00319 static BOOL decode_printer_driver_3(TALLOC_CTX *mem_ctx, RPC_BUFFER *buffer, 
00320                         uint32 returned, DRIVER_INFO_3 **info)
00321 {
00322         uint32 i;
00323         DRIVER_INFO_3 *inf;
00324 
00325         if (returned) {
00326                 inf=TALLOC_ARRAY(mem_ctx, DRIVER_INFO_3, returned);
00327                 if (!inf) {
00328                         return False;
00329                 }
00330                 memset(inf, 0, returned*sizeof(DRIVER_INFO_3));
00331         } else {
00332                 inf = NULL;
00333         }
00334 
00335         prs_set_offset(&buffer->prs,0);
00336 
00337         for (i=0; i<returned; i++) {
00338                 if (!smb_io_printer_driver_info_3("", buffer, &(inf[i]), 0)) {
00339                         return False;
00340                 }
00341         }
00342 
00343         *info=inf;
00344         return True;
00345 }
00346 
00347 /**********************************************************************
00348 **********************************************************************/
00349 
00350 static BOOL decode_printerdriverdir_1 (TALLOC_CTX *mem_ctx, RPC_BUFFER *buffer,
00351                         uint32 returned, DRIVER_DIRECTORY_1 **info
00352 )
00353 {
00354         DRIVER_DIRECTORY_1 *inf;
00355  
00356         inf=TALLOC_P(mem_ctx, DRIVER_DIRECTORY_1);
00357         if (!inf) {
00358                 return False;
00359         }
00360         memset(inf, 0, sizeof(DRIVER_DIRECTORY_1));
00361 
00362         prs_set_offset(&buffer->prs, 0);
00363 
00364         if (!smb_io_driverdir_1("", buffer, inf, 0)) {
00365                 return False;
00366         }
00367  
00368         *info=inf;
00369         return True;
00370 }
00371 
00372 /**********************************************************************
00373 **********************************************************************/
00374 
00375 static BOOL decode_jobs_1(TALLOC_CTX *mem_ctx, RPC_BUFFER *buffer, 
00376                           uint32 num_jobs, JOB_INFO_1 **jobs)
00377 {
00378         uint32 i;
00379 
00380         if (num_jobs) {
00381                 *jobs = TALLOC_ARRAY(mem_ctx, JOB_INFO_1, num_jobs);
00382                 if (*jobs == NULL) {
00383                         return False;
00384                 }
00385         } else {
00386                 *jobs = NULL;
00387         }
00388         prs_set_offset(&buffer->prs,0);
00389 
00390         for (i = 0; i < num_jobs; i++) {
00391                 if (!smb_io_job_info_1("", buffer, &((*jobs)[i]), 0)) {
00392                         return False;
00393                 }
00394         }
00395 
00396         return True;
00397 }
00398 
00399 /**********************************************************************
00400 **********************************************************************/
00401 
00402 static BOOL decode_jobs_2(TALLOC_CTX *mem_ctx, RPC_BUFFER *buffer, 
00403                           uint32 num_jobs, JOB_INFO_2 **jobs)
00404 {
00405         uint32 i;
00406 
00407         if (num_jobs) {
00408                 *jobs = TALLOC_ARRAY(mem_ctx, JOB_INFO_2, num_jobs);
00409                 if (*jobs == NULL) {
00410                         return False;
00411                 }
00412         } else {
00413                 *jobs = NULL;
00414         }
00415         prs_set_offset(&buffer->prs,0);
00416 
00417         for (i = 0; i < num_jobs; i++) {
00418                 if (!smb_io_job_info_2("", buffer, &((*jobs)[i]), 0)) {
00419                         return False;
00420                 }
00421         }
00422 
00423         return True;
00424 }
00425 
00426 /**********************************************************************
00427 **********************************************************************/
00428 
00429 static BOOL decode_forms_1(TALLOC_CTX *mem_ctx, RPC_BUFFER *buffer, 
00430                            uint32 num_forms, FORM_1 **forms)
00431 {
00432         int i;
00433 
00434         if (num_forms) {
00435                 *forms = TALLOC_ARRAY(mem_ctx, FORM_1, num_forms);
00436                 if (*forms == NULL) {
00437                         return False;
00438                 }
00439         } else {
00440                 *forms = NULL;
00441         }
00442 
00443         prs_set_offset(&buffer->prs,0);
00444 
00445         for (i = 0; i < num_forms; i++) {
00446                 if (!smb_io_form_1("", buffer, &((*forms)[i]), 0)) {
00447                         return False;
00448                 }
00449         }
00450 
00451         return True;
00452 }
00453 
00454 /**********************************************************************
00455 **********************************************************************/
00456 
00457 WERROR rpccli_spoolss_open_printer_ex(struct rpc_pipe_client *cli, TALLOC_CTX *mem_ctx,
00458                                 const char *printername, const char *datatype, uint32 access_required,
00459                                 const char *station, const char *username, POLICY_HND *pol)
00460 {
00461         prs_struct qbuf, rbuf;
00462         SPOOL_Q_OPEN_PRINTER_EX in;
00463         SPOOL_R_OPEN_PRINTER_EX out;
00464 
00465         ZERO_STRUCT(in);
00466         ZERO_STRUCT(out);
00467 
00468         make_spoolss_q_open_printer_ex( &in, printername, datatype,
00469                 access_required, station, username );
00470 
00471         CLI_DO_RPC_WERR( cli, mem_ctx, PI_SPOOLSS, SPOOLSS_OPENPRINTEREX,
00472                     in, out, 
00473                     qbuf, rbuf,
00474                     spoolss_io_q_open_printer_ex,
00475                     spoolss_io_r_open_printer_ex, 
00476                     WERR_GENERAL_FAILURE );
00477 
00478         memcpy( pol, &out.handle, sizeof(POLICY_HND) );
00479         
00480         return out.status;
00481 }
00482 
00483 /**********************************************************************
00484 **********************************************************************/
00485 
00486 WERROR rpccli_spoolss_close_printer(struct rpc_pipe_client *cli, TALLOC_CTX *mem_ctx,
00487                                  POLICY_HND *pol)
00488 {
00489         prs_struct qbuf, rbuf;
00490         SPOOL_Q_CLOSEPRINTER in;
00491         SPOOL_R_CLOSEPRINTER out;
00492 
00493         ZERO_STRUCT(in);
00494         ZERO_STRUCT(out);
00495 
00496         make_spoolss_q_closeprinter( &in, pol );
00497 
00498         CLI_DO_RPC_WERR( cli, mem_ctx, PI_SPOOLSS, SPOOLSS_CLOSEPRINTER,
00499                     in, out, 
00500                     qbuf, rbuf,
00501                     spoolss_io_q_closeprinter,
00502                     spoolss_io_r_closeprinter, 
00503                     WERR_GENERAL_FAILURE );
00504                     
00505         return out.status;
00506 }
00507 
00508 /**********************************************************************
00509 **********************************************************************/
00510 
00511 WERROR rpccli_spoolss_enum_printers(struct rpc_pipe_client *cli, TALLOC_CTX *mem_ctx,
00512                                  char *name, uint32 flags, uint32 level,
00513                                  uint32 *num_printers, PRINTER_INFO_CTR *ctr)
00514 {
00515         prs_struct qbuf, rbuf;
00516         SPOOL_Q_ENUMPRINTERS in;
00517         SPOOL_R_ENUMPRINTERS out;
00518         RPC_BUFFER buffer;
00519         uint32 offered;
00520 
00521         ZERO_STRUCT(in);
00522         ZERO_STRUCT(out);
00523 
00524         offered = 0;
00525         rpcbuf_init(&buffer, offered, mem_ctx);
00526         make_spoolss_q_enumprinters( &in, flags, name, level, &buffer, offered );
00527 
00528         CLI_DO_RPC_WERR( cli, mem_ctx, PI_SPOOLSS, SPOOLSS_ENUMPRINTERS,
00529                     in, out, 
00530                     qbuf, rbuf,
00531                     spoolss_io_q_enumprinters,
00532                     spoolss_io_r_enumprinters, 
00533                     WERR_GENERAL_FAILURE );
00534                     
00535         if ( W_ERROR_EQUAL( out.status, WERR_INSUFFICIENT_BUFFER ) ) {
00536                 offered = out.needed;
00537                 
00538                 ZERO_STRUCT(in);
00539                 ZERO_STRUCT(out);
00540 
00541                 rpcbuf_init(&buffer, offered, mem_ctx);
00542                 make_spoolss_q_enumprinters( &in, flags, name, level, &buffer, offered );
00543 
00544                 CLI_DO_RPC_WERR( cli, mem_ctx, PI_SPOOLSS, SPOOLSS_ENUMPRINTERS,
00545                             in, out, 
00546                             qbuf, rbuf,
00547                             spoolss_io_q_enumprinters,
00548                             spoolss_io_r_enumprinters, 
00549                             WERR_GENERAL_FAILURE );
00550         }
00551 
00552         if ( !W_ERROR_IS_OK(out.status) )
00553                 return out.status;
00554 
00555         switch (level) {
00556         case 0:
00557                 if (!decode_printer_info_0(mem_ctx, out.buffer, out.returned, &ctr->printers_0)) {
00558                         return WERR_GENERAL_FAILURE;
00559                 }
00560                 break;
00561         case 1:
00562                 if (!decode_printer_info_1(mem_ctx, out.buffer, out.returned, &ctr->printers_1)) {
00563                         return WERR_GENERAL_FAILURE;
00564                 }
00565                 break;
00566         case 2:
00567                 if (!decode_printer_info_2(mem_ctx, out.buffer, out.returned, &ctr->printers_2)) {
00568                         return WERR_GENERAL_FAILURE;
00569                 }
00570                 break;
00571         case 3:
00572                 if (!decode_printer_info_3(mem_ctx, out.buffer, out.returned, &ctr->printers_3)) {
00573                         return WERR_GENERAL_FAILURE;
00574                 }
00575                 break;
00576         default:
00577                 return WERR_UNKNOWN_LEVEL;
00578         }                       
00579 
00580         *num_printers = out.returned;
00581 
00582         return out.status;
00583 }
00584 
00585 /**********************************************************************
00586 **********************************************************************/
00587 
00588 WERROR rpccli_spoolss_enum_ports(struct rpc_pipe_client *cli, TALLOC_CTX *mem_ctx,
00589                               uint32 level, uint32 *num_ports, PORT_INFO_CTR *ctr)
00590 {
00591         prs_struct qbuf, rbuf;
00592         SPOOL_Q_ENUMPORTS in;
00593         SPOOL_R_ENUMPORTS out;
00594         RPC_BUFFER buffer;
00595         fstring server;
00596         uint32 offered;
00597 
00598         ZERO_STRUCT(in);
00599         ZERO_STRUCT(out);
00600 
00601         slprintf(server, sizeof(fstring)-1, "\\\\%s", cli->cli->desthost);
00602         strupper_m(server);
00603 
00604         offered = 0;
00605         rpcbuf_init(&buffer, offered, mem_ctx);
00606         make_spoolss_q_enumports( &in, server, level, &buffer, offered );
00607         
00608         CLI_DO_RPC_WERR( cli, mem_ctx, PI_SPOOLSS, SPOOLSS_ENUMPORTS,
00609                     in, out, 
00610                     qbuf, rbuf,
00611                     spoolss_io_q_enumports,
00612                     spoolss_io_r_enumports, 
00613                     WERR_GENERAL_FAILURE );
00614                         
00615         if ( W_ERROR_EQUAL( out.status, WERR_INSUFFICIENT_BUFFER ) ) {
00616                 offered = out.needed;
00617                 
00618                 ZERO_STRUCT(in);
00619                 ZERO_STRUCT(out);
00620                 
00621                 rpcbuf_init(&buffer, offered, mem_ctx);
00622                 make_spoolss_q_enumports( &in, server, level, &buffer, offered );
00623 
00624                 CLI_DO_RPC_WERR( cli, mem_ctx, PI_SPOOLSS, SPOOLSS_ENUMPORTS,
00625                             in, out, 
00626                             qbuf, rbuf,
00627                             spoolss_io_q_enumports,
00628                             spoolss_io_r_enumports, 
00629                             WERR_GENERAL_FAILURE );
00630         }
00631         
00632         if ( !W_ERROR_IS_OK(out.status) )
00633                 return out.status;
00634         
00635         switch (level) {
00636         case 1:
00637                 if (!decode_port_info_1(mem_ctx, out.buffer, out.returned, &ctr->port.info_1)) {
00638                         return WERR_GENERAL_FAILURE;
00639                 }
00640                 break;
00641         case 2:
00642                 if (!decode_port_info_2(mem_ctx, out.buffer, out.returned, &ctr->port.info_2)) {
00643                         return WERR_GENERAL_FAILURE;
00644                 }
00645                 break;
00646         default:
00647                 return WERR_UNKNOWN_LEVEL;
00648         }
00649 
00650         *num_ports = out.returned;
00651 
00652         return out.status;
00653 }
00654 
00655 /**********************************************************************
00656 **********************************************************************/
00657 
00658 WERROR rpccli_spoolss_getprinter(struct rpc_pipe_client *cli, TALLOC_CTX *mem_ctx,
00659                               POLICY_HND *pol, uint32 level, 
00660                               PRINTER_INFO_CTR *ctr)
00661 {
00662         prs_struct qbuf, rbuf;
00663         SPOOL_Q_GETPRINTER in;
00664         SPOOL_R_GETPRINTER out;
00665         RPC_BUFFER buffer;
00666         uint32 offered;
00667 
00668         ZERO_STRUCT(in);
00669         ZERO_STRUCT(out);
00670 
00671         /* Initialise input parameters */
00672 
00673         offered = 0;
00674         rpcbuf_init(&buffer, offered, mem_ctx);
00675         make_spoolss_q_getprinter( mem_ctx, &in, pol, level, &buffer, offered );
00676         
00677         CLI_DO_RPC_WERR( cli, mem_ctx, PI_SPOOLSS, SPOOLSS_GETPRINTER,
00678                     in, out, 
00679                     qbuf, rbuf,
00680                     spoolss_io_q_getprinter,
00681                     spoolss_io_r_getprinter, 
00682                     WERR_GENERAL_FAILURE );
00683 
00684         if ( W_ERROR_EQUAL( out.status, WERR_INSUFFICIENT_BUFFER ) ) {
00685                 offered = out.needed;
00686                 
00687                 ZERO_STRUCT(in);
00688                 ZERO_STRUCT(out);
00689                 
00690                 rpcbuf_init(&buffer, offered, mem_ctx);
00691                 make_spoolss_q_getprinter( mem_ctx, &in, pol, level, &buffer, offered );
00692 
00693                 CLI_DO_RPC_WERR( cli, mem_ctx, PI_SPOOLSS, SPOOLSS_GETPRINTER,
00694                             in, out, 
00695                             qbuf, rbuf,
00696                             spoolss_io_q_getprinter,
00697                             spoolss_io_r_getprinter, 
00698                             WERR_GENERAL_FAILURE );
00699         }
00700         
00701         if ( !W_ERROR_IS_OK(out.status) )
00702                 return out.status;
00703                 
00704         switch (level) {
00705         case 0:
00706                 if (!decode_printer_info_0(mem_ctx, out.buffer, 1, &ctr->printers_0)) {
00707                         return WERR_GENERAL_FAILURE;
00708                 }
00709                 break;
00710         case 1:
00711                 if (!decode_printer_info_1(mem_ctx, out.buffer, 1, &ctr->printers_1)) {
00712                         return WERR_GENERAL_FAILURE;
00713                 }
00714                 break;
00715         case 2:
00716                 if (!decode_printer_info_2(mem_ctx, out.buffer, 1, &ctr->printers_2)) {
00717                         return WERR_GENERAL_FAILURE;
00718                 }
00719                 break;
00720         case 3:
00721                 if (!decode_printer_info_3(mem_ctx, out.buffer, 1, &ctr->printers_3)) {
00722                         return WERR_GENERAL_FAILURE;
00723                 }
00724                 break;
00725         case 7:
00726                 if (!decode_printer_info_7(mem_ctx, out.buffer, 1, &ctr->printers_7)) {
00727                         return WERR_GENERAL_FAILURE;
00728                 }
00729                 break;
00730         default:
00731                 return WERR_UNKNOWN_LEVEL;
00732         }
00733 
00734         return out.status;
00735 }
00736 
00737 /**********************************************************************
00738 **********************************************************************/
00739 
00740 WERROR rpccli_spoolss_setprinter(struct rpc_pipe_client *cli, TALLOC_CTX *mem_ctx,
00741                               POLICY_HND *pol, uint32 level, 
00742                               PRINTER_INFO_CTR *ctr, uint32 command)
00743 {
00744         prs_struct qbuf, rbuf;
00745         SPOOL_Q_SETPRINTER in;
00746         SPOOL_R_SETPRINTER out;
00747 
00748         ZERO_STRUCT(in);
00749         ZERO_STRUCT(out);
00750 
00751         make_spoolss_q_setprinter( mem_ctx, &in, pol, level, ctr, command );
00752 
00753         CLI_DO_RPC_WERR( cli, mem_ctx, PI_SPOOLSS, SPOOLSS_SETPRINTER,
00754                     in, out, 
00755                     qbuf, rbuf,
00756                     spoolss_io_q_setprinter,
00757                     spoolss_io_r_setprinter, 
00758                     WERR_GENERAL_FAILURE );
00759 
00760         return out.status;
00761 }
00762 
00763 /**********************************************************************
00764 **********************************************************************/
00765 
00766 WERROR rpccli_spoolss_getprinterdriver(struct rpc_pipe_client *cli, 
00767                                     TALLOC_CTX *mem_ctx, 
00768                                     POLICY_HND *pol, uint32 level, 
00769                                     const char *env, int version, PRINTER_DRIVER_CTR *ctr)
00770 {
00771         prs_struct qbuf, rbuf;
00772         SPOOL_Q_GETPRINTERDRIVER2 in;
00773         SPOOL_R_GETPRINTERDRIVER2 out;
00774         RPC_BUFFER buffer;
00775         fstring server;
00776         uint32 offered;
00777 
00778         ZERO_STRUCT(in);
00779         ZERO_STRUCT(out);
00780 
00781         fstrcpy(server, cli->cli->desthost);
00782         strupper_m(server);
00783 
00784         offered = 0;
00785         rpcbuf_init(&buffer, offered, mem_ctx);
00786         make_spoolss_q_getprinterdriver2( &in, pol, env, level, 
00787                 version, 2, &buffer, offered);
00788 
00789         CLI_DO_RPC_WERR( cli, mem_ctx, PI_SPOOLSS, SPOOLSS_GETPRINTERDRIVER2,
00790                     in, out, 
00791                     qbuf, rbuf,
00792                     spoolss_io_q_getprinterdriver2,
00793                     spoolss_io_r_getprinterdriver2, 
00794                     WERR_GENERAL_FAILURE );
00795                     
00796         if ( W_ERROR_EQUAL( out.status, WERR_INSUFFICIENT_BUFFER ) ) {
00797                 offered = out.needed;
00798                 
00799                 ZERO_STRUCT(in);
00800                 ZERO_STRUCT(out);
00801                 
00802                 rpcbuf_init(&buffer, offered, mem_ctx);
00803                 make_spoolss_q_getprinterdriver2( &in, pol, env, level, 
00804                         version, 2, &buffer, offered);
00805 
00806                 CLI_DO_RPC_WERR( cli, mem_ctx, PI_SPOOLSS, SPOOLSS_GETPRINTERDRIVER2,
00807                             in, out, 
00808                             qbuf, rbuf,
00809                             spoolss_io_q_getprinterdriver2,
00810                             spoolss_io_r_getprinterdriver2, 
00811                             WERR_GENERAL_FAILURE );
00812         }
00813                 
00814         if ( !W_ERROR_IS_OK(out.status) )
00815                 return out.status;
00816 
00817         switch (level) {
00818         case 1:
00819                 if (!decode_printer_driver_1(mem_ctx, out.buffer, 1, &ctr->info1)) {
00820                         return WERR_GENERAL_FAILURE;
00821                 }
00822                 break;
00823         case 2:
00824                 if (!decode_printer_driver_2(mem_ctx, out.buffer, 1, &ctr->info2)) {
00825                         return WERR_GENERAL_FAILURE;
00826                 }
00827                 break;
00828         case 3:
00829                 if (!decode_printer_driver_3(mem_ctx, out.buffer, 1, &ctr->info3)) {
00830                         return WERR_GENERAL_FAILURE;
00831                 }
00832                 break;
00833         default:
00834                 return WERR_UNKNOWN_LEVEL;
00835         }
00836 
00837         return out.status;      
00838 }
00839 
00840 /**********************************************************************
00841 **********************************************************************/
00842 
00843 WERROR rpccli_spoolss_enumprinterdrivers (struct rpc_pipe_client *cli, 
00844                                        TALLOC_CTX *mem_ctx,
00845                                        uint32 level, const char *env,
00846                                        uint32 *num_drivers,
00847                                        PRINTER_DRIVER_CTR *ctr)
00848 {
00849         prs_struct qbuf, rbuf;
00850         SPOOL_Q_ENUMPRINTERDRIVERS in;
00851         SPOOL_R_ENUMPRINTERDRIVERS out;
00852         RPC_BUFFER buffer;
00853         fstring server;
00854         uint32 offered;
00855 
00856         ZERO_STRUCT(in);
00857         ZERO_STRUCT(out);
00858 
00859         slprintf(server, sizeof(fstring)-1, "\\\\%s", cli->cli->desthost);
00860         strupper_m(server);
00861 
00862         offered = 0;
00863         rpcbuf_init(&buffer, offered, mem_ctx);
00864         make_spoolss_q_enumprinterdrivers( &in, server, env, level, 
00865                 &buffer, offered);
00866         
00867         CLI_DO_RPC_WERR( cli, mem_ctx, PI_SPOOLSS, SPOOLSS_ENUMPRINTERDRIVERS,
00868                     in, out, 
00869                     qbuf, rbuf,
00870                     spoolss_io_q_enumprinterdrivers,
00871                     spoolss_io_r_enumprinterdrivers, 
00872                     WERR_GENERAL_FAILURE );
00873 
00874         if ( W_ERROR_EQUAL( out.status, WERR_INSUFFICIENT_BUFFER ) ) {
00875                 offered = out.needed;
00876                 
00877                 ZERO_STRUCT(in);
00878                 ZERO_STRUCT(out);
00879                 
00880                 rpcbuf_init(&buffer, offered, mem_ctx);
00881                 make_spoolss_q_enumprinterdrivers( &in, server, env, level, 
00882                         &buffer, offered);
00883         
00884                 CLI_DO_RPC_WERR( cli, mem_ctx, PI_SPOOLSS, SPOOLSS_ENUMPRINTERDRIVERS,
00885                             in, out, 
00886                             qbuf, rbuf,
00887                             spoolss_io_q_enumprinterdrivers,
00888                             spoolss_io_r_enumprinterdrivers, 
00889                             WERR_GENERAL_FAILURE );
00890         }
00891         
00892         *num_drivers = out.returned;
00893 
00894         if ( !W_ERROR_IS_OK(out.status) )
00895                 return out.status;
00896                 
00897         if ( out.returned ) {
00898 
00899                 switch (level) {
00900                 case 1:
00901                         if (!decode_printer_driver_1(mem_ctx, out.buffer, out.returned, &ctr->info1)) {
00902                                 return WERR_GENERAL_FAILURE;
00903                         }
00904                         break;
00905                 case 2:
00906                         if (!decode_printer_driver_2(mem_ctx, out.buffer, out.returned, &ctr->info2)) {
00907                                 return WERR_GENERAL_FAILURE;
00908                         }
00909                         break;
00910                 case 3:
00911                         if (!decode_printer_driver_3(mem_ctx, out.buffer, out.returned, &ctr->info3)) {
00912                                 return WERR_GENERAL_FAILURE;
00913                         }
00914                         break;
00915                 default:
00916                         return WERR_UNKNOWN_LEVEL;
00917                 }
00918         }
00919 
00920         return out.status;
00921 }
00922 
00923 
00924 /**********************************************************************
00925 **********************************************************************/
00926 
00927 WERROR rpccli_spoolss_getprinterdriverdir (struct rpc_pipe_client *cli, 
00928                                         TALLOC_CTX *mem_ctx,
00929                                         uint32 level, char *env,
00930                                         DRIVER_DIRECTORY_CTR *ctr)
00931 {
00932         prs_struct qbuf, rbuf;
00933         SPOOL_Q_GETPRINTERDRIVERDIR in;
00934         SPOOL_R_GETPRINTERDRIVERDIR out;
00935         RPC_BUFFER buffer;
00936         fstring server;
00937         uint32 offered;
00938 
00939         ZERO_STRUCT(in);
00940         ZERO_STRUCT(out);
00941 
00942         slprintf(server, sizeof(fstring)-1, "\\\\%s", cli->cli->desthost);
00943         strupper_m(server);
00944 
00945         offered = 0;
00946         rpcbuf_init(&buffer, offered, mem_ctx);
00947         make_spoolss_q_getprinterdriverdir( &in, server, env, level, 
00948                 &buffer, offered );
00949 
00950         CLI_DO_RPC_WERR( cli, mem_ctx, PI_SPOOLSS, SPOOLSS_GETPRINTERDRIVERDIRECTORY,
00951                     in, out, 
00952                     qbuf, rbuf,
00953                     spoolss_io_q_getprinterdriverdir,
00954                     spoolss_io_r_getprinterdriverdir, 
00955                     WERR_GENERAL_FAILURE );
00956                     
00957         if ( W_ERROR_EQUAL( out.status, WERR_INSUFFICIENT_BUFFER ) ) {
00958                 offered = out.needed;
00959                 
00960                 ZERO_STRUCT(in);
00961                 ZERO_STRUCT(out);
00962                 
00963                 rpcbuf_init(&buffer, offered, mem_ctx);
00964                 make_spoolss_q_getprinterdriverdir( &in, server, env, level, 
00965                         &buffer, offered );
00966 
00967                 CLI_DO_RPC_WERR( cli, mem_ctx, PI_SPOOLSS, SPOOLSS_GETPRINTERDRIVERDIRECTORY,
00968                             in, out, 
00969                             qbuf, rbuf,
00970                             spoolss_io_q_getprinterdriverdir,
00971                             spoolss_io_r_getprinterdriverdir, 
00972                             WERR_GENERAL_FAILURE );
00973         }
00974         
00975         if (!W_ERROR_IS_OK(out.status))
00976                 return out.status;
00977                 
00978         if (!decode_printerdriverdir_1(mem_ctx, out.buffer, 1, &ctr->info1)) {
00979                 return WERR_GENERAL_FAILURE;
00980         }
00981 
00982         return out.status;
00983 }
00984 
00985 /**********************************************************************
00986 **********************************************************************/
00987 
00988 WERROR rpccli_spoolss_addprinterdriver (struct rpc_pipe_client *cli, 
00989                                      TALLOC_CTX *mem_ctx, uint32 level,
00990                                      PRINTER_DRIVER_CTR *ctr)
00991 {
00992         prs_struct qbuf, rbuf;
00993         SPOOL_Q_ADDPRINTERDRIVER in;
00994         SPOOL_R_ADDPRINTERDRIVER out;
00995         fstring server;
00996 
00997         ZERO_STRUCT(in);
00998         ZERO_STRUCT(out);
00999         
01000         slprintf(server, sizeof(fstring)-1, "\\\\%s", cli->cli->desthost);
01001         strupper_m(server);
01002 
01003         make_spoolss_q_addprinterdriver( mem_ctx, &in, server, level, ctr );
01004 
01005         CLI_DO_RPC_WERR( cli, mem_ctx, PI_SPOOLSS, SPOOLSS_ADDPRINTERDRIVER,
01006                     in, out, 
01007                     qbuf, rbuf,
01008                     spoolss_io_q_addprinterdriver,
01009                     spoolss_io_r_addprinterdriver, 
01010                     WERR_GENERAL_FAILURE );
01011 
01012         return out.status;                  
01013 }
01014 
01015 /**********************************************************************
01016 **********************************************************************/
01017 
01018 WERROR rpccli_spoolss_addprinterex (struct rpc_pipe_client *cli, TALLOC_CTX *mem_ctx,
01019                                  uint32 level, PRINTER_INFO_CTR*ctr)
01020 {
01021         prs_struct qbuf, rbuf;
01022         SPOOL_Q_ADDPRINTEREX in;
01023         SPOOL_R_ADDPRINTEREX out;
01024         fstring server, client, user;
01025 
01026         ZERO_STRUCT(in);
01027         ZERO_STRUCT(out);
01028         
01029         slprintf(client, sizeof(fstring)-1, "\\\\%s", global_myname());
01030         slprintf(server, sizeof(fstring)-1, "\\\\%s", cli->cli->desthost);
01031         
01032         strupper_m(client);
01033         strupper_m(server);
01034 
01035         fstrcpy  (user, cli->user_name);
01036 
01037         make_spoolss_q_addprinterex( mem_ctx, &in, server, client, 
01038                 user, level, ctr);
01039 
01040         CLI_DO_RPC_WERR( cli, mem_ctx, PI_SPOOLSS, SPOOLSS_ADDPRINTEREX,
01041                     in, out, 
01042                     qbuf, rbuf,
01043                     spoolss_io_q_addprinterex,
01044                     spoolss_io_r_addprinterex, 
01045                     WERR_GENERAL_FAILURE );
01046 
01047         return out.status;      
01048 }
01049 
01050 /**********************************************************************
01051 **********************************************************************/
01052 
01053 WERROR rpccli_spoolss_deleteprinterdriverex(struct rpc_pipe_client *cli, 
01054                                          TALLOC_CTX *mem_ctx, const char *arch,
01055                                          const char *driver, int version)
01056 {
01057         prs_struct qbuf, rbuf;
01058         SPOOL_Q_DELETEPRINTERDRIVEREX in;
01059         SPOOL_R_DELETEPRINTERDRIVEREX out;
01060         fstring server;
01061 
01062         ZERO_STRUCT(in);
01063         ZERO_STRUCT(out);
01064 
01065         slprintf(server, sizeof(fstring)-1, "\\\\%s", cli->cli->desthost);
01066         strupper_m(server);
01067 
01068         make_spoolss_q_deleteprinterdriverex( mem_ctx, &in, server, arch, driver, version );
01069 
01070         CLI_DO_RPC_WERR( cli, mem_ctx, PI_SPOOLSS, SPOOLSS_DELETEPRINTERDRIVEREX,
01071                     in, out, 
01072                     qbuf, rbuf,
01073                     spoolss_io_q_deleteprinterdriverex,
01074                     spoolss_io_r_deleteprinterdriverex, 
01075                     WERR_GENERAL_FAILURE );
01076                     
01077         return out.status;      
01078 }
01079 
01080 /**********************************************************************
01081 **********************************************************************/
01082 
01083 WERROR rpccli_spoolss_deleteprinterdriver (struct rpc_pipe_client *cli, 
01084                                         TALLOC_CTX *mem_ctx, const char *arch,
01085                                         const char *driver)
01086 {
01087         prs_struct qbuf, rbuf;
01088         SPOOL_Q_DELETEPRINTERDRIVER in;
01089         SPOOL_R_DELETEPRINTERDRIVER out;
01090         fstring server;
01091 
01092         ZERO_STRUCT(in);
01093         ZERO_STRUCT(out);
01094 
01095         slprintf(server, sizeof(fstring)-1, "\\\\%s", cli->cli->desthost);
01096         strupper_m(server);
01097 
01098         make_spoolss_q_deleteprinterdriver( mem_ctx, &in, server, arch, driver );
01099 
01100         CLI_DO_RPC_WERR( cli, mem_ctx, PI_SPOOLSS, SPOOLSS_DELETEPRINTERDRIVER,
01101                     in, out, 
01102                     qbuf, rbuf,
01103                     spoolss_io_q_deleteprinterdriver,
01104                     spoolss_io_r_deleteprinterdriver, 
01105                     WERR_GENERAL_FAILURE );
01106                     
01107         return out.status;      
01108 }
01109 
01110 /**********************************************************************
01111 **********************************************************************/
01112 
01113 WERROR rpccli_spoolss_getprintprocessordirectory(struct rpc_pipe_client *cli,
01114                                               TALLOC_CTX *mem_ctx,
01115                                               char *name, char *environment,
01116                                               fstring procdir)
01117 {
01118         prs_struct qbuf, rbuf;
01119         SPOOL_Q_GETPRINTPROCESSORDIRECTORY in;
01120         SPOOL_R_GETPRINTPROCESSORDIRECTORY out;
01121         int level = 1;
01122         RPC_BUFFER buffer;
01123         uint32 offered;
01124 
01125         ZERO_STRUCT(in);
01126         ZERO_STRUCT(out);
01127 
01128         offered = 0;
01129         rpcbuf_init(&buffer, offered, mem_ctx);
01130         make_spoolss_q_getprintprocessordirectory( &in, name, 
01131                 environment, level, &buffer, offered );
01132 
01133         CLI_DO_RPC_WERR( cli, mem_ctx, PI_SPOOLSS, SPOOLSS_GETPRINTPROCESSORDIRECTORY,
01134                     in, out, 
01135                     qbuf, rbuf,
01136                     spoolss_io_q_getprintprocessordirectory,
01137                     spoolss_io_r_getprintprocessordirectory, 
01138                     WERR_GENERAL_FAILURE );
01139                     
01140         if ( W_ERROR_EQUAL( out.status, WERR_INSUFFICIENT_BUFFER ) ) {
01141                 offered = out.needed;
01142                 
01143                 ZERO_STRUCT(in);
01144                 ZERO_STRUCT(out);
01145                 
01146                 rpcbuf_init(&buffer, offered, mem_ctx);
01147                 make_spoolss_q_getprintprocessordirectory( &in, name, 
01148                         environment, level, &buffer, offered );
01149 
01150                 CLI_DO_RPC_WERR( cli, mem_ctx, PI_SPOOLSS, SPOOLSS_GETPRINTPROCESSORDIRECTORY,
01151                             in, out, 
01152                             qbuf, rbuf,
01153                             spoolss_io_q_getprintprocessordirectory,
01154                             spoolss_io_r_getprintprocessordirectory, 
01155                             WERR_GENERAL_FAILURE );
01156         }
01157         
01158         if ( !W_ERROR_IS_OK(out.status) )
01159                 return out.status;
01160         
01161         fstrcpy(procdir, "Not implemented!");
01162         
01163         return out.status;
01164 }
01165 
01166 /**********************************************************************
01167 **********************************************************************/
01168 
01169 WERROR rpccli_spoolss_addform(struct rpc_pipe_client *cli, TALLOC_CTX *mem_ctx,
01170                            POLICY_HND *handle, uint32 level, FORM *form)
01171 {
01172         prs_struct qbuf, rbuf;
01173         SPOOL_Q_ADDFORM in;
01174         SPOOL_R_ADDFORM out;
01175 
01176         ZERO_STRUCT(in);
01177         ZERO_STRUCT(out);
01178 
01179         make_spoolss_q_addform( &in, handle, level, form );
01180         
01181         CLI_DO_RPC_WERR( cli, mem_ctx, PI_SPOOLSS, SPOOLSS_ADDFORM,
01182                     in, out, 
01183                     qbuf, rbuf,
01184                     spoolss_io_q_addform,
01185                     spoolss_io_r_addform, 
01186                     WERR_GENERAL_FAILURE );
01187 
01188         return out.status;
01189 }
01190 
01191 /**********************************************************************
01192 **********************************************************************/
01193 
01194 WERROR rpccli_spoolss_setform(struct rpc_pipe_client *cli, TALLOC_CTX *mem_ctx,
01195                            POLICY_HND *handle, uint32 level, 
01196                            const char *form_name, FORM *form)
01197 {
01198         prs_struct qbuf, rbuf;
01199         SPOOL_Q_SETFORM in;
01200         SPOOL_R_SETFORM out;
01201 
01202         ZERO_STRUCT(in);
01203         ZERO_STRUCT(out);
01204 
01205         make_spoolss_q_setform( &in, handle, level, form_name, form );
01206         
01207         CLI_DO_RPC_WERR( cli, mem_ctx, PI_SPOOLSS, SPOOLSS_SETFORM,
01208                     in, out, 
01209                     qbuf, rbuf,
01210                     spoolss_io_q_setform,
01211                     spoolss_io_r_setform, 
01212                     WERR_GENERAL_FAILURE );
01213 
01214         return out.status;
01215 }
01216 
01217 /**********************************************************************
01218 **********************************************************************/
01219 
01220 WERROR rpccli_spoolss_getform(struct rpc_pipe_client *cli, TALLOC_CTX *mem_ctx,
01221                            POLICY_HND *handle, const char *formname, 
01222                            uint32 level, FORM_1 *form)
01223 {
01224         prs_struct qbuf, rbuf;
01225         SPOOL_Q_GETFORM in;
01226         SPOOL_R_GETFORM out;
01227         RPC_BUFFER buffer;
01228         uint32 offered;
01229 
01230         ZERO_STRUCT(in);
01231         ZERO_STRUCT(out);
01232 
01233         offered = 0;
01234         rpcbuf_init(&buffer, offered, mem_ctx);
01235         make_spoolss_q_getform( &in, handle, formname, level, &buffer, offered );
01236         
01237         CLI_DO_RPC_WERR( cli, mem_ctx, PI_SPOOLSS, SPOOLSS_GETFORM,
01238                     in, out, 
01239                     qbuf, rbuf,
01240                     spoolss_io_q_getform,
01241                     spoolss_io_r_getform, 
01242                     WERR_GENERAL_FAILURE );
01243                     
01244         if ( W_ERROR_EQUAL( out.status, WERR_INSUFFICIENT_BUFFER ) ) {
01245                 offered = out.needed;
01246                 
01247                 ZERO_STRUCT(in);
01248                 ZERO_STRUCT(out);
01249                 
01250                 rpcbuf_init(&buffer, offered, mem_ctx);
01251                 make_spoolss_q_getform( &in, handle, formname, level, &buffer, offered );
01252         
01253                 CLI_DO_RPC_WERR( cli, mem_ctx, PI_SPOOLSS, SPOOLSS_GETFORM,
01254                             in, out, 
01255                             qbuf, rbuf,
01256                             spoolss_io_q_getform,
01257                             spoolss_io_r_getform, 
01258                             WERR_GENERAL_FAILURE );
01259         }
01260         
01261         if (!W_ERROR_IS_OK(out.status))
01262                 return out.status;
01263 
01264         if (!smb_io_form_1("", out.buffer, form, 0)) {
01265                 return WERR_GENERAL_FAILURE;
01266         }
01267 
01268         return out.status;
01269 }
01270 
01271 /**********************************************************************
01272 **********************************************************************/
01273 
01274 WERROR rpccli_spoolss_deleteform(struct rpc_pipe_client *cli, TALLOC_CTX *mem_ctx,
01275                               POLICY_HND *handle, const char *form_name)
01276 {
01277         prs_struct qbuf, rbuf;
01278         SPOOL_Q_DELETEFORM in;
01279         SPOOL_R_DELETEFORM out;
01280 
01281         ZERO_STRUCT(in);
01282         ZERO_STRUCT(out);
01283 
01284         make_spoolss_q_deleteform( &in, handle, form_name );
01285         
01286         CLI_DO_RPC_WERR( cli, mem_ctx, PI_SPOOLSS, SPOOLSS_DELETEFORM,
01287                     in, out, 
01288                     qbuf, rbuf,
01289                     spoolss_io_q_deleteform,
01290                     spoolss_io_r_deleteform, 
01291                     WERR_GENERAL_FAILURE );
01292                     
01293         return out.status;
01294 }
01295 
01296 /**********************************************************************
01297 **********************************************************************/
01298 
01299 WERROR rpccli_spoolss_enumforms(struct rpc_pipe_client *cli, TALLOC_CTX *mem_ctx,
01300                              POLICY_HND *handle, int level, uint32 *num_forms,
01301                              FORM_1 **forms)
01302 {
01303         prs_struct qbuf, rbuf;
01304         SPOOL_Q_ENUMFORMS in;
01305         SPOOL_R_ENUMFORMS out;
01306         RPC_BUFFER buffer;
01307         uint32 offered;
01308 
01309         ZERO_STRUCT(in);
01310         ZERO_STRUCT(out);
01311 
01312         offered = 0;
01313         rpcbuf_init(&buffer, offered, mem_ctx);
01314         make_spoolss_q_enumforms( &in, handle, level, &buffer, offered );
01315 
01316         CLI_DO_RPC_WERR( cli, mem_ctx, PI_SPOOLSS, SPOOLSS_ENUMFORMS,
01317                     in, out, 
01318                     qbuf, rbuf,
01319                     spoolss_io_q_enumforms,
01320                     spoolss_io_r_enumforms, 
01321                     WERR_GENERAL_FAILURE );
01322 
01323         if ( W_ERROR_EQUAL( out.status, WERR_INSUFFICIENT_BUFFER ) ) {
01324                 offered = out.needed;
01325                 
01326                 ZERO_STRUCT(in);
01327                 ZERO_STRUCT(out);
01328 
01329                 rpcbuf_init(&buffer, offered, mem_ctx);
01330                 make_spoolss_q_enumforms( &in, handle, level, &buffer, offered );
01331 
01332                 CLI_DO_RPC_WERR( cli, mem_ctx, PI_SPOOLSS, SPOOLSS_ENUMFORMS,
01333                             in, out, 
01334                             qbuf, rbuf,
01335                             spoolss_io_q_enumforms,
01336                             spoolss_io_r_enumforms, 
01337                             WERR_GENERAL_FAILURE );
01338         }
01339 
01340         if (!W_ERROR_IS_OK(out.status))
01341                 return out.status;
01342 
01343         *num_forms = out.numofforms;
01344         
01345         if (!decode_forms_1(mem_ctx, out.buffer, *num_forms, forms)) {
01346                 return WERR_GENERAL_FAILURE;
01347         }
01348 
01349         return out.status;
01350 }
01351 
01352 /**********************************************************************
01353 **********************************************************************/
01354 
01355 WERROR rpccli_spoolss_enumjobs(struct rpc_pipe_client *cli, TALLOC_CTX *mem_ctx,
01356                             POLICY_HND *hnd, uint32 level, uint32 firstjob, 
01357                             uint32 num_jobs, uint32 *returned, JOB_INFO_CTR *ctr)
01358 {
01359         prs_struct qbuf, rbuf;
01360         SPOOL_Q_ENUMJOBS in;
01361         SPOOL_R_ENUMJOBS out;
01362         RPC_BUFFER buffer;
01363         uint32 offered;
01364 
01365         ZERO_STRUCT(in);
01366         ZERO_STRUCT(out);
01367 
01368         offered = 0;
01369         rpcbuf_init(&buffer, offered, mem_ctx);
01370         make_spoolss_q_enumjobs( &in, hnd, firstjob, num_jobs, level, 
01371                 &buffer, offered );
01372 
01373         CLI_DO_RPC_WERR( cli, mem_ctx, PI_SPOOLSS, SPOOLSS_ENUMJOBS,
01374                     in, out, 
01375                     qbuf, rbuf,
01376                     spoolss_io_q_enumjobs,
01377                     spoolss_io_r_enumjobs, 
01378                     WERR_GENERAL_FAILURE );
01379 
01380         if ( W_ERROR_EQUAL( out.status, WERR_INSUFFICIENT_BUFFER ) ) {
01381                 offered = out.needed;
01382                 
01383                 ZERO_STRUCT(in);
01384                 ZERO_STRUCT(out);
01385 
01386                 rpcbuf_init(&buffer, offered, mem_ctx);
01387                 make_spoolss_q_enumjobs( &in, hnd, firstjob, num_jobs, level, 
01388                         &buffer, offered );
01389 
01390                 CLI_DO_RPC_WERR( cli, mem_ctx, PI_SPOOLSS, SPOOLSS_ENUMJOBS,
01391                             in, out, 
01392                             qbuf, rbuf,
01393                             spoolss_io_q_enumjobs,
01394                             spoolss_io_r_enumjobs, 
01395                             WERR_GENERAL_FAILURE );
01396         }
01397 
01398         if (!W_ERROR_IS_OK(out.status))
01399                 return out.status;
01400                 
01401         switch(level) {
01402         case 1:
01403                 if (!decode_jobs_1(mem_ctx, out.buffer, out.returned, &ctr->job.job_info_1)) {
01404                         return WERR_GENERAL_FAILURE;
01405                 }
01406                 break;
01407         case 2:
01408                 if (!decode_jobs_2(mem_ctx, out.buffer, out.returned, &ctr->job.job_info_2)) {
01409                         return WERR_GENERAL_FAILURE;
01410                 }
01411                 break;
01412         default:
01413                 DEBUG(3, ("unsupported info level %d", level));
01414                 return WERR_UNKNOWN_LEVEL;
01415         }
01416         
01417         *returned = out.returned;
01418 
01419         return out.status;
01420 }
01421 
01422 /**********************************************************************
01423 **********************************************************************/
01424 
01425 WERROR rpccli_spoolss_setjob(struct rpc_pipe_client *cli, TALLOC_CTX *mem_ctx,
01426                           POLICY_HND *hnd, uint32 jobid, uint32 level, 
01427                           uint32 command)
01428 {
01429         prs_struct qbuf, rbuf;
01430         SPOOL_Q_SETJOB in;
01431         SPOOL_R_SETJOB out;
01432 
01433         ZERO_STRUCT(in);
01434         ZERO_STRUCT(out);
01435 
01436         make_spoolss_q_setjob( &in, hnd, jobid, level, command );
01437 
01438         CLI_DO_RPC_WERR( cli, mem_ctx, PI_SPOOLSS, SPOOLSS_SETJOB,
01439                     in, out, 
01440                     qbuf, rbuf,
01441                     spoolss_io_q_setjob,
01442                     spoolss_io_r_setjob, 
01443                     WERR_GENERAL_FAILURE );
01444                     
01445         return out.status;
01446 }
01447 
01448 /**********************************************************************
01449 **********************************************************************/
01450 
01451 WERROR rpccli_spoolss_getjob(struct rpc_pipe_client *cli, TALLOC_CTX *mem_ctx,
01452                           POLICY_HND *hnd, uint32 jobid, uint32 level,
01453                           JOB_INFO_CTR *ctr)
01454 {
01455         prs_struct qbuf, rbuf;
01456         SPOOL_Q_GETJOB in;
01457         SPOOL_R_GETJOB out;
01458         RPC_BUFFER buffer;
01459         uint32 offered;
01460 
01461         ZERO_STRUCT(in);
01462         ZERO_STRUCT(out);
01463 
01464         offered = 0;
01465         rpcbuf_init(&buffer, offered, mem_ctx);
01466         make_spoolss_q_getjob( &in, hnd, jobid, level, &buffer, offered );
01467 
01468         CLI_DO_RPC_WERR( cli, mem_ctx, PI_SPOOLSS, SPOOLSS_GETJOB,
01469                     in, out, 
01470                     qbuf, rbuf,
01471                     spoolss_io_q_getjob,
01472                     spoolss_io_r_getjob, 
01473                     WERR_GENERAL_FAILURE );
01474 
01475         if ( W_ERROR_EQUAL( out.status, WERR_MORE_DATA ) ) {
01476                 offered = out.needed;
01477                 
01478                 ZERO_STRUCT(in);
01479                 ZERO_STRUCT(out);
01480                 
01481                 rpcbuf_init(&buffer, offered, mem_ctx);
01482                 make_spoolss_q_getjob( &in, hnd, jobid, level, &buffer, offered );
01483 
01484                 CLI_DO_RPC_WERR( cli, mem_ctx, PI_SPOOLSS, SPOOLSS_GETJOB,
01485                             in, out, 
01486                             qbuf, rbuf,
01487                             spoolss_io_q_getjob,
01488                             spoolss_io_r_getjob, 
01489                             WERR_GENERAL_FAILURE );
01490         }
01491 
01492         if (!W_ERROR_IS_OK(out.status))
01493                 return out.status;
01494 
01495         switch(level) {
01496         case 1:
01497                 if (!decode_jobs_1(mem_ctx, out.buffer, 1, &ctr->job.job_info_1)) {
01498                         return WERR_GENERAL_FAILURE;
01499                 }
01500                 break;
01501         case 2:
01502                 if (!decode_jobs_2(mem_ctx, out.buffer, 1, &ctr->job.job_info_2)) {
01503                         return WERR_GENERAL_FAILURE;
01504                 }
01505                 break;
01506         default:
01507                 return WERR_UNKNOWN_LEVEL;
01508         }
01509 
01510         return out.status;
01511 }
01512 
01513 /**********************************************************************
01514 **********************************************************************/
01515 
01516 WERROR rpccli_spoolss_startpageprinter(struct rpc_pipe_client *cli, TALLOC_CTX *mem_ctx,
01517                                     POLICY_HND *hnd)
01518 {
01519         prs_struct qbuf, rbuf;
01520         SPOOL_Q_STARTPAGEPRINTER in;
01521         SPOOL_R_STARTPAGEPRINTER out;
01522 
01523         ZERO_STRUCT(in);
01524         ZERO_STRUCT(out);
01525 
01526         make_spoolss_q_startpageprinter( &in, hnd );
01527 
01528         CLI_DO_RPC_WERR( cli, mem_ctx, PI_SPOOLSS, SPOOLSS_STARTPAGEPRINTER,
01529                     in, out, 
01530                     qbuf, rbuf,
01531                     spoolss_io_q_startpageprinter,
01532                     spoolss_io_r_startpageprinter, 
01533                     WERR_GENERAL_FAILURE );
01534                     
01535         return out.status;
01536 }
01537 
01538 /**********************************************************************
01539 **********************************************************************/
01540 
01541 WERROR rpccli_spoolss_endpageprinter(struct rpc_pipe_client *cli, TALLOC_CTX *mem_ctx,
01542                                   POLICY_HND *hnd)
01543 {
01544         prs_struct qbuf, rbuf;
01545         SPOOL_Q_ENDPAGEPRINTER in;
01546         SPOOL_R_ENDPAGEPRINTER out;
01547 
01548         ZERO_STRUCT(in);
01549         ZERO_STRUCT(out);
01550 
01551         make_spoolss_q_endpageprinter( &in, hnd );
01552 
01553         CLI_DO_RPC_WERR( cli, mem_ctx, PI_SPOOLSS, SPOOLSS_ENDPAGEPRINTER,
01554                     in, out, 
01555                     qbuf, rbuf,
01556                     spoolss_io_q_endpageprinter,
01557                     spoolss_io_r_endpageprinter, 
01558                     WERR_GENERAL_FAILURE );
01559                     
01560         return out.status;
01561 }
01562 
01563 /**********************************************************************
01564 **********************************************************************/
01565 
01566 WERROR rpccli_spoolss_startdocprinter(struct rpc_pipe_client *cli, TALLOC_CTX *mem_ctx,
01567                                    POLICY_HND *hnd, char *docname, 
01568                                    char *outputfile, char *datatype, 
01569                                    uint32 *jobid)
01570 {
01571         prs_struct qbuf, rbuf;
01572         SPOOL_Q_STARTDOCPRINTER in;
01573         SPOOL_R_STARTDOCPRINTER out;
01574         uint32 level = 1;
01575 
01576         ZERO_STRUCT(in);
01577         ZERO_STRUCT(out);
01578 
01579         make_spoolss_q_startdocprinter( &in, hnd, level, docname, 
01580                 outputfile, datatype );
01581 
01582         CLI_DO_RPC_WERR( cli, mem_ctx, PI_SPOOLSS, SPOOLSS_STARTDOCPRINTER,
01583                     in, out, 
01584                     qbuf, rbuf,
01585                     spoolss_io_q_startdocprinter,
01586                     spoolss_io_r_startdocprinter, 
01587                     WERR_GENERAL_FAILURE );
01588 
01589         *jobid = out.jobid;
01590 
01591         return out.status;
01592 }
01593 
01594 /**********************************************************************
01595 **********************************************************************/
01596 
01597 WERROR rpccli_spoolss_enddocprinter(struct rpc_pipe_client *cli, TALLOC_CTX *mem_ctx,
01598                                   POLICY_HND *hnd)
01599 {
01600         prs_struct qbuf, rbuf;
01601         SPOOL_Q_ENDDOCPRINTER in;
01602         SPOOL_R_ENDDOCPRINTER out;
01603 
01604         ZERO_STRUCT(in);
01605         ZERO_STRUCT(out);
01606 
01607         make_spoolss_q_enddocprinter( &in, hnd );
01608 
01609         CLI_DO_RPC_WERR( cli, mem_ctx, PI_SPOOLSS, SPOOLSS_ENDDOCPRINTER,
01610                     in, out, 
01611                     qbuf, rbuf,
01612                     spoolss_io_q_enddocprinter,
01613                     spoolss_io_r_enddocprinter, 
01614                     WERR_GENERAL_FAILURE );
01615                     
01616         return out.status;
01617 }
01618 
01619 /**********************************************************************
01620 **********************************************************************/
01621 
01622 WERROR rpccli_spoolss_getprinterdata(struct rpc_pipe_client *cli, TALLOC_CTX *mem_ctx,
01623                                   POLICY_HND *hnd, const char *valuename, 
01624                                   REGISTRY_VALUE *value)
01625 {
01626         prs_struct qbuf, rbuf;
01627         SPOOL_Q_GETPRINTERDATA in;
01628         SPOOL_R_GETPRINTERDATA out;
01629         uint32 offered;
01630 
01631         ZERO_STRUCT(in);
01632         ZERO_STRUCT(out);
01633 
01634         offered = 0;
01635         make_spoolss_q_getprinterdata( &in, hnd, valuename, offered );
01636 
01637         CLI_DO_RPC_WERR( cli, mem_ctx, PI_SPOOLSS, SPOOLSS_GETPRINTERDATA,
01638                     in, out, 
01639                     qbuf, rbuf,
01640                     spoolss_io_q_getprinterdata,
01641                     spoolss_io_r_getprinterdata, 
01642                     WERR_GENERAL_FAILURE );
01643 
01644         if ( W_ERROR_EQUAL( out.status, WERR_MORE_DATA ) ) {
01645                 offered = out.needed;
01646                 
01647                 ZERO_STRUCT(in);
01648                 ZERO_STRUCT(out);
01649                 
01650                 make_spoolss_q_getprinterdata( &in, hnd, valuename, offered );
01651 
01652                 CLI_DO_RPC_WERR( cli, mem_ctx, PI_SPOOLSS, SPOOLSS_GETPRINTERDATA,
01653                             in, out, 
01654                             qbuf, rbuf,
01655                             spoolss_io_q_getprinterdata,
01656                             spoolss_io_r_getprinterdata, 
01657                             WERR_GENERAL_FAILURE );
01658         }
01659 
01660         if (!W_ERROR_IS_OK(out.status))
01661                 return out.status;      
01662 
01663         /* Return output parameters */
01664 
01665         if (out.needed) {
01666                 value->data_p = (uint8 *)TALLOC_MEMDUP(mem_ctx, out.data, out.needed);
01667         } else {
01668                 value->data_p = NULL;
01669         }
01670         value->type = out.type;
01671         value->size = out.size;
01672 
01673         return out.status;
01674 }
01675 
01676 /**********************************************************************
01677 **********************************************************************/
01678 
01679 WERROR rpccli_spoolss_getprinterdataex(struct rpc_pipe_client *cli, TALLOC_CTX *mem_ctx,
01680                                     POLICY_HND *hnd, const char *keyname, 
01681                                     const char *valuename, 
01682                                     REGISTRY_VALUE *value)
01683 {
01684         prs_struct qbuf, rbuf;
01685         SPOOL_Q_GETPRINTERDATAEX in;
01686         SPOOL_R_GETPRINTERDATAEX out;
01687         uint32 offered = 0;
01688 
01689         ZERO_STRUCT(in);
01690         ZERO_STRUCT(out);
01691 
01692         make_spoolss_q_getprinterdataex( &in, hnd, keyname, valuename, offered );
01693 
01694         CLI_DO_RPC_WERR( cli, mem_ctx, PI_SPOOLSS, SPOOLSS_GETPRINTERDATAEX,
01695                     in, out, 
01696                     qbuf, rbuf,
01697                     spoolss_io_q_getprinterdataex,
01698                     spoolss_io_r_getprinterdataex, 
01699                     WERR_GENERAL_FAILURE );
01700 
01701         if ( W_ERROR_EQUAL( out.status, WERR_MORE_DATA ) ) {
01702                 offered = out.needed;
01703                 
01704                 ZERO_STRUCT(in);
01705                 ZERO_STRUCT(out);
01706                 
01707                 make_spoolss_q_getprinterdataex( &in, hnd, keyname, valuename, offered );
01708 
01709                 CLI_DO_RPC_WERR( cli, mem_ctx, PI_SPOOLSS, SPOOLSS_GETPRINTERDATAEX,
01710                             in, out, 
01711                             qbuf, rbuf,
01712                             spoolss_io_q_getprinterdataex,
01713                             spoolss_io_r_getprinterdataex, 
01714                             WERR_GENERAL_FAILURE );
01715         }
01716 
01717         if (!W_ERROR_IS_OK(out.status))
01718                 return out.status;      
01719 
01720         /* Return output parameters */
01721 
01722         if (out.needed) {
01723                 value->data_p = (uint8 *)TALLOC_MEMDUP(mem_ctx, out.data, out.needed);
01724         } else {
01725                 value->data_p = NULL;
01726         }
01727         value->type = out.type;
01728         value->size = out.needed;
01729         
01730         return out.status;
01731 }
01732 
01733 /**********************************************************************
01734 **********************************************************************/
01735 
01736 WERROR rpccli_spoolss_setprinterdata(struct rpc_pipe_client *cli, TALLOC_CTX *mem_ctx,
01737                                   POLICY_HND *hnd, REGISTRY_VALUE *value)
01738 {
01739         prs_struct qbuf, rbuf;
01740         SPOOL_Q_SETPRINTERDATA in;
01741         SPOOL_R_SETPRINTERDATA out;
01742 
01743         ZERO_STRUCT(in);
01744         ZERO_STRUCT(out);
01745 
01746         make_spoolss_q_setprinterdata( &in, hnd, value->valuename, 
01747                 value->type, (char *)value->data_p, value->size);
01748 
01749         CLI_DO_RPC_WERR( cli, mem_ctx, PI_SPOOLSS, SPOOLSS_SETPRINTERDATA,
01750                     in, out, 
01751                     qbuf, rbuf,
01752                     spoolss_io_q_setprinterdata,
01753                     spoolss_io_r_setprinterdata, 
01754                     WERR_GENERAL_FAILURE );
01755                     
01756         return out.status;
01757 }
01758 
01759 /**********************************************************************
01760 **********************************************************************/
01761 
01762 WERROR rpccli_spoolss_setprinterdataex(struct rpc_pipe_client *cli, TALLOC_CTX *mem_ctx,
01763                                     POLICY_HND *hnd, char *keyname, 
01764                                     REGISTRY_VALUE *value)
01765 {
01766         prs_struct qbuf, rbuf;
01767         SPOOL_Q_SETPRINTERDATAEX in;
01768         SPOOL_R_SETPRINTERDATAEX out;
01769         
01770         ZERO_STRUCT(in);
01771         ZERO_STRUCT(out);
01772 
01773         make_spoolss_q_setprinterdataex( &in, hnd, keyname, value->valuename, 
01774                 value->type, (char *)value->data_p, value->size);
01775 
01776         CLI_DO_RPC_WERR( cli, mem_ctx, PI_SPOOLSS, SPOOLSS_SETPRINTERDATAEX,
01777                     in, out, 
01778                     qbuf, rbuf,
01779                     spoolss_io_q_setprinterdataex,
01780                     spoolss_io_r_setprinterdataex, 
01781                     WERR_GENERAL_FAILURE );
01782 
01783         return out.status;
01784 }
01785 
01786 /**********************************************************************
01787 **********************************************************************/
01788 
01789 WERROR rpccli_spoolss_enumprinterdata(struct rpc_pipe_client *cli, TALLOC_CTX *mem_ctx,
01790                                    POLICY_HND *hnd, uint32 ndx,
01791                                    uint32 value_offered, uint32 data_offered,
01792                                    uint32 *value_needed, uint32 *data_needed,
01793                                    REGISTRY_VALUE *value)
01794 {
01795         prs_struct qbuf, rbuf;
01796         SPOOL_Q_ENUMPRINTERDATA in;
01797         SPOOL_R_ENUMPRINTERDATA out;
01798 
01799         ZERO_STRUCT(in);
01800         ZERO_STRUCT(out);
01801 
01802         make_spoolss_q_enumprinterdata( &in, hnd, ndx, value_offered, data_offered );
01803 
01804         CLI_DO_RPC_WERR( cli, mem_ctx, PI_SPOOLSS, SPOOLSS_ENUMPRINTERDATA,
01805                     in, out, 
01806                     qbuf, rbuf,
01807                     spoolss_io_q_enumprinterdata,
01808                     spoolss_io_r_enumprinterdata, 
01809                     WERR_GENERAL_FAILURE );
01810 
01811         if ( value_needed )
01812                 *value_needed = out.realvaluesize;
01813         if ( data_needed )
01814                 *data_needed = out.realdatasize;
01815                 
01816         if (!W_ERROR_IS_OK(out.status))
01817                 return out.status;
01818 
01819         if (value) {
01820                 rpcstr_pull(value->valuename, out.value, sizeof(value->valuename), -1,
01821                             STR_TERMINATE);
01822                 if (out.realdatasize) {
01823                         value->data_p = (uint8 *)TALLOC_MEMDUP(mem_ctx, out.data,
01824                                                        out.realdatasize);
01825                 } else {
01826                         value->data_p = NULL;
01827                 }
01828                 value->type = out.type;
01829                 value->size = out.realdatasize;
01830         }
01831         
01832         return out.status;
01833 }
01834 
01835 /**********************************************************************
01836 **********************************************************************/
01837 
01838 WERROR rpccli_spoolss_enumprinterdataex(struct rpc_pipe_client *cli, TALLOC_CTX *mem_ctx,
01839                                      POLICY_HND *hnd, const char *keyname, 
01840                                      REGVAL_CTR *ctr)
01841 {
01842         prs_struct qbuf, rbuf;
01843         SPOOL_Q_ENUMPRINTERDATAEX in;
01844         SPOOL_R_ENUMPRINTERDATAEX out;
01845         int i;
01846         uint32 offered;
01847 
01848         ZERO_STRUCT(in);
01849         ZERO_STRUCT(out);
01850 
01851         offered = 0;
01852         make_spoolss_q_enumprinterdataex( &in, hnd, keyname, offered );
01853 
01854         CLI_DO_RPC_WERR( cli, mem_ctx, PI_SPOOLSS, SPOOLSS_ENUMPRINTERDATAEX,
01855                     in, out, 
01856                     qbuf, rbuf,
01857                     spoolss_io_q_enumprinterdataex,
01858                     spoolss_io_r_enumprinterdataex, 
01859                     WERR_GENERAL_FAILURE );
01860 
01861         if ( W_ERROR_EQUAL( out.status, WERR_MORE_DATA ) ) {
01862                 offered = out.needed;
01863                 
01864                 ZERO_STRUCT(in);
01865                 ZERO_STRUCT(out);
01866                 
01867                 make_spoolss_q_enumprinterdataex( &in, hnd, keyname, offered );
01868 
01869                 CLI_DO_RPC_WERR( cli, mem_ctx, PI_SPOOLSS, SPOOLSS_ENUMPRINTERDATAEX,
01870                             in, out, 
01871                             qbuf, rbuf,
01872                             spoolss_io_q_enumprinterdataex,
01873                             spoolss_io_r_enumprinterdataex, 
01874                             WERR_GENERAL_FAILURE );
01875         }
01876         
01877         if (!W_ERROR_IS_OK(out.status))
01878                 return out.status;
01879 
01880         for (i = 0; i < out.returned; i++) {
01881                 PRINTER_ENUM_VALUES *v = &out.ctr.values[i];
01882                 fstring name;
01883 
01884                 rpcstr_pull(name, v->valuename.buffer, sizeof(name), -1, 
01885                             STR_TERMINATE);
01886                 regval_ctr_addvalue(ctr, name, v->type, (const char *)v->data, v->data_len);
01887         }
01888 
01889         return out.status;
01890 }
01891 
01892 /**********************************************************************
01893 **********************************************************************/
01894 
01895 WERROR rpccli_spoolss_writeprinter(struct rpc_pipe_client *cli, TALLOC_CTX *mem_ctx,
01896                                 POLICY_HND *hnd, uint32 data_size, char *data,
01897                                 uint32 *num_written)
01898 {
01899         prs_struct qbuf, rbuf;
01900         SPOOL_Q_WRITEPRINTER in;
01901         SPOOL_R_WRITEPRINTER out;
01902 
01903         ZERO_STRUCT(in);
01904         ZERO_STRUCT(out);
01905 
01906         make_spoolss_q_writeprinter( &in, hnd, data_size, data );
01907 
01908         CLI_DO_RPC_WERR( cli, mem_ctx, PI_SPOOLSS, SPOOLSS_WRITEPRINTER,
01909                     in, out, 
01910                     qbuf, rbuf,
01911                     spoolss_io_q_writeprinter,
01912                     spoolss_io_r_writeprinter, 
01913                     WERR_GENERAL_FAILURE );
01914                     
01915         if (num_written)
01916                 *num_written = out.buffer_written;
01917                 
01918         return out.status;
01919 }
01920 
01921 /**********************************************************************
01922 **********************************************************************/
01923 
01924 WERROR rpccli_spoolss_deleteprinterdata(struct rpc_pipe_client *cli, TALLOC_CTX *mem_ctx,
01925                                      POLICY_HND *hnd, char *valuename)
01926 {
01927         prs_struct qbuf, rbuf;
01928         SPOOL_Q_DELETEPRINTERDATA in;
01929         SPOOL_R_DELETEPRINTERDATA out;
01930 
01931         ZERO_STRUCT(in);
01932         ZERO_STRUCT(out);
01933 
01934         make_spoolss_q_deleteprinterdata( &in, hnd, valuename );
01935 
01936         CLI_DO_RPC_WERR( cli, mem_ctx, PI_SPOOLSS, SPOOLSS_DELETEPRINTERDATA,
01937                     in, out, 
01938                     qbuf, rbuf,
01939                     spoolss_io_q_deleteprinterdata,
01940                     spoolss_io_r_deleteprinterdata, 
01941                     WERR_GENERAL_FAILURE );
01942 
01943         return out.status;
01944 }
01945 
01946 /**********************************************************************
01947 **********************************************************************/
01948 
01949 WERROR rpccli_spoolss_deleteprinterdataex(struct rpc_pipe_client *cli, TALLOC_CTX *mem_ctx,
01950                                        POLICY_HND *hnd, char *keyname, 
01951                                        char *valuename)
01952 {
01953         prs_struct qbuf, rbuf;
01954         SPOOL_Q_DELETEPRINTERDATAEX in;
01955         SPOOL_R_DELETEPRINTERDATAEX out;
01956 
01957         ZERO_STRUCT(in);
01958         ZERO_STRUCT(out);
01959 
01960         make_spoolss_q_deleteprinterdataex( &in, hnd, keyname, valuename );
01961 
01962         CLI_DO_RPC_WERR( cli, mem_ctx, PI_SPOOLSS, SPOOLSS_DELETEPRINTERDATAEX, 
01963                     in, out, 
01964                     qbuf, rbuf,
01965                     spoolss_io_q_deleteprinterdataex,
01966                     spoolss_io_r_deleteprinterdataex, 
01967                     WERR_GENERAL_FAILURE );
01968 
01969         return out.status;
01970 }
01971 
01972 /**********************************************************************
01973 **********************************************************************/
01974 
01975 WERROR rpccli_spoolss_enumprinterkey(struct rpc_pipe_client *cli, TALLOC_CTX *mem_ctx,
01976                                   POLICY_HND *hnd, const char *keyname,
01977                                   uint16 **keylist, uint32 *len)
01978 {
01979         prs_struct qbuf, rbuf;
01980         SPOOL_Q_ENUMPRINTERKEY in;
01981         SPOOL_R_ENUMPRINTERKEY out;
01982         uint32 offered = 0;
01983 
01984         ZERO_STRUCT(in);
01985         ZERO_STRUCT(out);
01986 
01987         make_spoolss_q_enumprinterkey( &in, hnd, keyname, offered );
01988 
01989         CLI_DO_RPC_WERR( cli, mem_ctx, PI_SPOOLSS, SPOOLSS_ENUMPRINTERKEY, 
01990                     in, out, 
01991                     qbuf, rbuf,
01992                     spoolss_io_q_enumprinterkey,
01993                     spoolss_io_r_enumprinterkey, 
01994                     WERR_GENERAL_FAILURE );
01995 
01996         if ( W_ERROR_EQUAL( out.status, WERR_MORE_DATA ) ) {
01997                 offered = out.needed;
01998                 
01999                 ZERO_STRUCT(in);
02000                 ZERO_STRUCT(out);
02001                 
02002                 make_spoolss_q_enumprinterkey( &in, hnd, keyname, offered );
02003 
02004                 CLI_DO_RPC_WERR( cli, mem_ctx, PI_SPOOLSS, SPOOLSS_ENUMPRINTERKEY, 
02005                             in, out, 
02006                             qbuf, rbuf,
02007                             spoolss_io_q_enumprinterkey,
02008                             spoolss_io_r_enumprinterkey, 
02009                             WERR_GENERAL_FAILURE );
02010         }
02011 
02012         if ( !W_ERROR_IS_OK(out.status) )
02013                 return out.status;      
02014         
02015         if (keylist) {
02016                 *keylist = SMB_MALLOC_ARRAY(uint16, out.keys.buf_len);
02017                 if (!*keylist) {
02018                         return WERR_NOMEM;
02019                 }
02020                 memcpy(*keylist, out.keys.buffer, out.keys.buf_len * 2);
02021                 if (len)
02022                         *len = out.keys.buf_len * 2;
02023         }
02024 
02025         return out.status;
02026 }
02027 
02028 /**********************************************************************
02029 **********************************************************************/
02030 
02031 WERROR rpccli_spoolss_deleteprinterkey(struct rpc_pipe_client *cli, TALLOC_CTX *mem_ctx,
02032                                     POLICY_HND *hnd, char *keyname)
02033 {
02034         prs_struct qbuf, rbuf;
02035         SPOOL_Q_DELETEPRINTERKEY in;
02036         SPOOL_R_DELETEPRINTERKEY out;
02037 
02038         ZERO_STRUCT(in);
02039         ZERO_STRUCT(out);
02040 
02041         make_spoolss_q_deleteprinterkey( &in, hnd, keyname );
02042 
02043         CLI_DO_RPC_WERR( cli, mem_ctx, PI_SPOOLSS, SPOOLSS_DELETEPRINTERKEY, 
02044                     in, out, 
02045                     qbuf, rbuf,
02046                     spoolss_io_q_deleteprinterkey,
02047                     spoolss_io_r_deleteprinterkey, 
02048                     WERR_GENERAL_FAILURE );
02049                     
02050         return out.status;
02051 }
02052 
02053 /** @} **/

Sambaに対してSat Aug 29 21:23:16 2009に生成されました。  doxygen 1.4.7