fix the reply of rpc_alter_context
authorJean-François Micouleau <jfm@samba.org>
Tue, 15 Feb 2000 18:07:45 +0000 (18:07 +0000)
committerJean-François Micouleau <jfm@samba.org>
Tue, 15 Feb 2000 18:07:45 +0000 (18:07 +0000)
OpenPrinterEx is now decoding correctly the query
most of the EnumXXX use the new_buffer struct.
check the (un)marshalling return code.

conclusion: still a long way to go. all the client code has to be
rewritten, and I still wonder how to implement correctly the notify stuff.
(This used to be commit 3d6d3863751787b08d40268c83221add1487a5c9)

source3/include/proto.h
source3/include/rpc_spoolss.h
source3/printing/nt_printing.c
source3/rpc_parse/parse_prs.c
source3/rpc_parse/parse_spoolss.c
source3/rpc_server/srv_pipe_srv.c
source3/rpc_server/srv_spoolss.c
source3/rpc_server/srv_spoolss_nt.c

index d654af1fa4a5ae6d1460bb480e6d99377cd3a1d5..7dc0d3e9e6223419fe2a6d47ad9a68165b752b00 100644 (file)
@@ -186,10 +186,208 @@ void CatchChildLeaveStatus(void);
 
 int vslprintf(char *str, int n, char *format, va_list ap);
 
+/*The following definitions come from  libsmb/clientgen.c  */
+
+int cli_set_port(struct cli_state *cli, int port);
+char *cli_errstr(struct cli_state *cli);
+BOOL cli_api_pipe(struct cli_state *cli, char *pipe_name, int pipe_name_len,
+                  uint16 *setup, uint32 setup_count, uint32 max_setup_count,
+                  char *params, uint32 param_count, uint32 max_param_count,
+                  char *data, uint32 data_count, uint32 max_data_count,
+                  char **rparam, uint32 *rparam_count,
+                  char **rdata, uint32 *rdata_count);
+BOOL cli_api(struct cli_state *cli,
+            char *param, int prcnt, int mprcnt,
+            char *data, int drcnt, int mdrcnt,
+            char **rparam, int *rprcnt,
+            char **rdata, int *rdrcnt);
+BOOL cli_NetWkstaUserLogon(struct cli_state *cli,char *user, char *workstation);
+BOOL cli_RNetShareEnum(struct cli_state *cli, void (*fn)(const char *, uint32, const char *));
+BOOL cli_NetServerEnum(struct cli_state *cli, char *workgroup, uint32 stype,
+                      void (*fn)(const char *, uint32, const char *));
+BOOL cli_session_setup(struct cli_state *cli, 
+                      char *user, 
+                      char *pass, int passlen,
+                      char *ntpass, int ntpasslen,
+                      char *workgroup);
+BOOL cli_ulogoff(struct cli_state *cli);
+BOOL cli_send_tconX(struct cli_state *cli, 
+                   char *share, char *dev, char *pass, int passlen);
+BOOL cli_tdis(struct cli_state *cli);
+BOOL cli_rename(struct cli_state *cli, char *fname_src, char *fname_dst);
+BOOL cli_unlink(struct cli_state *cli, char *fname);
+BOOL cli_mkdir(struct cli_state *cli, char *dname);
+BOOL cli_rmdir(struct cli_state *cli, char *dname);
+int cli_nt_create(struct cli_state *cli, char *fname);
+int cli_open(struct cli_state *cli, char *fname, int flags, int share_mode);
+BOOL cli_close(struct cli_state *cli, int fnum);
+BOOL cli_lock(struct cli_state *cli, int fnum, 
+             uint32 offset, uint32 len, int timeout, enum brl_type lock_type);
+BOOL cli_unlock(struct cli_state *cli, int fnum, uint32 offset, uint32 len);
+size_t cli_read(struct cli_state *cli, int fnum, char *buf, off_t offset, size_t size);
+ssize_t cli_write(struct cli_state *cli,
+                 int fnum, uint16 write_mode,
+                 char *buf, off_t offset, size_t size);
+ssize_t cli_smbwrite(struct cli_state *cli,
+                    int fnum, char *buf, off_t offset, size_t size1);
+BOOL cli_getattrE(struct cli_state *cli, int fd, 
+                 uint16 *attr, size_t *size, 
+                 time_t *c_time, time_t *a_time, time_t *m_time);
+BOOL cli_getatr(struct cli_state *cli, char *fname, 
+               uint16 *attr, size_t *size, time_t *t);
+BOOL cli_setatr(struct cli_state *cli, char *fname, uint16 attr, time_t t);
+BOOL cli_qpathinfo(struct cli_state *cli, const char *fname, 
+                  time_t *c_time, time_t *a_time, time_t *m_time, 
+                  size_t *size, uint16 *mode);
+BOOL cli_qpathinfo2(struct cli_state *cli, const char *fname, 
+                   time_t *c_time, time_t *a_time, time_t *m_time, 
+                   time_t *w_time, size_t *size, uint16 *mode,
+                   SMB_INO_T *ino);
+BOOL cli_qfileinfo(struct cli_state *cli, int fnum, 
+                  uint16 *mode, size_t *size,
+                  time_t *c_time, time_t *a_time, time_t *m_time, 
+                  time_t *w_time, SMB_INO_T *ino);
+int cli_list(struct cli_state *cli,const char *Mask,uint16 attribute, 
+            void (*fn)(file_info *, const char *));
+BOOL cli_oem_change_password(struct cli_state *cli, const char *user, const char *new_password,
+                             const char *old_password);
+BOOL cli_negprot(struct cli_state *cli);
+BOOL cli_session_request(struct cli_state *cli,
+                        struct nmb_name *calling, struct nmb_name *called);
+BOOL cli_connect(struct cli_state *cli, const char *host, struct in_addr *ip);
+struct cli_state *cli_initialise(struct cli_state *cli);
+void cli_shutdown(struct cli_state *cli);
+int cli_error(struct cli_state *cli, uint8 *eclass, uint32 *num, uint32 *nt_rpc_error);
+void cli_sockopt(struct cli_state *cli, char *options);
+uint16 cli_setpid(struct cli_state *cli, uint16 pid);
+BOOL cli_reestablish_connection(struct cli_state *cli);
+BOOL cli_establish_connection(struct cli_state *cli, 
+                               char *dest_host, struct in_addr *dest_ip,
+                               struct nmb_name *calling, struct nmb_name *called,
+                               char *service, char *service_type,
+                               BOOL do_shutdown, BOOL do_tcon);
+int cli_printjob_del(struct cli_state *cli, int job);
+int cli_print_queue(struct cli_state *cli, 
+                   void (*fn)(struct print_job_info *));
+BOOL cli_chkpath(struct cli_state *cli, char *path);
+BOOL cli_message_start(struct cli_state *cli, char *host, char *username, 
+                             int *grp);
+BOOL cli_message_text(struct cli_state *cli, char *msg, int len, int grp);
+BOOL cli_message_end(struct cli_state *cli, int grp);
+BOOL cli_dskattr(struct cli_state *cli, int *bsize, int *total, int *avail);
+BOOL attempt_netbios_session_request(struct cli_state *cli, char *srchost, char *desthost,
+                                            struct in_addr *pdest_ip);
+
+/*The following definitions come from  libsmb/credentials.c  */
+
+char *credstr(uchar *cred);
+void cred_session_key(DOM_CHAL *clnt_chal, DOM_CHAL *srv_chal, char *pass, 
+                     uchar session_key[8]);
+void cred_create(uchar session_key[8], DOM_CHAL *stor_cred, UTIME timestamp, 
+                DOM_CHAL *cred);
+int cred_assert(DOM_CHAL *cred, uchar session_key[8], DOM_CHAL *stored_cred,
+               UTIME timestamp);
+BOOL clnt_deal_with_creds(uchar sess_key[8],
+                         DOM_CRED *sto_clnt_cred, DOM_CRED *rcv_srv_cred);
+BOOL deal_with_creds(uchar sess_key[8],
+                    DOM_CRED *sto_clnt_cred, 
+                    DOM_CRED *rcv_clnt_cred, DOM_CRED *rtn_srv_cred);
+
+/*The following definitions come from  libsmb/namequery.c  */
+
+BOOL name_status(int fd,char *name,int name_type,BOOL recurse,
+                struct in_addr to_ip,char *master,char *rname);
+struct in_addr *name_query(int fd,const char *name,int name_type, 
+                          BOOL bcast,BOOL recurse,
+                          struct in_addr to_ip, int *count);
+FILE *startlmhosts(char *fname);
+BOOL getlmhostsent( FILE *fp, pstring name, int *name_type, struct in_addr *ipaddr);
+void endlmhosts(FILE *fp);
+BOOL resolve_name(const char *name, struct in_addr *return_ip, int name_type);
+BOOL find_master_ip(char *group, struct in_addr *master_ip);
+BOOL lookup_pdc_name(const char *srcname, const char *domain, struct in_addr *pdc_ip, char *ret_name);
+BOOL get_dc_list(char *group, struct in_addr **ip_list, int *count);
+
+/*The following definitions come from  libsmb/nmblib.c  */
+
+void debug_nmb_packet(struct packet_struct *p);
+char *nmb_namestr(struct nmb_name *n);
+struct packet_struct *copy_packet(struct packet_struct *packet);
+void free_packet(struct packet_struct *packet);
+struct packet_struct *parse_packet(char *buf,int length,
+                                  enum packet_type packet_type);
+struct packet_struct *read_packet(int fd,enum packet_type packet_type);
+void make_nmb_name( struct nmb_name *n, const char *name, int type);
+BOOL nmb_name_equal(struct nmb_name *n1, struct nmb_name *n2);
+int build_packet(char *buf, struct packet_struct *p);
+BOOL send_packet(struct packet_struct *p);
+struct packet_struct *receive_packet(int fd,enum packet_type type,int t);
+struct packet_struct *receive_nmb_packet(int fd, int t, int trn_id);
+struct packet_struct *receive_dgram_packet(int fd, int t, char *mailslot_name);
+BOOL match_mailslot_name(struct packet_struct *p, char *mailslot_name);
+void sort_query_replies(char *data, int n, struct in_addr ip);
+
+/*The following definitions come from  libsmb/nterr.c  */
+
+char *get_nt_error_msg(uint32 nt_code);
+
+/*The following definitions come from  libsmb/passchange.c  */
+
+BOOL remote_password_change(const char *remote_machine, const char *user_name, 
+                           const char *old_passwd, const char *new_passwd,
+                           char *err_str, size_t err_str_len);
+
+/*The following definitions come from  libsmb/pwd_cache.c  */
+
+void pwd_init(struct pwd_info *pwd);
+void pwd_obfuscate_key(struct pwd_info *pwd, uint32 int_key, char *str_key);
+BOOL pwd_compare(struct pwd_info *pwd1, struct pwd_info *pwd2);
+void pwd_read(struct pwd_info *pwd, char *passwd_report, BOOL do_encrypt);
+void pwd_set_nullpwd(struct pwd_info *pwd);
+void pwd_set_cleartext(struct pwd_info *pwd, char *clr);
+void pwd_get_cleartext(struct pwd_info *pwd, char *clr);
+void pwd_set_lm_nt_16(struct pwd_info *pwd, uchar lm_pwd[16], uchar nt_pwd[16]);
+void pwd_get_lm_nt_16(struct pwd_info *pwd, uchar lm_pwd[16], uchar nt_pwd[16]);
+void pwd_make_lm_nt_16(struct pwd_info *pwd, char *clr);
+void pwd_make_lm_nt_owf(struct pwd_info *pwd, uchar cryptkey[8]);
+void pwd_get_lm_nt_owf(struct pwd_info *pwd, uchar lm_owf[24], uchar nt_owf[24]);
+
 /*The following definitions come from  lib/smbrun.c  */
 
 int smbrun(char *cmd,char *outfile,BOOL shared);
 
+/*The following definitions come from  libsmb/smbdes.c  */
+
+void E_P16(unsigned char *p14,unsigned char *p16);
+void E_P24(unsigned char *p21, unsigned char *c8, unsigned char *p24);
+void D_P16(unsigned char *p14, unsigned char *in, unsigned char *out);
+void E_old_pw_hash( unsigned char *p14, unsigned char *in, unsigned char *out);
+void cred_hash1(unsigned char *out,unsigned char *in,unsigned char *key);
+void cred_hash2(unsigned char *out,unsigned char *in,unsigned char *key);
+void cred_hash3(unsigned char *out,unsigned char *in,unsigned char *key, int forw);
+void SamOEMhash( unsigned char *data, unsigned char *key, int val);
+
+/*The following definitions come from  libsmb/smbencrypt.c  */
+
+void SMBencrypt(uchar *passwd, uchar *c8, uchar *p24);
+void E_md4hash(uchar *passwd, uchar *p16);
+void nt_lm_owf_gen(char *pwd, uchar nt_p16[16], uchar p16[16]);
+void SMBOWFencrypt(uchar passwd[16], uchar *c8, uchar p24[24]);
+void NTLMSSPOWFencrypt(uchar passwd[8], uchar *ntlmchalresp, uchar p24[24]);
+void SMBNTencrypt(uchar *passwd, uchar *c8, uchar *p24);
+BOOL make_oem_passwd_hash(char data[516], const char *passwd, uchar old_pw_hash[16], BOOL unicode);
+
+/*The following definitions come from  libsmb/smberr.c  */
+
+char *smb_errstr(char *inbuf);
+
+/*The following definitions come from  libsmb/unexpected.c  */
+
+void unexpected_packet(struct packet_struct *p);
+void clear_unexpected(time_t t);
+struct packet_struct *receive_unexpected(enum packet_type packet_type, int id, 
+                                        char *mailslot_name);
+
 /*The following definitions come from  lib/snprintf.c  */
 
 
@@ -271,6 +469,23 @@ BOOL map_username(char *user);
 struct passwd *Get_Pwnam(char *user,BOOL allow_change);
 BOOL user_in_list(char *user,char *list);
 
+/*The following definitions come from  lib/util_array.c  */
+
+void free_void_array(uint32 num_entries, void **entries,
+               void(free_item)(void*));
+void* add_copy_to_array(uint32 *len, void ***array, const void *item,
+       void*(item_dup)(const void*), BOOL alloc_anyway);
+void* add_item_to_array(uint32 *len, void ***array, void *item);
+void free_use_info_array(uint32 num_entries, struct use_info **entries);
+struct use_info* add_use_info_to_array(uint32 *len, struct use_info ***array,
+                               const struct use_info *name);
+void free_char_array(uint32 num_entries, char **entries);
+char* add_chars_to_array(uint32 *len, char ***array, const char *name);
+void free_uint32_array(uint32 num_entries, uint32 **entries);
+uint32* add_uint32s_to_array(uint32 *len, uint32 ***array, const uint32 *name);
+void free_sid_array(uint32 num_entries, DOM_SID **entries);
+DOM_SID* add_sid_to_array(uint32 *len, DOM_SID ***array, const DOM_SID *sid);
+
 /*The following definitions come from  lib/util.c  */
 
 char *tmpdir(void);
@@ -348,23 +563,6 @@ char *myhostname(void);
 char *lock_path(char *name);
 char *parent_dirname(const char *path);
 
-/*The following definitions come from  lib/util_array.c  */
-
-void free_void_array(uint32 num_entries, void **entries,
-               void(free_item)(void*));
-void* add_copy_to_array(uint32 *len, void ***array, const void *item,
-       void*(item_dup)(const void*), BOOL alloc_anyway);
-void* add_item_to_array(uint32 *len, void ***array, void *item);
-void free_use_info_array(uint32 num_entries, struct use_info **entries);
-struct use_info* add_use_info_to_array(uint32 *len, struct use_info ***array,
-                               const struct use_info *name);
-void free_char_array(uint32 num_entries, char **entries);
-char* add_chars_to_array(uint32 *len, char ***array, const char *name);
-void free_uint32_array(uint32 num_entries, uint32 **entries);
-uint32* add_uint32s_to_array(uint32 *len, uint32 ***array, const uint32 *name);
-void free_sid_array(uint32 num_entries, DOM_SID **entries);
-DOM_SID* add_sid_to_array(uint32 *len, DOM_SID ***array, const DOM_SID *sid);
-
 /*The following definitions come from  lib/util_file.c  */
 
 BOOL do_file_lock(int fd, int waitsecs, int type);
@@ -554,204 +752,6 @@ void split_at_last_component_w(smb_ucs2_t *path, smb_ucs2_t *front, smb_ucs2_t s
 smb_ucs2_t *octal_string_w(int i);
 smb_ucs2_t *string_truncate_w(smb_ucs2_t *s, size_t length);
 
-/*The following definitions come from  libsmb/clientgen.c  */
-
-int cli_set_port(struct cli_state *cli, int port);
-char *cli_errstr(struct cli_state *cli);
-BOOL cli_api_pipe(struct cli_state *cli, char *pipe_name, int pipe_name_len,
-                  uint16 *setup, uint32 setup_count, uint32 max_setup_count,
-                  char *params, uint32 param_count, uint32 max_param_count,
-                  char *data, uint32 data_count, uint32 max_data_count,
-                  char **rparam, uint32 *rparam_count,
-                  char **rdata, uint32 *rdata_count);
-BOOL cli_api(struct cli_state *cli,
-            char *param, int prcnt, int mprcnt,
-            char *data, int drcnt, int mdrcnt,
-            char **rparam, int *rprcnt,
-            char **rdata, int *rdrcnt);
-BOOL cli_NetWkstaUserLogon(struct cli_state *cli,char *user, char *workstation);
-BOOL cli_RNetShareEnum(struct cli_state *cli, void (*fn)(const char *, uint32, const char *));
-BOOL cli_NetServerEnum(struct cli_state *cli, char *workgroup, uint32 stype,
-                      void (*fn)(const char *, uint32, const char *));
-BOOL cli_session_setup(struct cli_state *cli, 
-                      char *user, 
-                      char *pass, int passlen,
-                      char *ntpass, int ntpasslen,
-                      char *workgroup);
-BOOL cli_ulogoff(struct cli_state *cli);
-BOOL cli_send_tconX(struct cli_state *cli, 
-                   char *share, char *dev, char *pass, int passlen);
-BOOL cli_tdis(struct cli_state *cli);
-BOOL cli_rename(struct cli_state *cli, char *fname_src, char *fname_dst);
-BOOL cli_unlink(struct cli_state *cli, char *fname);
-BOOL cli_mkdir(struct cli_state *cli, char *dname);
-BOOL cli_rmdir(struct cli_state *cli, char *dname);
-int cli_nt_create(struct cli_state *cli, char *fname);
-int cli_open(struct cli_state *cli, char *fname, int flags, int share_mode);
-BOOL cli_close(struct cli_state *cli, int fnum);
-BOOL cli_lock(struct cli_state *cli, int fnum, 
-             uint32 offset, uint32 len, int timeout, enum brl_type lock_type);
-BOOL cli_unlock(struct cli_state *cli, int fnum, uint32 offset, uint32 len);
-size_t cli_read(struct cli_state *cli, int fnum, char *buf, off_t offset, size_t size);
-ssize_t cli_write(struct cli_state *cli,
-                 int fnum, uint16 write_mode,
-                 char *buf, off_t offset, size_t size);
-ssize_t cli_smbwrite(struct cli_state *cli,
-                    int fnum, char *buf, off_t offset, size_t size1);
-BOOL cli_getattrE(struct cli_state *cli, int fd, 
-                 uint16 *attr, size_t *size, 
-                 time_t *c_time, time_t *a_time, time_t *m_time);
-BOOL cli_getatr(struct cli_state *cli, char *fname, 
-               uint16 *attr, size_t *size, time_t *t);
-BOOL cli_setatr(struct cli_state *cli, char *fname, uint16 attr, time_t t);
-BOOL cli_qpathinfo(struct cli_state *cli, const char *fname, 
-                  time_t *c_time, time_t *a_time, time_t *m_time, 
-                  size_t *size, uint16 *mode);
-BOOL cli_qpathinfo2(struct cli_state *cli, const char *fname, 
-                   time_t *c_time, time_t *a_time, time_t *m_time, 
-                   time_t *w_time, size_t *size, uint16 *mode,
-                   SMB_INO_T *ino);
-BOOL cli_qfileinfo(struct cli_state *cli, int fnum, 
-                  uint16 *mode, size_t *size,
-                  time_t *c_time, time_t *a_time, time_t *m_time, 
-                  time_t *w_time, SMB_INO_T *ino);
-int cli_list(struct cli_state *cli,const char *Mask,uint16 attribute, 
-            void (*fn)(file_info *, const char *));
-BOOL cli_oem_change_password(struct cli_state *cli, const char *user, const char *new_password,
-                             const char *old_password);
-BOOL cli_negprot(struct cli_state *cli);
-BOOL cli_session_request(struct cli_state *cli,
-                        struct nmb_name *calling, struct nmb_name *called);
-BOOL cli_connect(struct cli_state *cli, const char *host, struct in_addr *ip);
-struct cli_state *cli_initialise(struct cli_state *cli);
-void cli_shutdown(struct cli_state *cli);
-int cli_error(struct cli_state *cli, uint8 *eclass, uint32 *num, uint32 *nt_rpc_error);
-void cli_sockopt(struct cli_state *cli, char *options);
-uint16 cli_setpid(struct cli_state *cli, uint16 pid);
-BOOL cli_reestablish_connection(struct cli_state *cli);
-BOOL cli_establish_connection(struct cli_state *cli, 
-                               char *dest_host, struct in_addr *dest_ip,
-                               struct nmb_name *calling, struct nmb_name *called,
-                               char *service, char *service_type,
-                               BOOL do_shutdown, BOOL do_tcon);
-int cli_printjob_del(struct cli_state *cli, int job);
-int cli_print_queue(struct cli_state *cli, 
-                   void (*fn)(struct print_job_info *));
-BOOL cli_chkpath(struct cli_state *cli, char *path);
-BOOL cli_message_start(struct cli_state *cli, char *host, char *username, 
-                             int *grp);
-BOOL cli_message_text(struct cli_state *cli, char *msg, int len, int grp);
-BOOL cli_message_end(struct cli_state *cli, int grp);
-BOOL cli_dskattr(struct cli_state *cli, int *bsize, int *total, int *avail);
-BOOL attempt_netbios_session_request(struct cli_state *cli, char *srchost, char *desthost,
-                                            struct in_addr *pdest_ip);
-
-/*The following definitions come from  libsmb/credentials.c  */
-
-char *credstr(uchar *cred);
-void cred_session_key(DOM_CHAL *clnt_chal, DOM_CHAL *srv_chal, char *pass, 
-                     uchar session_key[8]);
-void cred_create(uchar session_key[8], DOM_CHAL *stor_cred, UTIME timestamp, 
-                DOM_CHAL *cred);
-int cred_assert(DOM_CHAL *cred, uchar session_key[8], DOM_CHAL *stored_cred,
-               UTIME timestamp);
-BOOL clnt_deal_with_creds(uchar sess_key[8],
-                         DOM_CRED *sto_clnt_cred, DOM_CRED *rcv_srv_cred);
-BOOL deal_with_creds(uchar sess_key[8],
-                    DOM_CRED *sto_clnt_cred, 
-                    DOM_CRED *rcv_clnt_cred, DOM_CRED *rtn_srv_cred);
-
-/*The following definitions come from  libsmb/namequery.c  */
-
-BOOL name_status(int fd,char *name,int name_type,BOOL recurse,
-                struct in_addr to_ip,char *master,char *rname);
-struct in_addr *name_query(int fd,const char *name,int name_type, 
-                          BOOL bcast,BOOL recurse,
-                          struct in_addr to_ip, int *count);
-FILE *startlmhosts(char *fname);
-BOOL getlmhostsent( FILE *fp, pstring name, int *name_type, struct in_addr *ipaddr);
-void endlmhosts(FILE *fp);
-BOOL resolve_name(const char *name, struct in_addr *return_ip, int name_type);
-BOOL find_master_ip(char *group, struct in_addr *master_ip);
-BOOL lookup_pdc_name(const char *srcname, const char *domain, struct in_addr *pdc_ip, char *ret_name);
-BOOL get_dc_list(char *group, struct in_addr **ip_list, int *count);
-
-/*The following definitions come from  libsmb/nmblib.c  */
-
-void debug_nmb_packet(struct packet_struct *p);
-char *nmb_namestr(struct nmb_name *n);
-struct packet_struct *copy_packet(struct packet_struct *packet);
-void free_packet(struct packet_struct *packet);
-struct packet_struct *parse_packet(char *buf,int length,
-                                  enum packet_type packet_type);
-struct packet_struct *read_packet(int fd,enum packet_type packet_type);
-void make_nmb_name( struct nmb_name *n, const char *name, int type);
-BOOL nmb_name_equal(struct nmb_name *n1, struct nmb_name *n2);
-int build_packet(char *buf, struct packet_struct *p);
-BOOL send_packet(struct packet_struct *p);
-struct packet_struct *receive_packet(int fd,enum packet_type type,int t);
-struct packet_struct *receive_nmb_packet(int fd, int t, int trn_id);
-struct packet_struct *receive_dgram_packet(int fd, int t, char *mailslot_name);
-BOOL match_mailslot_name(struct packet_struct *p, char *mailslot_name);
-void sort_query_replies(char *data, int n, struct in_addr ip);
-
-/*The following definitions come from  libsmb/nterr.c  */
-
-char *get_nt_error_msg(uint32 nt_code);
-
-/*The following definitions come from  libsmb/passchange.c  */
-
-BOOL remote_password_change(const char *remote_machine, const char *user_name, 
-                           const char *old_passwd, const char *new_passwd,
-                           char *err_str, size_t err_str_len);
-
-/*The following definitions come from  libsmb/pwd_cache.c  */
-
-void pwd_init(struct pwd_info *pwd);
-void pwd_obfuscate_key(struct pwd_info *pwd, uint32 int_key, char *str_key);
-BOOL pwd_compare(struct pwd_info *pwd1, struct pwd_info *pwd2);
-void pwd_read(struct pwd_info *pwd, char *passwd_report, BOOL do_encrypt);
-void pwd_set_nullpwd(struct pwd_info *pwd);
-void pwd_set_cleartext(struct pwd_info *pwd, char *clr);
-void pwd_get_cleartext(struct pwd_info *pwd, char *clr);
-void pwd_set_lm_nt_16(struct pwd_info *pwd, uchar lm_pwd[16], uchar nt_pwd[16]);
-void pwd_get_lm_nt_16(struct pwd_info *pwd, uchar lm_pwd[16], uchar nt_pwd[16]);
-void pwd_make_lm_nt_16(struct pwd_info *pwd, char *clr);
-void pwd_make_lm_nt_owf(struct pwd_info *pwd, uchar cryptkey[8]);
-void pwd_get_lm_nt_owf(struct pwd_info *pwd, uchar lm_owf[24], uchar nt_owf[24]);
-
-/*The following definitions come from  libsmb/smbdes.c  */
-
-void E_P16(unsigned char *p14,unsigned char *p16);
-void E_P24(unsigned char *p21, unsigned char *c8, unsigned char *p24);
-void D_P16(unsigned char *p14, unsigned char *in, unsigned char *out);
-void E_old_pw_hash( unsigned char *p14, unsigned char *in, unsigned char *out);
-void cred_hash1(unsigned char *out,unsigned char *in,unsigned char *key);
-void cred_hash2(unsigned char *out,unsigned char *in,unsigned char *key);
-void cred_hash3(unsigned char *out,unsigned char *in,unsigned char *key, int forw);
-void SamOEMhash( unsigned char *data, unsigned char *key, int val);
-
-/*The following definitions come from  libsmb/smbencrypt.c  */
-
-void SMBencrypt(uchar *passwd, uchar *c8, uchar *p24);
-void E_md4hash(uchar *passwd, uchar *p16);
-void nt_lm_owf_gen(char *pwd, uchar nt_p16[16], uchar p16[16]);
-void SMBOWFencrypt(uchar passwd[16], uchar *c8, uchar p24[24]);
-void NTLMSSPOWFencrypt(uchar passwd[8], uchar *ntlmchalresp, uchar p24[24]);
-void SMBNTencrypt(uchar *passwd, uchar *c8, uchar *p24);
-BOOL make_oem_passwd_hash(char data[516], const char *passwd, uchar old_pw_hash[16], BOOL unicode);
-
-/*The following definitions come from  libsmb/smberr.c  */
-
-char *smb_errstr(char *inbuf);
-
-/*The following definitions come from  libsmb/unexpected.c  */
-
-void unexpected_packet(struct packet_struct *p);
-void clear_unexpected(time_t t);
-struct packet_struct *receive_unexpected(enum packet_type packet_type, int id, 
-                                        char *mailslot_name);
-
 /*The following definitions come from  locking/brlock.c  */
 
 void brl_init(int read_only);
@@ -809,10 +809,6 @@ BOOL queue_dns_query(struct packet_struct *p,struct nmb_name *question,
                     struct name_record **n);
 void kill_async_dns_child(void);
 
-/*The following definitions come from  nmbd/nmbd.c  */
-
-BOOL reload_services(BOOL test);
-
 /*The following definitions come from  nmbd/nmbd_become_dmb.c  */
 
 void add_domain_names(time_t t);
@@ -843,6 +839,10 @@ void announce_and_sync_with_domain_master_browser( struct subnet_record *subrec,
 void collect_all_workgroup_names_from_wins_server(time_t t);
 void sync_all_dmbs(time_t t);
 
+/*The following definitions come from  nmbd/nmbd.c  */
+
+BOOL reload_services(BOOL test);
+
 /*The following definitions come from  nmbd/nmbd_elections.c  */
 
 void check_master_browser_exists(time_t t);
@@ -1515,11 +1515,6 @@ void pcap_printer_fn(void (*fn)(char *, char *));
 void cups_printer_fn(void (*fn)(char *, char *));
 int cups_printername_ok(char *name);
 
-/*The following definitions come from  printing/print_svid.c  */
-
-void sysv_printer_fn(void (*fn)(char *, char *));
-int sysv_printername_ok(char *name);
-
 /*The following definitions come from  printing/printing.c  */
 
 void lpq_reset(int snum);
@@ -1534,6 +1529,11 @@ void printjob_decode(int jobid, int *snum, int *job);
 void status_printqueue(connection_struct *conn,int snum,int status);
 void load_printers(void);
 
+/*The following definitions come from  printing/print_svid.c  */
+
+void sysv_printer_fn(void (*fn)(char *, char *));
+int sysv_printername_ok(char *name);
+
 /*The following definitions come from  profile/profile.c  */
 
 BOOL profile_setup(BOOL rdonly);
@@ -1699,6 +1699,109 @@ BOOL do_wks_query_info(struct cli_state *cli,
                        char *server_name, uint32 switch_value,
                        WKS_INFO_100 *wks100);
 
+/*The following definitions come from  rpcclient/cmd_lsarpc.c  */
+
+void cmd_lsa_query_info(struct client_info *info);
+void cmd_lsa_lookup_sids(struct client_info *info);
+
+/*The following definitions come from  rpcclient/cmd_netlogon.c  */
+
+void cmd_netlogon_login_test(struct client_info *info);
+
+/*The following definitions come from  rpcclient/cmd_reg.c  */
+
+void cmd_reg_enum(struct client_info *info);
+void cmd_reg_query_key(struct client_info *info);
+void cmd_reg_create_val(struct client_info *info);
+void cmd_reg_delete_val(struct client_info *info);
+void cmd_reg_delete_key(struct client_info *info);
+void cmd_reg_create_key(struct client_info *info);
+void cmd_reg_test_key_sec(struct client_info *info);
+void cmd_reg_get_key_sec(struct client_info *info);
+
+/*The following definitions come from  rpcclient/cmd_samr.c  */
+
+void cmd_sam_ntchange_pwd(struct client_info *info);
+void cmd_sam_test(struct client_info *info);
+void cmd_sam_enum_users(struct client_info *info);
+void cmd_sam_query_user(struct client_info *info);
+void cmd_sam_query_groups(struct client_info *info);
+void cmd_sam_enum_aliases(struct client_info *info);
+
+/*The following definitions come from  rpcclient/cmd_srvsvc.c  */
+
+void cmd_srv_query_info(struct client_info *info);
+void cmd_srv_enum_conn(struct client_info *info);
+void cmd_srv_enum_shares(struct client_info *info);
+void cmd_srv_enum_sess(struct client_info *info);
+void cmd_srv_enum_files(struct client_info *info);
+
+/*The following definitions come from  rpcclient/cmd_wkssvc.c  */
+
+void cmd_wks_query_info(struct client_info *info);
+
+/*The following definitions come from  rpcclient/display.c  */
+
+char *get_file_mode_str(uint32 share_mode);
+char *get_file_oplock_str(uint32 op_type);
+char *get_share_type_str(uint32 type);
+char *get_server_type_str(uint32 type);
+void display_srv_info_101(FILE *out_hnd, enum action_type action,
+               SRV_INFO_101 *sv101);
+void display_srv_info_102(FILE *out_hnd, enum action_type action,SRV_INFO_102 *sv102);
+void display_srv_info_ctr(FILE *out_hnd, enum action_type action,SRV_INFO_CTR *ctr);
+void display_conn_info_0(FILE *out_hnd, enum action_type action,
+               CONN_INFO_0 *info0);
+void display_conn_info_1(FILE *out_hnd, enum action_type action,
+               CONN_INFO_1 *info1, CONN_INFO_1_STR *str1);
+void display_srv_conn_info_0_ctr(FILE *out_hnd, enum action_type action,
+                               SRV_CONN_INFO_0 *ctr);
+void display_srv_conn_info_1_ctr(FILE *out_hnd, enum action_type action,
+                               SRV_CONN_INFO_1 *ctr);
+void display_srv_conn_info_ctr(FILE *out_hnd, enum action_type action,
+                               SRV_CONN_INFO_CTR *ctr);
+void display_share_info_1(FILE *out_hnd, enum action_type action,
+                         SRV_SHARE_INFO_1 *info1);
+void display_share_info_2(FILE *out_hnd, enum action_type action,
+                         SRV_SHARE_INFO_2 *info2);
+void display_srv_share_info_ctr(FILE *out_hnd, enum action_type action,
+                               SRV_SHARE_INFO_CTR *ctr);
+void display_file_info_3(FILE *out_hnd, enum action_type action,
+               FILE_INFO_3 *info3, FILE_INFO_3_STR *str3);
+void display_srv_file_info_3_ctr(FILE *out_hnd, enum action_type action,
+                               SRV_FILE_INFO_3 *ctr);
+void display_srv_file_info_ctr(FILE *out_hnd, enum action_type action,
+                               SRV_FILE_INFO_CTR *ctr);
+void display_server(FILE *out_hnd, enum action_type action,
+                               char *sname, uint32 type, char *comment);
+void display_share(FILE *out_hnd, enum action_type action,
+                               char *sname, uint32 type, char *comment);
+void display_share2(FILE *out_hnd, enum action_type action,
+                               char *sname, uint32 type, char *comment,
+                               uint32 perms, uint32 max_uses, uint32 num_uses,
+                               char *path, char *passwd);
+void display_name(FILE *out_hnd, enum action_type action,
+                               char *sname);
+void display_group_rid_info(FILE *out_hnd, enum action_type action,
+                               uint32 num_gids, DOM_GID *gid);
+void display_alias_name_info(FILE *out_hnd, enum action_type action,
+                               uint32 num_aliases, fstring *alias_name, uint32 *num_als_usrs);
+void display_sam_user_info_21(FILE *out_hnd, enum action_type action, SAM_USER_INFO_21 *usr);
+char *get_sec_mask_str(uint32 type);
+void display_sec_access(FILE *out_hnd, enum action_type action, SEC_ACCESS *info);
+void display_sec_ace(FILE *out_hnd, enum action_type action, SEC_ACE *ace);
+void display_sec_acl(FILE *out_hnd, enum action_type action, SEC_ACL *sec_acl);
+void display_sec_desc(FILE *out_hnd, enum action_type action, SEC_DESC *sec);
+char *get_reg_val_type_str(uint32 type);
+void display_reg_value_info(FILE *out_hnd, enum action_type action,
+                               char *val_name, uint32 val_type, BUFFER2 *value);
+void display_reg_key_info(FILE *out_hnd, enum action_type action,
+                               char *key_name, time_t key_mod_time);
+
+/*The following definitions come from  rpcclient/rpcclient.c  */
+
+void rpcclient_init(void);
+
 /*The following definitions come from  rpc_parse/parse_creds.c  */
 
 BOOL make_creds_unix(CREDS_UNIX *r_u, const char* user_name,
@@ -1940,7 +2043,7 @@ uint32 prs_data_size(prs_struct *ps);
 uint32 prs_offset(prs_struct *ps);
 BOOL prs_set_offset(prs_struct *ps, uint32 offset);
 BOOL prs_append_prs_data(prs_struct *dst, prs_struct *src);
-BOOL prs_append_some_prs_data(prs_struct *dst, prs_struct *src, uint32 len);
+BOOL prs_append_some_prs_data(prs_struct *dst, prs_struct *src, int32 start, uint32 len);
 BOOL prs_append_data(prs_struct *dst, char *src, uint32 len);
 void prs_set_bigendian_data(prs_struct *ps);
 BOOL prs_align(prs_struct *ps);
@@ -2332,12 +2435,36 @@ BOOL spoolss_io_q_rfnpcnex(char *desc, SPOOL_Q_RFNPCNEX *q_u,
 BOOL spoolss_io_r_rfnpcnex(char *desc, 
                            SPOOL_R_RFNPCNEX *r_u, 
                            prs_struct *ps, int depth);
+BOOL new_smb_io_printer_info_1(char *desc, NEW_BUFFER *buffer, PRINTER_INFO_1 *info, int depth);
+BOOL new_smb_io_printer_info_2(char *desc, NEW_BUFFER *buffer, PRINTER_INFO_2 *info, int depth);
+BOOL new_smb_io_printer_driver_info_1(char *desc, NEW_BUFFER *buffer, DRIVER_INFO_1 *info, int depth) ;
+BOOL new_smb_io_printer_driver_info_2(char *desc, NEW_BUFFER *buffer, DRIVER_INFO_2 *info, int depth) ;
+BOOL new_smb_io_printer_driver_info_3(char *desc, NEW_BUFFER *buffer, DRIVER_INFO_3 *info, int depth);
+BOOL new_smb_io_job_info_1(char *desc, NEW_BUFFER *buffer, JOB_INFO_1 *info, int depth);
+BOOL new_smb_io_job_info_2(char *desc, NEW_BUFFER *buffer, JOB_INFO_2 *info, int depth);
 BOOL new_smb_io_form_1(char *desc, NEW_BUFFER *buffer, FORM_1 *info, int depth);
 void new_spoolss_move_buffer(NEW_BUFFER *src, NEW_BUFFER **dest);
 void new_spoolss_allocate_buffer(NEW_BUFFER **buffer);
 void new_spoolss_free_buffer(NEW_BUFFER *buffer);
 uint32 new_get_buffer_size(NEW_BUFFER *buffer);
+BOOL new_smb_io_port_1(char *desc, NEW_BUFFER *buffer, PORT_INFO_1 *info, int depth);
+BOOL new_smb_io_port_2(char *desc, NEW_BUFFER *buffer, PORT_INFO_2 *info, int depth);
+BOOL smb_io_printprocessor_info_1(char *desc, NEW_BUFFER *buffer, PRINTPROCESSOR_1 *info, int depth);
+BOOL smb_io_printmonitor_info_1(char *desc, NEW_BUFFER *buffer, PRINTMONITOR_1 *info, int depth);
+BOOL smb_io_printmonitor_info_2(char *desc, NEW_BUFFER *buffer, PRINTMONITOR_2 *info, int depth);
+uint32 spoolss_size_printer_info_1(PRINTER_INFO_1 *info);
+uint32 spoolss_size_printer_info_2(PRINTER_INFO_2 *info);
+uint32 spoolss_size_printer_driver_info_1(DRIVER_INFO_1 *info);
+uint32 spoolss_size_printer_driver_info_2(DRIVER_INFO_2 *info);
+uint32 spoolss_size_printer_driver_info_3(DRIVER_INFO_3 *info);
+uint32 spoolss_size_job_info_1(JOB_INFO_1 *info);
+uint32 spoolss_size_job_info_2(JOB_INFO_2 *info);
 uint32 spoolss_size_form_1(FORM_1 *info);
+uint32 spoolss_size_port_info_1(PORT_INFO_1 *info);
+uint32 spoolss_size_port_info_2(PORT_INFO_2 *info);
+uint32 spoolss_size_printprocessor_info_1(PRINTPROCESSOR_1 *info);
+uint32 spoolss_size_printmonitor_info_1(PRINTMONITOR_1 *info);
+uint32 spoolss_size_printmonitor_info_2(PRINTMONITOR_2 *info);
 BOOL spoolss_io_free_buffer(BUFFER *buffer);
 BOOL spoolss_io_q_getprinterdriver2(char *desc, 
                                    SPOOL_Q_GETPRINTERDRIVER2 *q_u,
@@ -2351,10 +2478,7 @@ BOOL make_spoolss_q_enumprinters(SPOOL_Q_ENUMPRINTERS *q_u,
                                uint32 size);
 BOOL spoolss_io_q_enumprinters(char *desc, SPOOL_Q_ENUMPRINTERS *q_u,
                                prs_struct *ps, int depth);
-void free_r_enumprinters(SPOOL_R_ENUMPRINTERS *r_u);
-BOOL spoolss_io_r_enumprinters(char *desc,
-                               SPOOL_R_ENUMPRINTERS *r_u, 
-                               prs_struct *ps, int depth);
+BOOL new_spoolss_io_r_enumprinters(char *desc, SPOOL_R_ENUMPRINTERS *r_u, prs_struct *ps, int depth);
 BOOL spoolss_io_r_getprinter(char *desc,
                                SPOOL_R_GETPRINTER *r_u, 
                                prs_struct *ps, int depth);
@@ -2370,8 +2494,6 @@ BOOL spoolss_io_r_fcpn(char *desc, SPOOL_R_FCPN *r_u, prs_struct *ps, int depth)
 BOOL spoolss_io_q_fcpn(char *desc, SPOOL_Q_FCPN *q_u, prs_struct *ps, int depth);
 BOOL spoolss_io_r_addjob(char *desc, SPOOL_R_ADDJOB *r_u, prs_struct *ps, int depth);
 BOOL spoolss_io_q_addjob(char *desc, SPOOL_Q_ADDJOB *q_u, prs_struct *ps, int depth);
-void free_job_info_ctr(JOB_INFO_CTR *ctr, uint32 level, uint32 numofjobs);
-void free_r_enumjobs(SPOOL_R_ENUMJOBS *r_u);
 BOOL spoolss_io_r_enumjobs(char *desc, SPOOL_R_ENUMJOBS *r_u, prs_struct *ps, int depth);
 BOOL make_spoolss_q_enumjobs(SPOOL_Q_ENUMJOBS *q_u, const POLICY_HND *hnd,
                                uint32 firstjob,
@@ -2383,13 +2505,11 @@ BOOL spoolss_io_r_schedulejob(char *desc, SPOOL_R_SCHEDULEJOB *r_u, prs_struct *
 BOOL spoolss_io_q_schedulejob(char *desc, SPOOL_Q_SCHEDULEJOB *q_u, prs_struct *ps, int depth);
 BOOL spoolss_io_r_setjob(char *desc, SPOOL_R_SETJOB *r_u, prs_struct *ps, int depth);
 BOOL spoolss_io_q_setjob(char *desc, SPOOL_Q_SETJOB *q_u, prs_struct *ps, int depth);
-BOOL spoolss_io_r_enumdrivers(char *desc, SPOOL_R_ENUMPRINTERDRIVERS *r_u, prs_struct *ps, int depth);
-void free_spoolss_r_enumdrivers(SPOOL_R_ENUMPRINTERDRIVERS *r_u);
+BOOL new_spoolss_io_r_enumprinterdrivers(char *desc, SPOOL_R_ENUMPRINTERDRIVERS *r_u, prs_struct *ps, int depth);
 BOOL spoolss_io_q_enumprinterdrivers(char *desc, SPOOL_Q_ENUMPRINTERDRIVERS *q_u, prs_struct *ps, int depth);
 BOOL spoolss_io_q_enumforms(char *desc, SPOOL_Q_ENUMFORMS *q_u, prs_struct *ps, int depth);
 BOOL new_spoolss_io_r_enumforms(char *desc, SPOOL_R_ENUMFORMS *r_u, prs_struct *ps, int depth);
-BOOL spoolss_io_r_enumports(char *desc, SPOOL_R_ENUMPORTS *r_u, prs_struct *ps, int depth);
-void spoolss_free_r_enumports(SPOOL_R_ENUMPORTS *r_u);
+BOOL new_spoolss_io_r_enumports(char *desc, SPOOL_R_ENUMPORTS *r_u, prs_struct *ps, int depth);
 BOOL spoolss_io_q_enumports(char *desc, SPOOL_Q_ENUMPORTS *q_u, prs_struct *ps, int depth);
 BOOL spool_io_printer_info_level_2(char *desc, SPOOL_PRINTER_INFO_LEVEL_2 **q_u, prs_struct *ps, int depth);
 BOOL spool_io_printer_info_level(char *desc, SPOOL_PRINTER_INFO_LEVEL *il, prs_struct *ps, int depth);
@@ -2410,8 +2530,8 @@ BOOL spoolss_io_r_getprinterdriverdir(char *desc, SPOOL_R_GETPRINTERDRIVERDIR *r
 BOOL spoolss_io_q_getprinterdriverdir(char *desc, SPOOL_Q_GETPRINTERDRIVERDIR *q_u, prs_struct *ps, int depth);
 BOOL spoolss_io_r_enumprintprocessors(char *desc, SPOOL_R_ENUMPRINTPROCESSORS *r_u, prs_struct *ps, int depth);
 BOOL spoolss_io_q_enumprintprocessors(char *desc, SPOOL_Q_ENUMPRINTPROCESSORS *q_u, prs_struct *ps, int depth);
-BOOL spoolss_io_r_enumprintmonitors(char *desc, SPOOL_R_ENUMPRINTMONITORS *r_u, prs_struct *ps, int depth);
 BOOL spoolss_io_q_enumprintmonitors(char *desc, SPOOL_Q_ENUMPRINTMONITORS *q_u, prs_struct *ps, int depth);
+BOOL spoolss_io_r_enumprintmonitors(char *desc, SPOOL_R_ENUMPRINTMONITORS *r_u, prs_struct *ps, int depth);
 BOOL spoolss_io_r_enumprinterdata(char *desc, SPOOL_R_ENUMPRINTERDATA *r_u, prs_struct *ps, int depth);
 BOOL spoolss_io_q_enumprinterdata(char *desc, SPOOL_Q_ENUMPRINTERDATA *q_u, prs_struct *ps, int depth);
 BOOL spoolss_io_q_setprinterdata(char *desc, SPOOL_Q_SETPRINTERDATA *q_u, prs_struct *ps, int depth);
@@ -2615,16 +2735,9 @@ uint32 _spoolss_rfnpcnex( const POLICY_HND *handle,
                                const SPOOL_NOTIFY_OPTION *option,
                                uint32 *count,
                                SPOOL_NOTIFY_INFO *info);
-uint32 _spoolss_enumprinters(
-                               uint32 flags,
-                               const UNISTR2 *servername,
-                               uint32 level,
-                               const BUFFER *buffer,
-                               uint32 buf_size,
-                               uint32 *offered,
-                               uint32 *needed,
-                               PRINTER_INFO_CTR *ctr,
-                               uint32 *returned);
+uint32 _spoolss_enumprinters( uint32 flags, const UNISTR2 *servername, uint32 level,
+                             NEW_BUFFER *buffer, uint32 offered,
+                             uint32 *needed, uint32 *returned);
 uint32 _spoolss_getprinter( POLICY_HND *handle,
                                uint32 level,
                                PRINTER_INFO *ctr,
@@ -2656,38 +2769,24 @@ uint32 _spoolss_fcpn( const POLICY_HND *handle);
 uint32 _spoolss_addjob( const POLICY_HND *handle, uint32 level,
                                const BUFFER *buffer,
                                uint32 buf_size);
-uint32 _spoolss_enumjobs( const POLICY_HND *handle,
-                               uint32 reqfirstjob,
-                               uint32 reqnumofjobs,
-                               uint32 level,
-                               JOB_INFO_CTR *ctr,
-                               uint32 *buf_size,
-                               uint32 *numofjobs);
+uint32 _spoolss_enumjobs( POLICY_HND *handle, uint32 firstjob, uint32 numofjobs, uint32 level,                   
+                         NEW_BUFFER *buffer, uint32 offered,
+                         uint32 *needed, uint32 *returned);
 uint32 _spoolss_schedulejob( const POLICY_HND *handle, uint32 jobid);
 uint32 _spoolss_setjob( const POLICY_HND *handle,
                                uint32 jobid,
                                uint32 level,
                                JOB_INFO *ctr,
                                uint32 command);
-uint32 _spoolss_enumprinterdrivers( const UNISTR2 *name,
-                               const UNISTR2 *environment,
-                               uint32 level,
-                               DRIVER_INFO *ctr,
-                               uint32 *offered,
-                               uint32 *numofdrivers);
+uint32 _spoolss_enumprinterdrivers( UNISTR2 *name, UNISTR2 *environment, uint32 level,
+                                   NEW_BUFFER *buffer, uint32 offered,
+                                   uint32 *needed, uint32 *returned);
 uint32 _new_spoolss_enumforms( const POLICY_HND *handle, uint32 level, 
                               NEW_BUFFER *buffer, uint32 offered, 
                               uint32 *needed, uint32 *numofforms);
-uint32 _spoolss_enumforms( const POLICY_HND *handle,
-                               uint32 level,
-                               FORM_1 **forms_1,
-                               uint32 *offered,
-                               uint32 *numofforms);
-uint32 _spoolss_enumports( const UNISTR2 *name,
-                               uint32 level,
-                               PORT_INFO_CTR *ctr,
-                               uint32 *offered,
-                               uint32 *numofports);
+uint32 _spoolss_enumports( UNISTR2 *name, uint32 level, 
+                          NEW_BUFFER *buffer, uint32 offered, 
+                          uint32 *needed, uint32 *returned);
 uint32 _spoolss_addprinterex( const UNISTR2 *uni_srv_name,
                                uint32 level,
                                const SPOOL_PRINTER_INFO_LEVEL *info,
@@ -2729,17 +2828,12 @@ uint32 _spoolss_setform( const POLICY_HND *handle,
                                const UNISTR2 *uni_name,
                                uint32 level,
                                const FORM *form);
-uint32 _spoolss_enumprintprocessors(const UNISTR2 *name,
-                               const UNISTR2 *environment,
-                               uint32 level,
-                               PRINTPROCESSOR_1 **info_1,
-                               uint32 *offered,
-                               uint32 *numofprintprocessors);
-uint32 _spoolss_enumprintmonitors( const UNISTR2 *name,
-                               uint32 level,
-                               PRINTMONITOR_1 **info_1,
-                               uint32 *offered,
-                               uint32 *numofprintmonitors);
+uint32 _spoolss_enumprintprocessors(UNISTR2 *name, UNISTR2 *environment, uint32 level,
+                                   NEW_BUFFER *buffer, uint32 offered, 
+                                   uint32 *needed, uint32 *returned);
+uint32 _spoolss_enumprintmonitors(UNISTR2 *name,uint32 level,
+                                   NEW_BUFFER *buffer, uint32 offered, 
+                                   uint32 *needed, uint32 *returned);
 uint32 _spoolss_getjob( const POLICY_HND *handle,
                                uint32 jobid,
                                uint32 level,
@@ -2765,109 +2859,6 @@ uint32 lookup_user_rid(char *user_name, uint32 *rid);
 
 BOOL api_wkssvc_rpc(pipes_struct *p, prs_struct *data);
 
-/*The following definitions come from  rpcclient/cmd_lsarpc.c  */
-
-void cmd_lsa_query_info(struct client_info *info);
-void cmd_lsa_lookup_sids(struct client_info *info);
-
-/*The following definitions come from  rpcclient/cmd_netlogon.c  */
-
-void cmd_netlogon_login_test(struct client_info *info);
-
-/*The following definitions come from  rpcclient/cmd_reg.c  */
-
-void cmd_reg_enum(struct client_info *info);
-void cmd_reg_query_key(struct client_info *info);
-void cmd_reg_create_val(struct client_info *info);
-void cmd_reg_delete_val(struct client_info *info);
-void cmd_reg_delete_key(struct client_info *info);
-void cmd_reg_create_key(struct client_info *info);
-void cmd_reg_test_key_sec(struct client_info *info);
-void cmd_reg_get_key_sec(struct client_info *info);
-
-/*The following definitions come from  rpcclient/cmd_samr.c  */
-
-void cmd_sam_ntchange_pwd(struct client_info *info);
-void cmd_sam_test(struct client_info *info);
-void cmd_sam_enum_users(struct client_info *info);
-void cmd_sam_query_user(struct client_info *info);
-void cmd_sam_query_groups(struct client_info *info);
-void cmd_sam_enum_aliases(struct client_info *info);
-
-/*The following definitions come from  rpcclient/cmd_srvsvc.c  */
-
-void cmd_srv_query_info(struct client_info *info);
-void cmd_srv_enum_conn(struct client_info *info);
-void cmd_srv_enum_shares(struct client_info *info);
-void cmd_srv_enum_sess(struct client_info *info);
-void cmd_srv_enum_files(struct client_info *info);
-
-/*The following definitions come from  rpcclient/cmd_wkssvc.c  */
-
-void cmd_wks_query_info(struct client_info *info);
-
-/*The following definitions come from  rpcclient/display.c  */
-
-char *get_file_mode_str(uint32 share_mode);
-char *get_file_oplock_str(uint32 op_type);
-char *get_share_type_str(uint32 type);
-char *get_server_type_str(uint32 type);
-void display_srv_info_101(FILE *out_hnd, enum action_type action,
-               SRV_INFO_101 *sv101);
-void display_srv_info_102(FILE *out_hnd, enum action_type action,SRV_INFO_102 *sv102);
-void display_srv_info_ctr(FILE *out_hnd, enum action_type action,SRV_INFO_CTR *ctr);
-void display_conn_info_0(FILE *out_hnd, enum action_type action,
-               CONN_INFO_0 *info0);
-void display_conn_info_1(FILE *out_hnd, enum action_type action,
-               CONN_INFO_1 *info1, CONN_INFO_1_STR *str1);
-void display_srv_conn_info_0_ctr(FILE *out_hnd, enum action_type action,
-                               SRV_CONN_INFO_0 *ctr);
-void display_srv_conn_info_1_ctr(FILE *out_hnd, enum action_type action,
-                               SRV_CONN_INFO_1 *ctr);
-void display_srv_conn_info_ctr(FILE *out_hnd, enum action_type action,
-                               SRV_CONN_INFO_CTR *ctr);
-void display_share_info_1(FILE *out_hnd, enum action_type action,
-                         SRV_SHARE_INFO_1 *info1);
-void display_share_info_2(FILE *out_hnd, enum action_type action,
-                         SRV_SHARE_INFO_2 *info2);
-void display_srv_share_info_ctr(FILE *out_hnd, enum action_type action,
-                               SRV_SHARE_INFO_CTR *ctr);
-void display_file_info_3(FILE *out_hnd, enum action_type action,
-               FILE_INFO_3 *info3, FILE_INFO_3_STR *str3);
-void display_srv_file_info_3_ctr(FILE *out_hnd, enum action_type action,
-                               SRV_FILE_INFO_3 *ctr);
-void display_srv_file_info_ctr(FILE *out_hnd, enum action_type action,
-                               SRV_FILE_INFO_CTR *ctr);
-void display_server(FILE *out_hnd, enum action_type action,
-                               char *sname, uint32 type, char *comment);
-void display_share(FILE *out_hnd, enum action_type action,
-                               char *sname, uint32 type, char *comment);
-void display_share2(FILE *out_hnd, enum action_type action,
-                               char *sname, uint32 type, char *comment,
-                               uint32 perms, uint32 max_uses, uint32 num_uses,
-                               char *path, char *passwd);
-void display_name(FILE *out_hnd, enum action_type action,
-                               char *sname);
-void display_group_rid_info(FILE *out_hnd, enum action_type action,
-                               uint32 num_gids, DOM_GID *gid);
-void display_alias_name_info(FILE *out_hnd, enum action_type action,
-                               uint32 num_aliases, fstring *alias_name, uint32 *num_als_usrs);
-void display_sam_user_info_21(FILE *out_hnd, enum action_type action, SAM_USER_INFO_21 *usr);
-char *get_sec_mask_str(uint32 type);
-void display_sec_access(FILE *out_hnd, enum action_type action, SEC_ACCESS *info);
-void display_sec_ace(FILE *out_hnd, enum action_type action, SEC_ACE *ace);
-void display_sec_acl(FILE *out_hnd, enum action_type action, SEC_ACL *sec_acl);
-void display_sec_desc(FILE *out_hnd, enum action_type action, SEC_DESC *sec);
-char *get_reg_val_type_str(uint32 type);
-void display_reg_value_info(FILE *out_hnd, enum action_type action,
-                               char *val_name, uint32 val_type, BUFFER2 *value);
-void display_reg_key_info(FILE *out_hnd, enum action_type action,
-                               char *key_name, time_t key_mod_time);
-
-/*The following definitions come from  rpcclient/rpcclient.c  */
-
-void rpcclient_init(void);
-
 /*The following definitions come from  smbd/blocking.c  */
 
 BOOL push_blocking_lock_request( char *inbuf, int length, int lock_timeout, int lock_num);
@@ -3253,6 +3244,19 @@ BOOL unbecome_authenticated_pipe_user(pipes_struct *p);
 void become_root(BOOL save_dir) ;
 void unbecome_root(BOOL restore_dir);
 
+/*The following definitions come from  smbd/vfs.c  */
+
+int vfs_init_default(connection_struct *conn);
+BOOL vfs_init_custom(connection_struct *conn);
+BOOL vfs_directory_exist(connection_struct *conn, char *dname,
+                         SMB_STRUCT_STAT *st);
+BOOL vfs_file_exist(connection_struct *conn,char *fname,SMB_STRUCT_STAT *sbuf);
+ssize_t vfs_write_data(files_struct *fsp,char *buffer,size_t N);
+SMB_OFF_T vfs_transfer_file(int in_fd, files_struct *in_fsp, 
+                           int out_fd, files_struct *out_fsp,
+                           SMB_OFF_T n, char *header, int headlen, int align);
+char *vfs_readdirname(connection_struct *conn, void *p);
+
 /*The following definitions come from  smbd/vfs-wrap.c  */
 
 int vfswrap_dummy_connect(struct vfs_connection_struct *conn, char *service,
@@ -3280,19 +3284,6 @@ int vfswrap_unlink(char *path);
 int vfswrap_chmod(char *path, mode_t mode);
 int vfswrap_utime(char *path, struct utimbuf *times);
 
-/*The following definitions come from  smbd/vfs.c  */
-
-int vfs_init_default(connection_struct *conn);
-BOOL vfs_init_custom(connection_struct *conn);
-BOOL vfs_directory_exist(connection_struct *conn, char *dname,
-                         SMB_STRUCT_STAT *st);
-BOOL vfs_file_exist(connection_struct *conn,char *fname,SMB_STRUCT_STAT *sbuf);
-ssize_t vfs_write_data(files_struct *fsp,char *buffer,size_t N);
-SMB_OFF_T vfs_transfer_file(int in_fd, files_struct *in_fsp, 
-                           int out_fd, files_struct *out_fsp,
-                           SMB_OFF_T n, char *header, int headlen, int align);
-char *vfs_readdirname(connection_struct *conn, void *p);
-
 /*The following definitions come from  smbwrapper/realcalls.c  */
 
 int real_utime(const char *name, struct utimbuf *buf);
index 5aef2f3f63989a46272381de048e3814136c521c..fc8fd041d682b63f0afea25d24a550a95627329c 100755 (executable)
 #define MIN_PRIORITY    1
 #define DEF_PRIORITY    1
 
+/* the flags of the query */
 #define PRINTER_ENUM_DEFAULT           0x00000001
 #define PRINTER_ENUM_LOCAL             0x00000002
 #define PRINTER_ENUM_CONNECTIONS       0x00000004
 #define PRINTER_ENUM_SHARED            0x00000020
 #define PRINTER_ENUM_NETWORK           0x00000040
 
+/* the flags of each printers */
 #define PRINTER_ENUM_EXPAND            0x00004000
 #define PRINTER_ENUM_CONTAINER         0x00008000
-
 #define PRINTER_ENUM_ICONMASK          0x00ff0000
 #define PRINTER_ENUM_ICON1             0x00010000
 #define PRINTER_ENUM_ICON2             0x00020000
@@ -685,10 +686,11 @@ typedef struct printer_info_2
 typedef struct spool_q_enumprinters
 {
        uint32 flags;
+       uint32 servername_ptr;
        UNISTR2 servername;
        uint32 level;
-       BUFFER buffer;
-       uint32 buf_size;
+       NEW_BUFFER *buffer;
+       uint32 offered;
 } SPOOL_Q_ENUMPRINTERS;
 
 typedef struct printer_info_ctr_info
@@ -703,14 +705,10 @@ typedef struct printer_info_ctr_info
 
 typedef struct spool_r_enumprinters
 {
-       uint32 offered;  /* number of bytes offered */
+       NEW_BUFFER *buffer;
        uint32 needed;   /* bytes needed */
-       uint32 level;
-       UNISTR servername;
-       PRINTER_INFO_CTR ctr;
        uint32 returned; /* number of printers */
        uint32 status;
-
 } SPOOL_R_ENUMPRINTERS;
 
 
@@ -905,9 +903,8 @@ typedef struct spool_q_enumjobs
        uint32 firstjob;
        uint32 numofjobs;
        uint32 level;
-       BUFFER buffer;
-       uint32 buf_size;
-
+       NEW_BUFFER *buffer;
+       uint32 offered;
 } SPOOL_Q_ENUMJOBS;
 
 typedef struct job_info_ctr_info
@@ -922,12 +919,10 @@ typedef struct job_info_ctr_info
 
 typedef struct spool_r_enumjobs
 {
-       uint32 level;
-       uint32 offered;
-       JOB_INFO_CTR ctr;
-       uint32 numofjobs;
+       NEW_BUFFER *buffer;
+       uint32 needed;
+       uint32 returned;
        uint32 status;
-
 } SPOOL_R_ENUMJOBS;
 
 typedef struct spool_q_schedulejob
@@ -957,10 +952,11 @@ typedef struct s_port_info_2
 
 typedef struct spool_q_enumports
 {
+       uint32 name_ptr;
        UNISTR2 name;
        uint32 level;
-       BUFFER buffer;
-       uint32 buf_size;
+       NEW_BUFFER *buffer;
+       uint32 offered;
 } SPOOL_Q_ENUMPORTS;
 
 typedef struct port_info_ctr_info
@@ -974,12 +970,10 @@ typedef struct port_info_ctr_info
 
 typedef struct spool_r_enumports
 {
-       uint32 level;
-       PORT_INFO_CTR ctr;
-       uint32 offered;
-       uint32 numofports;
+       NEW_BUFFER *buffer;
+       uint32 needed;   /* bytes needed */
+       uint32 returned; /* number of printers */
        uint32 status;
-
 } SPOOL_R_ENUMPORTS;
 
 #define JOB_CONTROL_PAUSE              1
@@ -1015,22 +1009,21 @@ typedef struct spool_r_setjob
 
 typedef struct spool_q_enumprinterdrivers
 {
+       uint32 name_ptr;
        UNISTR2 name;
+       uint32 environment_ptr;
        UNISTR2 environment;
        uint32 level;
-       BUFFER buffer;
-       uint32 buf_size;
-
+       NEW_BUFFER *buffer;
+       uint32 offered;
 } SPOOL_Q_ENUMPRINTERDRIVERS;
 
 typedef struct spool_r_enumprinterdrivers
 {
-       uint32 level;
-       DRIVER_INFO ctr;
-       uint32 offered;
-       uint32 numofdrivers;
+       NEW_BUFFER *buffer;
+       uint32 needed;
+       uint32 returned;
        uint32 status;
-
 } SPOOL_R_ENUMPRINTERDRIVERS;
 
 typedef struct spool_form_1
@@ -1264,11 +1257,13 @@ typedef struct spool_r_getprinterdriverdirectory
 
 typedef struct spool_q_enumprintprocessors
 {
+       uint32 name_ptr;
        UNISTR2 name;
+       uint32 environment_ptr;
        UNISTR2 environment;
        uint32 level;
-       BUFFER buffer;
-       uint32 buf_size;
+       NEW_BUFFER *buffer;
+       uint32 offered;
 } SPOOL_Q_ENUMPRINTPROCESSORS;
 
 typedef struct printprocessor_1
@@ -1278,10 +1273,9 @@ typedef struct printprocessor_1
 
 typedef struct spool_r_enumprintprocessors
 {
-       uint32 level;
-       PRINTPROCESSOR_1 *info_1;
-       uint32 offered;
-       uint32 numofprintprocessors;
+       NEW_BUFFER *buffer;
+       uint32 needed;
+       uint32 returned;
        uint32 status;
 } SPOOL_R_ENUMPRINTPROCESSORS;
 
@@ -1308,28 +1302,36 @@ typedef struct spool_r_enumprintprocessordatatypes
        uint32 status;
 } SPOOL_R_ENUMPRINTPROCESSORDATATYPES;
 
-typedef struct spool_q_enumprintmonitors
-{
-       UNISTR2 name;
-       uint32 level;
-       BUFFER buffer;
-       uint32 buf_size;
-} SPOOL_Q_ENUMPRINTMONITORS;
-
 typedef struct printmonitor_1
 {
        UNISTR name;
 } PRINTMONITOR_1;
 
-typedef struct spool_r_enumprintmonitors
+typedef struct printmonitor_2
 {
+       UNISTR name;
+       UNISTR environment;
+       UNISTR dll_name;
+} PRINTMONITOR_2;
+
+typedef struct spool_q_enumprintmonitors
+{
+       uint32 name_ptr;
+       UNISTR2 name;
        uint32 level;
-       PRINTMONITOR_1 *info_1;
+       NEW_BUFFER *buffer;
        uint32 offered;
-       uint32 numofprintmonitors;
+} SPOOL_Q_ENUMPRINTMONITORS;
+
+typedef struct spool_r_enumprintmonitors
+{
+       NEW_BUFFER *buffer;
+       uint32 needed;
+       uint32 returned;
        uint32 status;
 } SPOOL_R_ENUMPRINTMONITORS;
 
+
 typedef struct spool_q_enumprinterdata
 {
        POLICY_HND handle;
index 00e052772e6ce7f788043cefa9bbb9c0755d71f0..a880184f3df5e5ec83fe54d05b98dad4475d88d1 100644 (file)
@@ -31,7 +31,7 @@ static BOOL parse_form_entry(char *line, nt_forms_struct *buf)
                count++;
        }
 
-       DEBUG(6,("Found [%d] tokens\n", count));
+       DEBUG(106,("Found [%d] tokens\n", count));
 
        StrnCpy(buf->name,tok[NAMETOK],sizeof(buf->name)-1);
        buf->flag=atoi(tok[FLAGTOK]);
@@ -65,7 +65,7 @@ int get_ntforms(nt_forms_struct **list)
 
        while ( fgets(line, sizeof(pstring), f) )
        {
-               DEBUG(5,("%s\n",line));
+               DEBUG(105,("%s\n",line));
                
                *list = Realloc(*list, sizeof(nt_forms_struct)*(total+1));
                if (! *list)
@@ -82,7 +82,7 @@ int get_ntforms(nt_forms_struct **list)
        }    
        fclose(f);
 
-       DEBUG(4,("%d info lines on %d\n",total, grandtotal));
+       DEBUG(104,("%d info lines on %d\n",total, grandtotal));
 
        return(total);
 }
@@ -100,7 +100,7 @@ int write_ntforms(nt_forms_struct **list, int number)
 
        *line=0;
 
-       DEBUG(6,("write_ntforms\n"));
+       DEBUG(106,("write_ntforms\n"));
 
        if((f = sys_fopen(file, "w")) == NULL)
        {
@@ -115,11 +115,11 @@ int write_ntforms(nt_forms_struct **list, int number)
                       (*list)[i].flag, (*list)[i].width, (*list)[i].length,
                       (*list)[i].left, (*list)[i].top, (*list)[i].right, (*list)[i].bottom);
 
-              DEBUGADD(7,("adding entry [%s]\n", (*list)[i].name));
+              DEBUGADD(107,("adding entry [%s]\n", (*list)[i].name));
        }
 
        fclose(f);
-       DEBUGADD(6,("closing file\n"));
+       DEBUGADD(106,("closing file\n"));
        return(total);
 }
 
@@ -145,7 +145,7 @@ void add_a_form(nt_forms_struct **list, const FORM *form, int *count)
        {
                if (!strncmp((*list)[n].name, form_name, strlen(form_name)))
                {
-                       DEBUG(3, ("NT workaround, [%s] already exists\n", form_name));
+                       DEBUG(103, ("NT workaround, [%s] already exists\n", form_name));
                        update=True;
                }
        }
@@ -175,10 +175,10 @@ void update_a_form(nt_forms_struct **list, const FORM *form, int count)
        fstring form_name;
        unistr2_to_ascii(form_name, &(form->name), sizeof(form_name)-1);
 
-       DEBUG(6, ("[%s]\n", form_name));
+       DEBUG(106, ("[%s]\n", form_name));
        for (n=0; n<count; n++)
        {
-               DEBUGADD(6, ("n [%d]:[%s]\n", n, (*list)[n].name));
+               DEBUGADD(106, ("n [%d]:[%s]\n", n, (*list)[n].name));
                if (!strncmp((*list)[n].name, form_name, strlen(form_name)))
                        break;
        }
@@ -209,7 +209,7 @@ int get_ntdrivers(fstring **list, char *architecture)
        int match_len;
        int total=0;
 
-       DEBUG(5,("Getting the driver list from directory: [%s]\n", lp_nt_drivers_file()));
+       DEBUG(105,("Getting the driver list from directory: [%s]\n", lp_nt_drivers_file()));
        
        *list=NULL;
        dirp = opendir(lp_nt_drivers_file());
@@ -228,13 +228,13 @@ int get_ntdrivers(fstring **list, char *architecture)
        {
                if (strncmp(dpname, name_match, match_len)==0)
                {
-                       DEBUGADD(7,("Found: [%s]\n", dpname));
+                       DEBUGADD(107,("Found: [%s]\n", dpname));
                        
                        fstrcpy(driver_name, dpname+match_len);
                        all_string_sub(driver_name, "#", "/", 0);
                        *list = Realloc(*list, sizeof(fstring)*(total+1));
                        StrnCpy((*list)[total], driver_name, strlen(driver_name));
-                       DEBUGADD(6,("Added: [%s]\n", driver_name));             
+                       DEBUGADD(106,("Added: [%s]\n", driver_name));           
                        total++;
                }
        }
@@ -266,20 +266,20 @@ void get_short_archi(char *short_archi, char *long_archi)
        
        int i=-1;
 
-       DEBUG(7,("Getting architecture dependant directory\n"));
+       DEBUG(107,("Getting architecture dependant directory\n"));
        do {
                i++;
        } while ( (archi_table[i].long_archi!=NULL ) && strncmp(long_archi, archi_table[i].long_archi, strlen(long_archi)) );
 
        if (archi_table[i].long_archi==NULL)
        {
-               DEBUGADD(7,("Unknown architecture [%s] !\n", long_archi));
+               DEBUGADD(107,("Unknown architecture [%s] !\n", long_archi));
        }
        StrnCpy (short_archi, archi_table[i].short_archi, strlen(archi_table[i].short_archi));
 
-       DEBUGADD(8,("index: [%d]\n", i));
-       DEBUGADD(8,("long architecture: [%s]\n", long_archi));
-       DEBUGADD(8,("short architecture: [%s]\n", short_archi));
+       DEBUGADD(108,("index: [%d]\n", i));
+       DEBUGADD(108,("long architecture: [%s]\n", long_archi));
+       DEBUGADD(108,("short architecture: [%s]\n", short_archi));
 }
 
 /****************************************************************************
@@ -471,7 +471,7 @@ static uint32 dump_a_printer_driver(NT_PRINTER_DRIVER_INFO_LEVEL driver, uint32
        NT_PRINTER_DRIVER_INFO_LEVEL_3 *info3;
        char **dependentfiles;  
        
-       DEBUG(6,("Dumping printer driver at level [%d]\n", level));
+       DEBUG(106,("Dumping printer driver at level [%d]\n", level));
        
        switch (level)
        {
@@ -479,28 +479,28 @@ static uint32 dump_a_printer_driver(NT_PRINTER_DRIVER_INFO_LEVEL driver, uint32
                {
                        if (driver.info_3 == NULL)
                        {
-                               DEBUGADD(3,("NULL pointer, memory not alloced ?\n"));
+                               DEBUGADD(103,("NULL pointer, memory not alloced ?\n"));
                                success=5;
                        }
                        else
                        {
                                info3=driver.info_3;
                        
-                               DEBUGADD(6,("version:[%d]\n",         info3->cversion));
-                               DEBUGADD(6,("name:[%s]\n",            info3->name));
-                               DEBUGADD(6,("environment:[%s]\n",     info3->environment));
-                               DEBUGADD(6,("driverpath:[%s]\n",      info3->driverpath));
-                               DEBUGADD(6,("datafile:[%s]\n",        info3->datafile));
-                               DEBUGADD(6,("configfile:[%s]\n",      info3->configfile));
-                               DEBUGADD(6,("helpfile:[%s]\n",        info3->helpfile));
-                               DEBUGADD(6,("monitorname:[%s]\n",     info3->monitorname));
-                               DEBUGADD(6,("defaultdatatype:[%s]\n", info3->defaultdatatype));
+                               DEBUGADD(106,("version:[%d]\n",         info3->cversion));
+                               DEBUGADD(106,("name:[%s]\n",            info3->name));
+                               DEBUGADD(106,("environment:[%s]\n",     info3->environment));
+                               DEBUGADD(106,("driverpath:[%s]\n",      info3->driverpath));
+                               DEBUGADD(106,("datafile:[%s]\n",        info3->datafile));
+                               DEBUGADD(106,("configfile:[%s]\n",      info3->configfile));
+                               DEBUGADD(106,("helpfile:[%s]\n",        info3->helpfile));
+                               DEBUGADD(106,("monitorname:[%s]\n",     info3->monitorname));
+                               DEBUGADD(106,("defaultdatatype:[%s]\n", info3->defaultdatatype));
                                
                                dependentfiles=info3->dependentfiles;
        
                                while ( **dependentfiles != '\0' )
                                {
-                                       DEBUGADD(6,("dependentfile:[%s]\n", *dependentfiles));
+                                       DEBUGADD(106,("dependentfile:[%s]\n", *dependentfiles));
                                        dependentfiles++;
                                }
                                success=0;
@@ -676,7 +676,7 @@ static void dissect_and_fill_a_param(NT_PRINTER_PARAM *param, char *v)
        char *tok[5];
        int count = 0;
 
-       DEBUG(5,("dissect_and_fill_a_param\n"));        
+       DEBUG(105,("dissect_and_fill_a_param\n"));      
                
        tok[count] = strtok(v,"#");
        count++;
@@ -693,7 +693,7 @@ static void dissect_and_fill_a_param(NT_PRINTER_PARAM *param, char *v)
        strhex_to_str(param->data, 2*(param->data_len), tok[3]);                
        param->next=NULL;       
 
-       DEBUGADD(5,("value:[%s], len:[%d]\n", param->value, param->data_len));
+       DEBUGADD(105,("value:[%s], len:[%d]\n", param->value, param->data_len));
 }
 
 /****************************************************************************
@@ -703,10 +703,10 @@ used when reading from disk.
 ****************************************************************************/
 void dump_a_param(NT_PRINTER_PARAM *param)
 {
-       DEBUG(5,("dump_a_param\n"));
-       DEBUGADD(6,("value [%s]\n", param->value));
-       DEBUGADD(6,("type [%d]\n", param->type));
-       DEBUGADD(6,("data len [%d]\n", param->data_len));
+       DEBUG(105,("dump_a_param\n"));
+       DEBUGADD(106,("value [%s]\n", param->value));
+       DEBUGADD(106,("type [%d]\n", param->type));
+       DEBUGADD(106,("data len [%d]\n", param->data_len));
 }
 
 /****************************************************************************
@@ -715,7 +715,7 @@ BOOL add_a_specific_param(NT_PRINTER_INFO_LEVEL_2 *info_2, NT_PRINTER_PARAM *par
 {
        NT_PRINTER_PARAM *current;
        
-       DEBUG(8,("add_a_specific_param\n"));    
+       DEBUG(108,("add_a_specific_param\n"));  
 
        param->next=NULL;
        
@@ -749,10 +749,10 @@ BOOL unlink_specific_param_if_exist(NT_PRINTER_INFO_LEVEL_2 *info_2, NT_PRINTER_
        if ( !strcmp(current->value, param->value) && 
            (strlen(current->value)==strlen(param->value)) )
        {
-               DEBUG(9,("deleting first value\n"));
+               DEBUG(109,("deleting first value\n"));
                info_2->specific=current->next;
                free(current);
-               DEBUG(9,("deleted first value\n"));
+               DEBUG(109,("deleted first value\n"));
                return (True);
        }
 
@@ -763,10 +763,10 @@ BOOL unlink_specific_param_if_exist(NT_PRINTER_INFO_LEVEL_2 *info_2, NT_PRINTER_
                if (!strcmp(current->value, param->value) &&
                    strlen(current->value)==strlen(param->value) )
                {
-                       DEBUG(9,("deleting current value\n"));
+                       DEBUG(109,("deleting current value\n"));
                        previous->next=current->next;
                        free(current);
-                       DEBUG(9,("deleted current value\n"));
+                       DEBUG(109,("deleted current value\n"));
                        return(True);
                }
                
@@ -835,7 +835,7 @@ static uint32 get_a_printer_2(NT_PRINTER_INFO_LEVEL_2 **info_ptr, fstring sharen
                
                /* don't check if v==NULL as an empty arg is valid */
                
-               DEBUGADD(15, ("[%s]:[%s]\n", p, v));
+               DEBUGADD(115, ("[%s]:[%s]\n", p, v));
 
                /*
                 * The PRINTER_INFO_2 fields
@@ -1008,7 +1008,7 @@ static uint32 dump_a_printer(NT_PRINTER_INFO_LEVEL printer, uint32 level)
        uint32 success;
        NT_PRINTER_INFO_LEVEL_2 *info2;
        
-       DEBUG(6,("Dumping printer at level [%d]\n", level));
+       DEBUG(106,("Dumping printer at level [%d]\n", level));
        
        switch (level)
        {
@@ -1023,26 +1023,26 @@ static uint32 dump_a_printer(NT_PRINTER_INFO_LEVEL printer, uint32 level)
                        {
                                info2=printer.info_2;
                        
-                               DEBUGADD(6,("attributes:[%d]\n",       info2->attributes));
-                               DEBUGADD(6,("priority:[%d]\n",         info2->priority));
-                               DEBUGADD(6,("default_priority:[%d]\n", info2->default_priority));
-                               DEBUGADD(6,("starttime:[%d]\n",        info2->starttime));
-                               DEBUGADD(6,("untiltime:[%d]\n",        info2->untiltime));
-                               DEBUGADD(6,("status:[%d]\n",           info2->status));
-                               DEBUGADD(6,("cjobs:[%d]\n",            info2->cjobs));
-                               DEBUGADD(6,("averageppm:[%d]\n",       info2->averageppm));
-
-                               DEBUGADD(6,("servername:[%s]\n",       info2->servername));
-                               DEBUGADD(6,("printername:[%s]\n",      info2->printername));
-                               DEBUGADD(6,("sharename:[%s]\n",        info2->sharename));
-                               DEBUGADD(6,("portname:[%s]\n",         info2->portname));
-                               DEBUGADD(6,("drivername:[%s]\n",       info2->drivername));
-                               DEBUGADD(6,("comment:[%s]\n",          info2->comment));
-                               DEBUGADD(6,("location:[%s]\n",         info2->location));
-                               DEBUGADD(6,("sepfile:[%s]\n",          info2->sepfile));
-                               DEBUGADD(6,("printprocessor:[%s]\n",   info2->printprocessor));
-                               DEBUGADD(6,("datatype:[%s]\n",         info2->datatype));
-                               DEBUGADD(6,("parameters:[%s]\n",       info2->parameters));
+                               DEBUGADD(106,("attributes:[%d]\n",       info2->attributes));
+                               DEBUGADD(106,("priority:[%d]\n",         info2->priority));
+                               DEBUGADD(106,("default_priority:[%d]\n", info2->default_priority));
+                               DEBUGADD(106,("starttime:[%d]\n",        info2->starttime));
+                               DEBUGADD(106,("untiltime:[%d]\n",        info2->untiltime));
+                               DEBUGADD(106,("status:[%d]\n",           info2->status));
+                               DEBUGADD(106,("cjobs:[%d]\n",            info2->cjobs));
+                               DEBUGADD(106,("averageppm:[%d]\n",       info2->averageppm));
+
+                               DEBUGADD(106,("servername:[%s]\n",       info2->servername));
+                               DEBUGADD(106,("printername:[%s]\n",      info2->printername));
+                               DEBUGADD(106,("sharename:[%s]\n",        info2->sharename));
+                               DEBUGADD(106,("portname:[%s]\n",         info2->portname));
+                               DEBUGADD(106,("drivername:[%s]\n",       info2->drivername));
+                               DEBUGADD(106,("comment:[%s]\n",          info2->comment));
+                               DEBUGADD(106,("location:[%s]\n",         info2->location));
+                               DEBUGADD(106,("sepfile:[%s]\n",          info2->sepfile));
+                               DEBUGADD(106,("printprocessor:[%s]\n",   info2->printprocessor));
+                               DEBUGADD(106,("datatype:[%s]\n",         info2->datatype));
+                               DEBUGADD(106,("parameters:[%s]\n",       info2->parameters));
                                success=0;
                        }
                        break;
@@ -1114,7 +1114,7 @@ uint32 get_a_printer(NT_PRINTER_INFO_LEVEL *printer, uint32 level, fstring share
 uint32 free_a_printer(NT_PRINTER_INFO_LEVEL printer, uint32 level)
 {
        uint32 success;
-       DEBUG(4,("freeing a printer at level [%d]\n", level));
+       DEBUG(104,("freeing a printer at level [%d]\n", level));
        
        switch (level)
        {
@@ -1124,7 +1124,7 @@ uint32 free_a_printer(NT_PRINTER_INFO_LEVEL printer, uint32 level)
                        {
                                if ((printer.info_2)->devmode != NULL)
                                {
-                                       DEBUG(6,("deleting DEVMODE\n"));
+                                       DEBUG(106,("deleting DEVMODE\n"));
                                        if ((printer.info_2)->devmode->private !=NULL )
                                                free((printer.info_2)->devmode->private);
                                        free((printer.info_2)->devmode);
@@ -1140,7 +1140,7 @@ uint32 free_a_printer(NT_PRINTER_INFO_LEVEL printer, uint32 level)
                                        while ( param != NULL)
                                        {
                                                next_param=param->next;
-                                               DEBUG(6,("deleting param [%s]\n", param->value));
+                                               DEBUG(106,("deleting param [%s]\n", param->value));
                                                free(param->data);
                                                free(param);
                                                param=next_param;
@@ -1168,7 +1168,7 @@ uint32 free_a_printer(NT_PRINTER_INFO_LEVEL printer, uint32 level)
 uint32 add_a_printer_driver(NT_PRINTER_DRIVER_INFO_LEVEL driver, uint32 level)
 {
        uint32 success;
-       DEBUG(4,("adding a printer at level [%d]\n", level));
+       DEBUG(104,("adding a printer at level [%d]\n", level));
        dump_a_printer_driver(driver, level);
        
        switch (level)
@@ -1293,7 +1293,7 @@ BOOL get_specific_param(NT_PRINTER_INFO_LEVEL printer, uint32 level,
        /* right now that's enough ! */ 
        NT_PRINTER_PARAM *param;
        
-       DEBUG(5, ("get_specific_param\n"));
+       DEBUG(105, ("get_specific_param\n"));
        
        param=printer.info_2->specific;
                
@@ -1306,7 +1306,7 @@ BOOL get_specific_param(NT_PRINTER_INFO_LEVEL printer, uint32 level,
                param=param->next;
        }
        
-       DEBUG(6, ("found one param\n"));
+       DEBUG(106, ("found one param\n"));
        if (param != NULL)
        {
                /* exited because it exist */
@@ -1316,10 +1316,10 @@ BOOL get_specific_param(NT_PRINTER_INFO_LEVEL printer, uint32 level,
                memcpy(*data, param->data, param->data_len);
                *len=param->data_len;
 
-               DEBUG(6, ("exit of get_specific_param:true\n"));
+               DEBUG(106, ("exit of get_specific_param:true\n"));
                return (True);
        }
-       DEBUG(6, ("exit of get_specific_param:false\n"));
+       DEBUG(106, ("exit of get_specific_param:false\n"));
        return (False);
 }
 
index 24eff1b7799821c20e95dc495504c6c4e9213a0f..5d0ea832c80bc64028e7d3f2b5635561f0622872 100644 (file)
@@ -150,15 +150,13 @@ BOOL prs_grow(prs_struct *ps, uint32 extra_space)
                                (unsigned int)extra_space));
                return False;
        }
-
+       
        /*
         * Decide how much extra space we really need.
         */
 
        extra_space -= (ps->buffer_size - ps->data_offset);
-
        if(ps->buffer_size == 0) {
-
                /*
                 * Ensure we have at least a PDU's length, or extra_space, whichever
                 * is greater.
@@ -172,21 +170,18 @@ BOOL prs_grow(prs_struct *ps, uint32 extra_space)
                }
                memset(new_data, '\0', new_size );
        } else {
-
                /*
                 * If the current buffer size is bigger than the space needed, just 
                 * double it, else add extra_space.
                 */
+               new_size = MAX(ps->buffer_size*2, ps->buffer_size + extra_space);               
 
-               new_size = MAX(ps->buffer_size*2, ps->buffer_size + extra_space);
-
-               if((new_data = Realloc(ps->data_p, new_size)) == NULL) {
+               if ((new_data = Realloc(ps->data_p, new_size)) == NULL) {
                        DEBUG(0,("prs_grow: Realloc failure for size %u.\n",
                                (unsigned int)new_size));
                        return False;
                }
        }
-
        ps->buffer_size = new_size;
        ps->data_p = new_data;
 
@@ -286,12 +281,12 @@ BOOL prs_append_prs_data(prs_struct *dst, prs_struct *src)
  Append some data from one parse_struct into another.
  ********************************************************************/
 
-BOOL prs_append_some_prs_data(prs_struct *dst, prs_struct *src, uint32 len)
-{
+BOOL prs_append_some_prs_data(prs_struct *dst, prs_struct *src, int32 start, uint32 len)
+{      
        if(!prs_grow(dst, len))
                return False;
-
-       memcpy(&dst->data_p[dst->data_offset], prs_data_p(src), (size_t)len);
+       
+       memcpy(&dst->data_p[dst->data_offset], prs_data_p(src)+start, (size_t)len);
        dst->data_offset += len;
 
        return True;
index de998267b37f31d2c79d6faebd8e005878de733f..66fa2f1da5aa4729abc2cadb27c484d32d74b6bf 100644 (file)
@@ -825,9 +825,11 @@ BOOL spoolss_io_q_closeprinter(char *desc, SPOOL_Q_CLOSEPRINTER *q_u, prs_struct
        prs_debug(ps, depth, desc, "spoolss_io_q_closeprinter");
        depth++;
 
-       prs_align(ps);
+       if (!prs_align(ps))
+               return False;
 
-       smb_io_prt_hnd("printer handle",&(q_u->handle),ps,depth);
+       if (!smb_io_prt_hnd("printer handle",&q_u->handle,ps,depth))
+               return False;
 
        return True;
 }
@@ -841,12 +843,15 @@ BOOL spoolss_io_r_closeprinter(char *desc, SPOOL_R_CLOSEPRINTER *r_u, prs_struct
 {
        prs_debug(ps, depth, desc, "spoolss_io_r_closeprinter");
        depth++;
-       prs_align(ps);
-
-       smb_io_prt_hnd("printer handle",&(r_u->handle),ps,depth);
-       prs_uint32("status", ps, depth, &(r_u->status));
        
+       if (!prs_align(ps))
+               return False;
 
+       if (!smb_io_prt_hnd("printer handle",&r_u->handle,ps,depth))
+               return False;
+       if (!prs_uint32("status", ps, depth, &r_u->status))
+               return False;
+       
        return True;
 }
 
@@ -1240,8 +1245,7 @@ static BOOL new_smb_io_relstr(char *desc, NEW_BUFFER *buffer, int depth, UNISTR
 {
        prs_struct *ps=&(buffer->prs);
        
-       if (MARSHALLING(ps))
-       {
+       if (MARSHALLING(ps)) {
                uint32 struct_offset = prs_offset(ps);
                uint32 relative_offset;
                
@@ -1254,13 +1258,12 @@ static BOOL new_smb_io_relstr(char *desc, NEW_BUFFER *buffer, int depth, UNISTR
 
                prs_set_offset(ps, struct_offset);
                
-               relative_offset=buffer->string_at_end-buffer->struct_start;
+               relative_offset=buffer->string_at_end - buffer->struct_start;
                /* write its offset */
                if (!prs_uint32("offset", ps, depth, &relative_offset))
                        return False;
        }
-       else
-       {
+       else {
                uint32 old_offset;
                
                /* read the offset */
@@ -1284,6 +1287,67 @@ static BOOL new_smb_io_relstr(char *desc, NEW_BUFFER *buffer, int depth, UNISTR
  * write a array UNICODE strings and its relative pointer.
  * used by 2 RPC structs
  ********************************************************************/
+static BOOL new_smb_io_relarraystr(char *desc, NEW_BUFFER *buffer, int depth, UNISTR ***string)
+{
+       prs_struct *ps=&(buffer->prs);
+       
+       if (MARSHALLING(ps)) {
+               uint32 struct_offset = prs_offset(ps);
+               uint32 relative_offset;
+               int i=0;
+       
+               while ( (*string)[i]!=0x0000 )
+                       i++;
+               i--;
+
+               /* count the ending NULL of the array */
+               buffer->string_at_end -= 2;
+
+               /* jfm: FIXME: write a (uint16) 0 for the ending NULL */
+               
+               do
+               {
+                       buffer->string_at_end -= 2*(str_len_uni((*string)[i])+1);
+                       prs_set_offset(ps, buffer->string_at_end);
+
+                       /* write the string */
+                       if (!spoolss_smb_io_unistr(desc, (*string)[i], ps, depth))
+                               return False;
+               
+                       i--;
+               }
+               while (i>=0);
+               
+               prs_set_offset(ps, struct_offset);
+               
+               relative_offset=buffer->string_at_end - buffer->struct_start;
+               /* write its offset */
+               if (!prs_uint32("offset", ps, depth, &relative_offset))
+                       return False;
+       }
+       else {
+               uint32 old_offset;
+               
+               /* read the offset */
+               if (!prs_uint32("offset", ps, depth, &(buffer->string_at_end)))
+                       return False;
+
+               old_offset = prs_offset(ps);
+               prs_set_offset(ps, buffer->string_at_end);
+
+               /* read the string */
+
+               /* jfm: FIXME: alloc memory and read all the strings until the string is NULL */
+
+/*
+               if (!spoolss_smb_io_unistr(desc, string, ps, depth))
+                       return False;
+*/
+               prs_set_offset(ps, old_offset);
+       }
+       return True;
+}
+
 static BOOL smb_io_relarraystr(char *desc, prs_struct *ps, int depth, UNISTR ***buffer,
                    uint32 *start_offset, uint32 *end_offset)
 {
@@ -1321,9 +1385,54 @@ static BOOL smb_io_relarraystr(char *desc, prs_struct *ps, int depth, UNISTR ***
 }
 
 /*******************************************************************
- * write a DEVMODE struct and its relative pointer.
- * used by all the RPC structs passing a buffer
- ********************************************************************/
+ Parse a DEVMODE structure and its relative pointer.
+********************************************************************/
+static BOOL new_smb_io_reldevmode(char *desc, NEW_BUFFER *buffer, int depth, DEVICEMODE *devmode)
+{
+       prs_struct *ps=&(buffer->prs);
+
+       prs_debug(ps, depth, desc, "new_smb_io_reldevmode");
+       depth++;
+
+       if (MARSHALLING(ps)) {
+               uint32 struct_offset = prs_offset(ps);
+               uint32 relative_offset;
+               
+               buffer->string_at_end -= (devmode->size+devmode->driverextra);
+               
+               prs_set_offset(ps, buffer->string_at_end);
+               
+               /* write the DEVMODE */
+               if (!spoolss_io_devmode(desc, ps, depth, devmode))
+                       return False;
+
+               prs_set_offset(ps, struct_offset);
+               
+               relative_offset=buffer->string_at_end - buffer->struct_start;
+               /* write its offset */
+               if (!prs_uint32("offset", ps, depth, &relative_offset))
+                       return False;
+       }
+       else {
+               uint32 old_offset;
+               
+               /* read the offset */
+               if (!prs_uint32("offset", ps, depth, &(buffer->string_at_end)))
+                       return False;
+
+               old_offset = prs_offset(ps);
+               prs_set_offset(ps, buffer->string_at_end + buffer->struct_start);
+
+               /* read the string */
+               if (!spoolss_io_devmode(desc, ps, depth, devmode))
+                       return False;
+
+               prs_set_offset(ps, old_offset);
+       }
+       return True;
+}
+
+
 static BOOL smb_io_reldevmode(char *desc, prs_struct *ps, int depth, DEVICEMODE *devmode,
                    uint32 *start_offset, uint32 *end_offset)
 {
@@ -1392,76 +1501,112 @@ static BOOL smb_io_printer_info_0(char *desc, PRINTER_INFO_0 *info, prs_struct *
 }
 
 /*******************************************************************
+ Parse a PRINTER_INFO_1 structure.
 ********************************************************************/  
-static BOOL smb_io_printer_info_1(char *desc, PRINTER_INFO_1 *info, prs_struct *ps, int depth, 
-                                  uint32 *start_offset, uint32 *end_offset)
+BOOL new_smb_io_printer_info_1(char *desc, NEW_BUFFER *buffer, PRINTER_INFO_1 *info, int depth)
 {
-       prs_debug(ps, depth, desc, "smb_io_printer_info_1");
+       prs_struct *ps=&(buffer->prs);
+
+       prs_debug(ps, depth, desc, "new_smb_io_printer_info_1");
        depth++;        
-       *start_offset=prs_offset(ps);
        
-       prs_uint32("flags", ps, depth, &(info->flags));
-       smb_io_relstr("description",ps, depth, &(info->description), start_offset, end_offset);
-       smb_io_relstr("name",ps, depth, &(info->name), start_offset, end_offset);
-       smb_io_relstr("comment",ps, depth, &(info->comment), start_offset, end_offset); 
+       buffer->struct_start=prs_offset(ps);
+
+       if (!prs_uint32("flags", ps, depth, &info->flags))
+               return False;
+       if (!new_smb_io_relstr("description", buffer, depth, &info->description))
+               return False;
+       if (!new_smb_io_relstr("name", buffer, depth, &info->name))
+               return False;
+       if (!new_smb_io_relstr("comment", buffer, depth, &info->comment))
+               return False;   
 
        return True;
 }
 
 /*******************************************************************
+ Parse a PRINTER_INFO_2 structure.
 ********************************************************************/  
-static BOOL smb_io_printer_info_2(char *desc, PRINTER_INFO_2 *info, prs_struct *ps, int depth, 
-                                  uint32 *start_offset, uint32 *end_offset)
+BOOL new_smb_io_printer_info_2(char *desc, NEW_BUFFER *buffer, PRINTER_INFO_2 *info, int depth)
 {
+       /* hack for the SEC DESC */
        uint32 pipo=0;
-       uint32 devmode_offset;
-       uint32 backup_offset;
 
-       prs_debug(ps, depth, desc, "smb_io_printer_info_2");
+       prs_struct *ps=&(buffer->prs);
+
+       prs_debug(ps, depth, desc, "new_smb_io_printer_info_2");
        depth++;        
-       *start_offset=prs_offset(ps);
        
-       smb_io_relstr("servername",    ps, depth, &(info->servername), start_offset, end_offset);
-       smb_io_relstr("printername",   ps, depth, &(info->printername), start_offset, end_offset);
-       smb_io_relstr("sharename",     ps, depth, &(info->sharename), start_offset, end_offset);
-       smb_io_relstr("portname",      ps, depth, &(info->portname), start_offset, end_offset);
-       smb_io_relstr("drivername",    ps, depth, &(info->drivername), start_offset, end_offset);
-       smb_io_relstr("comment",       ps, depth, &(info->comment), start_offset, end_offset);
-       smb_io_relstr("location",      ps, depth, &(info->location), start_offset, end_offset);
-
-       devmode_offset=prs_offset(ps);
-       prs_set_offset(ps, prs_offset(ps)+4);
+       buffer->struct_start=prs_offset(ps);
        
-       smb_io_relstr("sepfile",       ps, depth, &(info->sepfile), start_offset, end_offset);
-       smb_io_relstr("printprocessor",ps, depth, &(info->printprocessor), start_offset, end_offset);
-       smb_io_relstr("datatype",      ps, depth, &(info->datatype), start_offset, end_offset);
-       smb_io_relstr("parameters",    ps, depth, &(info->parameters), start_offset, end_offset);
-
-       prs_uint32("security descriptor", ps, depth, &(pipo));
-
-       prs_uint32("attributes",       ps, depth, &(info->attributes));
-       prs_uint32("priority",         ps, depth, &(info->priority));
-       prs_uint32("defpriority",      ps, depth, &(info->defaultpriority));
-       prs_uint32("starttime",        ps, depth, &(info->starttime));
-       prs_uint32("untiltime",        ps, depth, &(info->untiltime));
-       prs_uint32("status",           ps, depth, &(info->status));
-       prs_uint32("jobs",             ps, depth, &(info->cjobs));
-       prs_uint32("averageppm",       ps, depth, &(info->averageppm));
+       if (!new_smb_io_relstr("servername", buffer, depth, &info->servername))
+               return False;
+       if (!new_smb_io_relstr("printername", buffer, depth, &info->printername))
+               return False;
+       if (!new_smb_io_relstr("sharename", buffer, depth, &info->sharename))
+               return False;
+       if (!new_smb_io_relstr("portname", buffer, depth, &info->portname))
+               return False;
+       if (!new_smb_io_relstr("drivername", buffer, depth, &info->drivername))
+               return False;
+       if (!new_smb_io_relstr("comment", buffer, depth, &info->comment))
+               return False;
+       if (!new_smb_io_relstr("location", buffer, depth, &info->location))
+               return False;
 
-       /* 
-         I'm not sure if putting the devmode at the end the struct is worth it
-         but NT does it
-        */
-       backup_offset=prs_offset(ps);
-       prs_set_offset(ps, devmode_offset);
-       smb_io_reldevmode("devmode",   ps, depth, info->devmode, start_offset, end_offset);
-       prs_set_offset(ps, backup_offset);
+       /* NT parses the DEVMODE at the end of the struct */
+       if (!new_smb_io_reldevmode("devmode", buffer, depth, info->devmode))
+               return False;
+       
+       if (!new_smb_io_relstr("sepfile", buffer, depth, &info->sepfile))
+               return False;
+       if (!new_smb_io_relstr("printprocessor", buffer, depth, &info->printprocessor))
+               return False;
+       if (!new_smb_io_relstr("datatype", buffer, depth, &info->datatype))
+               return False;
+       if (!new_smb_io_relstr("parameters", buffer, depth, &info->parameters))
+               return False;
+
+       if (!prs_uint32("security descriptor", ps, depth, &pipo))
+               return False;
+       if (!prs_uint32("attributes", ps, depth, &info->attributes))
+               return False;
+       if (!prs_uint32("priority", ps, depth, &info->priority))
+               return False;
+       if (!prs_uint32("defpriority", ps, depth, &info->defaultpriority))
+               return False;
+       if (!prs_uint32("starttime", ps, depth, &info->starttime))
+               return False;
+       if (!prs_uint32("untiltime", ps, depth, &info->untiltime))
+               return False;
+       if (!prs_uint32("status", ps, depth, &info->status))
+               return False;
+       if (!prs_uint32("jobs", ps, depth, &info->cjobs))
+               return False;
+       if (!prs_uint32("averageppm", ps, depth, &info->averageppm))
+               return False;
 
        return True;
 }
 
 /*******************************************************************
-********************************************************************/  
+ Parse a DRIVER_INFO_1 structure.
+********************************************************************/
+BOOL new_smb_io_printer_driver_info_1(char *desc, NEW_BUFFER *buffer, DRIVER_INFO_1 *info, int depth) 
+{
+       prs_struct *ps=&(buffer->prs);
+
+       prs_debug(ps, depth, desc, "new_smb_io_printer_driver_info_1");
+       depth++;        
+       
+       buffer->struct_start=prs_offset(ps);
+
+       if (!new_smb_io_relstr("name", buffer, depth, &info->name))
+               return False;
+
+       return True;
+}
+
 static BOOL smb_io_printer_driver_info_1(char *desc, DRIVER_INFO_1 *info, prs_struct *ps, int depth, 
                                          uint32 *start_offset, uint32 *end_offset)
 {
@@ -1475,7 +1620,33 @@ static BOOL smb_io_printer_driver_info_1(char *desc, DRIVER_INFO_1 *info, prs_st
 }
 
 /*******************************************************************
-********************************************************************/  
+ Parse a DRIVER_INFO_2 structure.
+********************************************************************/
+BOOL new_smb_io_printer_driver_info_2(char *desc, NEW_BUFFER *buffer, DRIVER_INFO_2 *info, int depth) 
+{
+       prs_struct *ps=&(buffer->prs);
+
+       prs_debug(ps, depth, desc, "new_smb_io_printer_driver_info_2");
+       depth++;        
+       
+       buffer->struct_start=prs_offset(ps);
+
+       if (!prs_uint32("version", ps, depth, &info->version))
+               return False;
+       if (!new_smb_io_relstr("name", buffer, depth, &info->name))
+               return False;
+       if (!new_smb_io_relstr("architecture", buffer, depth, &info->architecture))
+               return False;
+       if (!new_smb_io_relstr("driverpath", buffer, depth, &info->driverpath))
+               return False;
+       if (!new_smb_io_relstr("datafile", buffer, depth, &info->datafile))
+               return False;
+       if (!new_smb_io_relstr("configfile", buffer, depth, &info->configfile))
+               return False;
+
+       return True;
+}
+
 static BOOL smb_io_printer_driver_info_2(char *desc, DRIVER_INFO_2 *info,prs_struct *ps, int depth, 
                                          uint32 *start_offset, uint32 *end_offset)
 {
@@ -1494,7 +1665,43 @@ static BOOL smb_io_printer_driver_info_2(char *desc, DRIVER_INFO_2 *info,prs_str
 }
 
 /*******************************************************************
-********************************************************************/  
+ Parse a DRIVER_INFO_3 structure.
+********************************************************************/
+BOOL new_smb_io_printer_driver_info_3(char *desc, NEW_BUFFER *buffer, DRIVER_INFO_3 *info, int depth)
+{
+       prs_struct *ps=&(buffer->prs);
+
+       prs_debug(ps, depth, desc, "new_smb_io_printer_driver_info_3");
+       depth++;        
+       
+       buffer->struct_start=prs_offset(ps);
+
+       if (!prs_uint32("version", ps, depth, &info->version))
+               return False;
+       if (!new_smb_io_relstr("name", buffer, depth, &info->name))
+               return False;
+       if (!new_smb_io_relstr("architecture", buffer, depth, &info->architecture))
+               return False;
+       if (!new_smb_io_relstr("driverpath", buffer, depth, &info->driverpath))
+               return False;
+       if (!new_smb_io_relstr("datafile", buffer, depth, &info->datafile))
+               return False;
+       if (!new_smb_io_relstr("configfile", buffer, depth, &info->configfile))
+               return False;
+       if (!new_smb_io_relstr("helpfile", buffer, depth, &info->helpfile))
+               return False;
+
+       if (!new_smb_io_relarraystr("dependentfiles", buffer, depth, &info->dependentfiles))
+               return False;
+
+       if (!new_smb_io_relstr("monitorname", buffer, depth, &info->monitorname))
+               return False;
+       if (!new_smb_io_relstr("defaultdatatype", buffer, depth, &info->defaultdatatype))
+               return False;
+
+       return True;
+}
+
 static BOOL smb_io_printer_driver_info_3(char *desc, DRIVER_INFO_3 *info,prs_struct *ps, int depth, 
                                          uint32 *start_offset, uint32 *end_offset)
 {
@@ -1519,7 +1726,47 @@ static BOOL smb_io_printer_driver_info_3(char *desc, DRIVER_INFO_3 *info,prs_str
 }
 
 /*******************************************************************
+ Parse a JOB_INFO_1 structure.
 ********************************************************************/  
+BOOL new_smb_io_job_info_1(char *desc, NEW_BUFFER *buffer, JOB_INFO_1 *info, int depth)
+{
+       prs_struct *ps=&(buffer->prs);
+
+       prs_debug(ps, depth, desc, "new_smb_io_job_info_1");
+       depth++;        
+       
+       buffer->struct_start=prs_offset(ps);
+
+       if (!prs_uint32("jobid", ps, depth, &info->jobid))
+               return False;
+       if (!new_smb_io_relstr("printername", buffer, depth, &info->printername))
+               return False;
+       if (!new_smb_io_relstr("machinename", buffer, depth, &info->machinename))
+               return False;
+       if (!new_smb_io_relstr("username", buffer, depth, &info->username))
+               return False;
+       if (!new_smb_io_relstr("document", buffer, depth, &info->document))
+               return False;
+       if (!new_smb_io_relstr("datatype", buffer, depth, &info->datatype))
+               return False;
+       if (!new_smb_io_relstr("text_status", buffer, depth, &info->text_status))
+               return False;
+       if (!prs_uint32("status", ps, depth, &info->status))
+               return False;
+       if (!prs_uint32("priority", ps, depth, &info->priority))
+               return False;
+       if (!prs_uint32("position", ps, depth, &info->position))
+               return False;
+       if (!prs_uint32("totalpages", ps, depth, &info->totalpages))
+               return False;
+       if (!prs_uint32("pagesprinted", ps, depth, &info->pagesprinted))
+               return False;
+       if (!spoolss_io_system_time("submitted", ps, depth, &info->submitted))
+               return False;
+
+       return True;
+}
+
 static BOOL smb_io_job_info_1(char *desc, JOB_INFO_1 *info, prs_struct *ps, int depth, 
                               uint32 *start_offset, uint32 *end_offset)
 {
@@ -1545,30 +1792,94 @@ static BOOL smb_io_job_info_1(char *desc, JOB_INFO_1 *info, prs_struct *ps, int
 }
 
 /*******************************************************************
+ Parse a JOB_INFO_2 structure.
 ********************************************************************/  
-static BOOL smb_io_job_info_2(char *desc, JOB_INFO_2 *info, prs_struct *ps, int depth, 
-                              uint32 *start_offset, uint32 *end_offset)
+BOOL new_smb_io_job_info_2(char *desc, NEW_BUFFER *buffer, JOB_INFO_2 *info, int depth)
 {      
        int pipo=0;
-       prs_debug(ps, depth, desc, "smb_io_job_info_2");
-       depth++;        
-       *start_offset=prs_offset(ps);
+       prs_struct *ps=&(buffer->prs);
        
-       prs_uint32("jobid",                 ps, depth, &(info->jobid));
-       smb_io_relstr("printername",        ps, depth, &(info->printername), start_offset, end_offset);
-       smb_io_relstr("machinename",        ps, depth, &(info->machinename), start_offset, end_offset);
-       smb_io_relstr("username",           ps, depth, &(info->username), start_offset, end_offset);
-       smb_io_relstr("document",           ps, depth, &(info->document), start_offset, end_offset);
-       smb_io_relstr("notifyname",         ps, depth, &(info->notifyname), start_offset, end_offset);
-       smb_io_relstr("datatype",           ps, depth, &(info->datatype), start_offset, end_offset);
+       prs_debug(ps, depth, desc, "new_smb_io_job_info_2");
+       depth++;        
 
-       smb_io_relstr("printprocessor",     ps, depth, &(info->printprocessor), start_offset, end_offset);
-       smb_io_relstr("parameters",         ps, depth, &(info->parameters), start_offset, end_offset);
-       smb_io_relstr("drivername",         ps, depth, &(info->drivername), start_offset, end_offset);
-       smb_io_reldevmode("devmode",        ps, depth, info->devmode, start_offset, end_offset);
-       smb_io_relstr("text_status",        ps, depth, &(info->text_status), start_offset, end_offset);
+       buffer->struct_start=prs_offset(ps);
+       
+       if (!prs_uint32("jobid",ps, depth, &info->jobid))
+               return False;
+       if (!new_smb_io_relstr("printername", buffer, depth, &info->printername))
+               return False;
+       if (!new_smb_io_relstr("machinename", buffer, depth, &info->machinename))
+               return False;
+       if (!new_smb_io_relstr("username", buffer, depth, &info->username))
+               return False;
+       if (!new_smb_io_relstr("document", buffer, depth, &info->document))
+               return False;
+       if (!new_smb_io_relstr("notifyname", buffer, depth, &info->notifyname))
+               return False;
+       if (!new_smb_io_relstr("datatype", buffer, depth, &info->datatype))
+               return False;
 
-/*     SEC_DESC sec_desc;*/
+       if (!new_smb_io_relstr("printprocessor", buffer, depth, &info->printprocessor))
+               return False;
+       if (!new_smb_io_relstr("parameters", buffer, depth, &info->parameters))
+               return False;
+       if (!new_smb_io_relstr("drivername", buffer, depth, &info->drivername))
+               return False;
+       if (!new_smb_io_reldevmode("devmode", buffer, depth, info->devmode))
+               return False;
+       if (!new_smb_io_relstr("text_status", buffer, depth, &info->text_status))
+               return False;
+
+/*     SEC_DESC sec_desc;*/
+       if (!prs_uint32("Hack! sec desc", ps, depth, &pipo))
+               return False;
+
+       if (!prs_uint32("status",ps, depth, &info->status))
+               return False;
+       if (!prs_uint32("priority",ps, depth, &info->priority))
+               return False;
+       if (!prs_uint32("position",ps, depth, &info->position)) 
+               return False;
+       if (!prs_uint32("starttime",ps, depth, &info->starttime))
+               return False;
+       if (!prs_uint32("untiltime",ps, depth, &info->untiltime))       
+               return False;
+       if (!prs_uint32("totalpages",ps, depth, &info->totalpages))
+               return False;
+       if (!prs_uint32("size",ps, depth, &info->size))
+               return False;
+       if (!spoolss_io_system_time("submitted", ps, depth, &info->submitted) )
+               return False;
+       if (!prs_uint32("timeelapsed",ps, depth, &info->timeelapsed))
+               return False;
+       if (!prs_uint32("pagesprinted",ps, depth, &info->pagesprinted))
+               return False;
+
+       return True;
+}
+static BOOL smb_io_job_info_2(char *desc, JOB_INFO_2 *info, prs_struct *ps, int depth, 
+                              uint32 *start_offset, uint32 *end_offset)
+{      
+       int pipo=0;
+       prs_debug(ps, depth, desc, "smb_io_job_info_2");
+       depth++;        
+       *start_offset=prs_offset(ps);
+       
+       prs_uint32("jobid",                 ps, depth, &(info->jobid));
+       smb_io_relstr("printername",        ps, depth, &(info->printername), start_offset, end_offset);
+       smb_io_relstr("machinename",        ps, depth, &(info->machinename), start_offset, end_offset);
+       smb_io_relstr("username",           ps, depth, &(info->username), start_offset, end_offset);
+       smb_io_relstr("document",           ps, depth, &(info->document), start_offset, end_offset);
+       smb_io_relstr("notifyname",         ps, depth, &(info->notifyname), start_offset, end_offset);
+       smb_io_relstr("datatype",           ps, depth, &(info->datatype), start_offset, end_offset);
+
+       smb_io_relstr("printprocessor",     ps, depth, &(info->printprocessor), start_offset, end_offset);
+       smb_io_relstr("parameters",         ps, depth, &(info->parameters), start_offset, end_offset);
+       smb_io_relstr("drivername",         ps, depth, &(info->drivername), start_offset, end_offset);
+       smb_io_reldevmode("devmode",        ps, depth, info->devmode, start_offset, end_offset);
+       smb_io_relstr("text_status",        ps, depth, &(info->text_status), start_offset, end_offset);
+
+/*     SEC_DESC sec_desc;*/
        prs_uint32("Hack! sec desc", ps, depth, &pipo);
 
        prs_uint32("status",                ps, depth, &(info->status));
@@ -1643,18 +1954,20 @@ static BOOL new_spoolss_io_buffer(char *desc, prs_struct *ps, int depth, NEW_BUF
                        return True;
                }
                
-               if (!prs_uint32("size", ps, depth, &(buffer->size)))
+               if (!prs_uint32("size", ps, depth, &buffer->size))
                        return False;
                                        
                if (!prs_init(&(buffer->prs), buffer->size, 4, UNMARSHALL))
                        return False;
 
-               if (!prs_append_some_prs_data(&(buffer->prs), ps, buffer->size))
+               if (!prs_append_some_prs_data(&(buffer->prs), ps, prs_offset(ps), buffer->size))
                        return False;
 
-               prs_set_offset(&(buffer->prs),0);
+               if (!prs_set_offset(&buffer->prs, 0))
+                       return False;
 
-               prs_set_offset(ps, buffer->size+prs_offset(ps));
+               if (!prs_set_offset(ps, buffer->size+prs_offset(ps)))
+                       return False;
 
                buffer->string_at_end=buffer->size;
                
@@ -1667,12 +1980,9 @@ static BOOL new_spoolss_io_buffer(char *desc, prs_struct *ps, int depth, NEW_BUF
                
                if (!prs_uint32("size", ps, depth, &(buffer->size)))
                        return False;
-                       
-               if (!prs_append_some_prs_data(ps, &(buffer->prs), buffer->size))
+               if (!prs_append_some_prs_data(ps, &(buffer->prs), 0, buffer->size))
                        return False;
-       }
-               
-       return True;
+       }               
 }
 
 /*******************************************************************
@@ -1746,9 +2056,50 @@ static BOOL smb_io_form_1(char *desc, FORM_1 *info, prs_struct *ps, int depth,
 
        return True;
 }
+/*******************************************************************
+ Parse a PORT_INFO_2 structure.
+********************************************************************/  
+BOOL new_smb_io_port_1(char *desc, NEW_BUFFER *buffer, PORT_INFO_1 *info, int depth)
+{
+       prs_struct *ps=&(buffer->prs);
+
+       prs_debug(ps, depth, desc, "new_smb_io_port_1");
+       depth++;
+
+       buffer->struct_start=prs_offset(ps);
+
+       if(!new_smb_io_relstr("port_name", buffer, depth, &info->port_name))
+               return False;
+
+       return True;
+}
 
 /*******************************************************************
+ Parse a PORT_INFO_2 structure.
 ********************************************************************/  
+BOOL new_smb_io_port_2(char *desc, NEW_BUFFER *buffer, PORT_INFO_2 *info, int depth)
+{
+       prs_struct *ps=&(buffer->prs);
+
+       prs_debug(ps, depth, desc, "new_smb_io_port_2");
+       depth++;
+
+       buffer->struct_start=prs_offset(ps);
+
+       if(!new_smb_io_relstr("port_name", buffer, depth, &info->port_name))
+               return False;
+       if(!new_smb_io_relstr("monitor_name", buffer, depth, &info->monitor_name))
+               return False;
+       if(!new_smb_io_relstr("description", buffer, depth, &info->description))
+               return False;
+       if(!prs_uint32("port_type", ps, depth, &info->port_type))
+               return False;
+       if(!prs_uint32("reserved", ps, depth, &info->reserved))
+               return False;
+
+       return True;
+}
+
 static BOOL smb_io_port_2(char *desc, PORT_INFO_2 *info, prs_struct *ps, int depth, 
                           uint32 *start_offset, uint32 *end_offset)
 {
@@ -1767,28 +2118,55 @@ static BOOL smb_io_port_2(char *desc, PORT_INFO_2 *info, prs_struct *ps, int dep
 
 /*******************************************************************
 ********************************************************************/  
-static BOOL smb_io_processor_info_1(char *desc, PRINTPROCESSOR_1 *info, prs_struct *ps, int depth, 
-                                    uint32 *start_offset, uint32 *end_offset)
+BOOL smb_io_printprocessor_info_1(char *desc, NEW_BUFFER *buffer, PRINTPROCESSOR_1 *info, int depth)
 {
-       prs_debug(ps, depth, desc, "smb_io_processor_info_1");
+       prs_struct *ps=&(buffer->prs);
+
+       prs_debug(ps, depth, desc, "smb_io_printprocessor_info_1");
        depth++;        
-       *start_offset=prs_offset(ps);
 
-       smb_io_relstr("name",ps, depth, &(info->name), start_offset, end_offset);
+       buffer->struct_start=prs_offset(ps);
+       
+       if (new_smb_io_relstr("name", buffer, depth, &info->name))
+               return False;
 
        return True;
 }
 
 /*******************************************************************
 ********************************************************************/  
-static BOOL smb_io_monitor_info_1(char *desc, PRINTMONITOR_1 *info, prs_struct *ps, int depth, 
-                                  uint32 *start_offset, uint32 *end_offset)
+BOOL smb_io_printmonitor_info_1(char *desc, NEW_BUFFER *buffer, PRINTMONITOR_1 *info, int depth)
 {
-       prs_debug(ps, depth, desc, "smb_io_monitor_info_1");
+       prs_struct *ps=&(buffer->prs);
+
+       prs_debug(ps, depth, desc, "smb_io_printmonitor_info_1");
        depth++;        
-       *start_offset=prs_offset(ps);
 
-       smb_io_relstr("name",ps, depth, &(info->name), start_offset, end_offset);
+       buffer->struct_start=prs_offset(ps);
+
+       if (!new_smb_io_relstr("name", buffer, depth, &info->name))
+               return False;
+
+       return True;
+}
+
+/*******************************************************************
+********************************************************************/  
+BOOL smb_io_printmonitor_info_2(char *desc, NEW_BUFFER *buffer, PRINTMONITOR_2 *info, int depth)
+{
+       prs_struct *ps=&(buffer->prs);
+
+       prs_debug(ps, depth, desc, "smb_io_printmonitor_info_2");
+       depth++;        
+
+       buffer->struct_start=prs_offset(ps);
+
+       if (!new_smb_io_relstr("name", buffer, depth, &info->name))
+               return False;
+       if (!new_smb_io_relstr("environment", buffer, depth, &info->environment))
+               return False;
+       if (!new_smb_io_relstr("dll_name", buffer, depth, &info->dll_name))
+               return False;
 
        return True;
 }
@@ -1811,7 +2189,7 @@ static uint32 spoolss_size_printer_info_0(PRINTER_INFO_0 *info)
 /*******************************************************************
 return the size required by a struct in the stream
 ********************************************************************/  
-static uint32 spoolss_size_printer_info_1(PRINTER_INFO_1 *info)
+uint32 spoolss_size_printer_info_1(PRINTER_INFO_1 *info)
 {
        int size=0;
                
@@ -1819,15 +2197,14 @@ static uint32 spoolss_size_printer_info_1(PRINTER_INFO_1 *info)
        size+=size_of_relative_string( &(info->description) );
        size+=size_of_relative_string( &(info->name) );
        size+=size_of_relative_string( &(info->comment) );
-       return (size);
 
-       return True;
+       return size;
 }
 
 /*******************************************************************
 return the size required by a struct in the stream
-********************************************************************/  
-static uint32 spoolss_size_printer_info_2(PRINTER_INFO_2 *info)
+********************************************************************/
+uint32 spoolss_size_printer_info_2(PRINTER_INFO_2 *info)
 {
        int size=0;
                
@@ -1856,15 +2233,13 @@ static uint32 spoolss_size_printer_info_2(PRINTER_INFO_2 *info)
        size+=size_of_uint32( &(info->status) );
        size+=size_of_uint32( &(info->cjobs) );
        size+=size_of_uint32( &(info->averageppm) );    
-       return (size);
-
-       return True;
+       return size;
 }
 
 /*******************************************************************
 return the size required by a struct in the stream
-********************************************************************/  
-static uint32 spoolss_size_printer_driver_info_1(DRIVER_INFO_1 *info)
+********************************************************************/
+uint32 spoolss_size_printer_driver_info_1(DRIVER_INFO_1 *info)
 {
        int size=0;
        DEBUG(9,("Sizing driver info_1\n"));
@@ -1878,8 +2253,8 @@ static uint32 spoolss_size_printer_driver_info_1(DRIVER_INFO_1 *info)
 
 /*******************************************************************
 return the size required by a struct in the stream
-********************************************************************/  
-static uint32 spoolss_size_printer_driver_info_2(DRIVER_INFO_2 *info)
+********************************************************************/
+uint32 spoolss_size_printer_driver_info_2(DRIVER_INFO_2 *info)
 {
        int size=0;
        DEBUG(9,("Sizing driver info_2\n"));
@@ -1898,8 +2273,8 @@ static uint32 spoolss_size_printer_driver_info_2(DRIVER_INFO_2 *info)
 
 /*******************************************************************
 return the size required by a struct in the stream
-********************************************************************/  
-static uint32 spoolss_size_printer_driver_info_3(DRIVER_INFO_3 *info)
+********************************************************************/
+uint32 spoolss_size_printer_driver_info_3(DRIVER_INFO_3 *info)
 {
        int size=0;
        UNISTR **string;
@@ -1934,7 +2309,7 @@ static uint32 spoolss_size_printer_driver_info_3(DRIVER_INFO_3 *info)
 /*******************************************************************
 return the size required by a struct in the stream
 ********************************************************************/  
-static uint32 spoolss_size_job_info_1(JOB_INFO_1 *info)
+uint32 spoolss_size_job_info_1(JOB_INFO_1 *info)
 {
        int size=0;
        size+=size_of_uint32( &(info->jobid) );
@@ -1950,15 +2325,14 @@ static uint32 spoolss_size_job_info_1(JOB_INFO_1 *info)
        size+=size_of_uint32( &(info->totalpages) );
        size+=size_of_uint32( &(info->pagesprinted) );
        size+=size_of_systemtime( &(info->submitted) );
-       return (size);
 
-       return True;
+       return size;
 }
 
 /*******************************************************************
 return the size required by a struct in the stream
 ********************************************************************/  
-static uint32 spoolss_size_job_info_2(JOB_INFO_2 *info)
+uint32 spoolss_size_job_info_2(JOB_INFO_2 *info)
 {
        int size=0;
 
@@ -2008,15 +2382,25 @@ uint32 spoolss_size_form_1(FORM_1 *info)
        size+=size_of_uint32( &(info->right) );
        size+=size_of_uint32( &(info->bottom) );
 
-       return (size);
+       return size;
+}
 
-       return True;
+/*******************************************************************
+return the size required by a struct in the stream
+********************************************************************/  
+uint32 spoolss_size_port_info_1(PORT_INFO_1 *info)
+{
+       int size=0;
+
+       size+=size_of_relative_string( &(info->port_name) );
+
+       return size;
 }
 
 /*******************************************************************
 return the size required by a struct in the stream
 ********************************************************************/  
-static uint32 spoolss_size_port_info_2(PORT_INFO_2 *info)
+uint32 spoolss_size_port_info_2(PORT_INFO_2 *info)
 {
        int size=0;
 
@@ -2027,40 +2411,49 @@ static uint32 spoolss_size_port_info_2(PORT_INFO_2 *info)
        size+=size_of_uint32( &(info->port_type) );
        size+=size_of_uint32( &(info->reserved) );
 
-       return (size);
+       return size;
+}
 
-       return True;
+/*******************************************************************
+return the size required by a struct in the stream
+********************************************************************/  
+uint32 spoolss_size_printprocessor_info_1(PRINTPROCESSOR_1 *info)
+{
+       int size=0;
+       size+=size_of_relative_string( &info->name );
+
+       return size;
 }
 
 /*******************************************************************
 return the size required by a struct in the stream
 ********************************************************************/  
-static uint32 spoolss_size_processor_info_1(PRINTPROCESSOR_1 *info)
+uint32 spoolss_size_printmonitor_info_1(PRINTMONITOR_1 *info)
 {
        int size=0;
-       size+=size_of_relative_string( &(info->name) );
+       size+=size_of_relative_string( &info->name );
 
-       return (size);
+       return size;
 
-       return True;
 }
 
 /*******************************************************************
 return the size required by a struct in the stream
 ********************************************************************/  
-static uint32 spoolss_size_monitor_info_1(PRINTMONITOR_1 *info)
+uint32 spoolss_size_printmonitor_info_2(PRINTMONITOR_2 *info)
 {
        int size=0;
-       size+=size_of_relative_string( &(info->name) );
+       size+=size_of_relative_string( &info->name);
+       size+=size_of_relative_string( &info->environment);
+       size+=size_of_relative_string( &info->dll_name);
 
-       return (size);
-
-       return True;
+       return size;
 }
 
 /*******************************************************************
  * make a structure.
  ********************************************************************/
+/*
 static BOOL make_spoolss_buffer(BUFFER* buffer, uint32 size)
 {
        buffer->ptr = (size != 0) ? 1 : 0;
@@ -2069,6 +2462,7 @@ static BOOL make_spoolss_buffer(BUFFER* buffer, uint32 size)
 
        return (buffer->data != NULL || size == 0);
 }
+*/
 
 /*******************************************************************
  * read a uint8 buffer of size *size.
@@ -2358,8 +2752,8 @@ BOOL make_spoolss_q_enumprinters(SPOOL_Q_ENUMPRINTERS *q_u,
        init_unistr2(&q_u->servername, servername, len_name);
 
        q_u->level = level;
-       make_spoolss_buffer(&q_u->buffer, size);
-       q_u->buf_size = size;
+       /*make_spoolss_buffer(&q_u->buffer, size);*/
+/*     q_u->buf_size = size;*/
 
        return True;
 }
@@ -2371,45 +2765,63 @@ BOOL make_spoolss_q_enumprinters(SPOOL_Q_ENUMPRINTERS *q_u,
 BOOL spoolss_io_q_enumprinters(char *desc, SPOOL_Q_ENUMPRINTERS *q_u,
                                prs_struct *ps, int depth)
 {
-       uint32 useless_ptr = 0x01;
        prs_debug(ps, depth, desc, "spoolss_io_q_enumprinters");
        depth++;
 
-       prs_align(ps);
-
-       prs_uint32("flags", ps, depth, &(q_u->flags));
-       prs_uint32("useless ptr", ps, depth, &useless_ptr);
+       if (!prs_align(ps))
+               return False;
 
-       smb_io_unistr2("", &q_u->servername,True,ps,depth);
-       prs_align(ps);
+       if (!prs_uint32("flags", ps, depth, &q_u->flags))
+               return False;
+       if (!prs_uint32("servername_ptr", ps, depth, &q_u->servername_ptr))
+               return False;
 
-       prs_uint32("level", ps, depth, &(q_u->level));
+       if (!smb_io_unistr2("", &q_u->servername, q_u->servername_ptr, ps, depth))
+               return False;
+               
+       if (!prs_align(ps))
+               return False;
+       if (!prs_uint32("level", ps, depth, &q_u->level))
+               return False;
 
-       spoolss_io_read_buffer("buffer", ps, depth, &(q_u->buffer));    
+       if (!new_spoolss_io_buffer("", ps, depth, q_u->buffer))
+               return False;
 
-       prs_uint32("buf_size", ps, depth, &q_u->buf_size);
+       if (!prs_align(ps))
+               return False;
+       if (!prs_uint32("offered", ps, depth, &q_u->offered))
+               return False;
 
        return True;
 }
 
-/****************************************************************************
-****************************************************************************/
-void free_r_enumprinters(SPOOL_R_ENUMPRINTERS *r_u)
-{      
-       DEBUG(4,("free_enum_printers_info: [%d] structs to free at level [%d]\n", r_u->returned, r_u->level));
-       switch (r_u->level)
-       {
-               case 1:                 
-               {
-                       free_print1_array(r_u->returned, r_u->ctr.printer.printers_1);
-                       break;
-               }
-               case 2:
-               {
-                       free_print2_array(r_u->returned, r_u->ctr.printer.printers_2);
-                       break;
-               }
-       }
+/*******************************************************************
+ Parse a SPOOL_R_ENUMPRINTERS structure.
+ ********************************************************************/
+BOOL new_spoolss_io_r_enumprinters(char *desc, SPOOL_R_ENUMPRINTERS *r_u, prs_struct *ps, int depth)
+{
+       prs_debug(ps, depth, desc, "new_spoolss_io_r_enumprinters");
+       depth++;
+
+       if (!prs_align(ps))
+               return False;
+               
+       if (!new_spoolss_io_buffer("", ps, depth, r_u->buffer))
+               return False;
+
+       if (!prs_align(ps))
+               return False;
+               
+       if (!prs_uint32("needed", ps, depth, &r_u->needed))
+               return False;
+               
+       if (!prs_uint32("returned", ps, depth, &r_u->returned))
+               return False;
+               
+       if (!prs_uint32("status", ps, depth, &r_u->status))
+               return False;
+
+       return True;            
 }
 
 /*******************************************************************
@@ -2417,198 +2829,48 @@ void free_r_enumprinters(SPOOL_R_ENUMPRINTERS *r_u)
  * called from spoolss_r_enum_printers (srv_spoolss.c)
  *
  ********************************************************************/
-BOOL spoolss_io_r_enumprinters(char *desc,
-                               SPOOL_R_ENUMPRINTERS *r_u, 
+BOOL spoolss_io_r_getprinter(char *desc,
+                               SPOOL_R_GETPRINTER *r_u, 
                                prs_struct *ps, int depth)
 {      
        uint32 useless_ptr=0xADDE0FF0;
-       int i;
        uint32 start_offset, end_offset, beginning;
        uint32 bufsize_required=0;
-       uint32 tmp_ct = 0;
-
-       PRINTER_INFO_1 *info1;
-       PRINTER_INFO_2 *info2;
-       fstring tmp;
-
-       slprintf(tmp, sizeof(tmp)-1, "spoolss_io_r_enumprinters %d", r_u->level);
-
-       prs_debug(ps, depth, desc, tmp);
+       
+       prs_debug(ps, depth, desc, "spoolss_io_r_getprinter");
        depth++;
+
        prs_align(ps);
+       
        prs_uint32("pointer", ps, depth, &useless_ptr);
 
-       if (!ps->io)
+       switch (r_u->level)
        {
-               /* writing */
-               for(i=0;i<r_u->returned;i++)
+               case 0:
                {
-                       switch (r_u->level)
-                       {
-                               case 1:
-                                       info1 = r_u->ctr.printer.printers_1[i];
-                                       bufsize_required += spoolss_size_printer_info_1(info1); 
-                                       break;
-                               case 2:
-                                       info2 = r_u->ctr.printer.printers_2[i];
-                                       bufsize_required += spoolss_size_printer_info_2(info2); 
-                                       break;
-                       }
+                       PRINTER_INFO_0 *info;
+                       info = r_u->ctr.printer.info0;
+                       bufsize_required += spoolss_size_printer_info_0(info);  
+                       break;
                }
-
-               DEBUG(4,("spoolss_io_r_enumprinters, size needed: %d\n",bufsize_required));
-               DEBUG(4,("spoolss_io_r_enumprinters, size offered: %d\n",r_u->offered));
-
-               if (r_u->offered<bufsize_required)
-               {       
-                       /* 
-                        * so the buffer is too small to handle datas
-                        * reply the minimum size required in the status
-                        * make the buffer equal 0
-                        * and reply no printers in buffer
-                        */
-                       r_u->status=ERROR_INSUFFICIENT_BUFFER;
-                       r_u->offered=0;
-                       /*r_u->returned=0;*/
-                       
-                       DEBUG(4,("spoolss_io_r_enumprinters, buffer too small\n"));
-
-                       prs_uint32("size of buffer", ps, depth, &(r_u->offered));
-                       prs_uint32("size of buffer needed", ps, depth, &(bufsize_required));
-                       prs_uint32("count", ps, depth, &(r_u->returned));
-                       prs_uint32("status", ps, depth, &(r_u->status));
-                       return False;
+               case 1:
+               {
+                       PRINTER_INFO_1 *info;
+                       info = r_u->ctr.printer.info1;
+                       bufsize_required += spoolss_size_printer_info_1(info);  
+                       break;
+               }
+               case 2:
+               {
+                       PRINTER_INFO_2 *info;
+                       info = r_u->ctr.printer.info2;
+                       bufsize_required += spoolss_size_printer_info_2(info);  
+                       break;
                }       
-               
-               DEBUG(4,("spoolss_io_r_enumprinters, buffer large enough\n"));
        }
        
-       prs_uint32("size of buffer", ps, depth, &(r_u->offered));
-
-       /* have to skip to end of buffer when reading, and have to record
-        * size of buffer when writing.  *shudder*.
-        */
-
-       beginning = prs_offset(ps);
-       start_offset = prs_offset(ps);
-       end_offset = start_offset + r_u->offered;
-               
-       if (ps->io)
-       {
-               /* reading */
-               prs_set_offset(ps, beginning + r_u->offered);
-
-               prs_align(ps);
-               prs_uint32("buffer size", ps, depth, &(bufsize_required));
-               prs_uint32("count", ps, depth, &(r_u->returned));
-
-               prs_set_offset(ps, beginning);
-       }
-       
-       for(i=0;i<r_u->returned;i++)
-       {
-
-               switch (r_u->level)
-               {
-                       case 1:
-                       {
-                               if (ps->io)
-                               {
-                                       /* reading */
-/*                                     r_u->ctr.printer.printers_1[i] = add_print1_to_array(&tmp_ct, &r_u->ctr.printer.printers_1, NULL);*/
-                               }
-                               info1 = r_u->ctr.printer.printers_1[i];
-                               if (info1 == NULL)
-                               {
-                                       return False;
-                               }
-                               smb_io_printer_info_1(desc, info1, ps, depth, 
-                                                     &start_offset, &end_offset);      
-                               break;
-                       }
-                       case 2:
-                       {
-                               if (ps->io)
-                               {
-                                       /* reading */
-/*
-                                       r_u->ctr.printer.printers_2[i] = add_print2_to_array(&tmp_ct, &r_u->ctr.printer.printers_2, NULL);
-*/                             }
-                               info2 = r_u->ctr.printer.printers_2[i];
-                               if (info2 == NULL)
-                               {
-                                       return False;
-                               }
-                               smb_io_printer_info_2(desc, info2, ps, depth, 
-                                                     &start_offset, &end_offset);      
-                               break;
-                       }
-               }
-       }
-
-       prs_set_offset(ps, beginning + r_u->offered);
-       prs_align(ps);
-       
-       prs_uint32("buffer size", ps, depth, &(bufsize_required));
-       prs_uint32("count", ps, depth, &(r_u->returned));
-       prs_uint32("status", ps, depth, &(r_u->status));
-
-       if (!ps->io)
-       {
-               /* writing */
-               free_r_enumprinters(r_u);
-       }
-
-       return True;
-}
-
-/*******************************************************************
- * write a structure.
- * called from spoolss_r_enum_printers (srv_spoolss.c)
- *
- ********************************************************************/
-BOOL spoolss_io_r_getprinter(char *desc,
-                               SPOOL_R_GETPRINTER *r_u, 
-                               prs_struct *ps, int depth)
-{      
-       uint32 useless_ptr=0xADDE0FF0;
-       uint32 start_offset, end_offset, beginning;
-       uint32 bufsize_required=0;
-       
-       prs_debug(ps, depth, desc, "spoolss_io_r_getprinter");
-       depth++;
-
-       prs_align(ps);
-       
-       prs_uint32("pointer", ps, depth, &useless_ptr);
-
-       switch (r_u->level)
-       {
-               case 0:
-               {
-                       PRINTER_INFO_0 *info;
-                       info = r_u->ctr.printer.info0;
-                       bufsize_required += spoolss_size_printer_info_0(info);  
-                       break;
-               }
-               case 1:
-               {
-                       PRINTER_INFO_1 *info;
-                       info = r_u->ctr.printer.info1;
-                       bufsize_required += spoolss_size_printer_info_1(info);  
-                       break;
-               }
-               case 2:
-               {
-                       PRINTER_INFO_2 *info;
-                       info = r_u->ctr.printer.info2;
-                       bufsize_required += spoolss_size_printer_info_2(info);  
-                       break;
-               }       
-       }
-       
-       DEBUG(4,("spoolss_io_r_getprinter, size needed: %d\n",bufsize_required));
-       DEBUG(4,("spoolss_io_r_getprinter, size offered: %d\n",r_u->offered));
+       DEBUG(4,("spoolss_io_r_getprinter, size needed: %d\n",bufsize_required));
+       DEBUG(4,("spoolss_io_r_getprinter, size offered: %d\n",r_u->offered));
 
        /* check if the buffer is big enough for the datas */
        if (r_u->offered < bufsize_required)
@@ -2663,12 +2925,14 @@ BOOL spoolss_io_r_getprinter(char *desc,
                        {
                                PRINTER_INFO_1 *info;
                                info = r_u->ctr.printer.info1;
+                               /*
                                smb_io_printer_info_1(desc, 
                                                      info, 
                                                      ps, 
                                                      depth, 
                                                      &start_offset, 
                                                      &end_offset);
+                               */
                                if (!ps->io)
                                {
                                        /* writing */
@@ -2680,12 +2944,14 @@ BOOL spoolss_io_r_getprinter(char *desc,
                        {
                                PRINTER_INFO_2 *info;
                                info = r_u->ctr.printer.info2;
+                               /*
                                smb_io_printer_info_2(desc, 
                                                      info, 
                                                      ps, 
                                                      depth, 
                                                      &start_offset, 
                                                      &end_offset);
+                               */
                                if (!ps->io)
                                {
                                        /* writing */
@@ -2901,191 +3167,35 @@ BOOL spoolss_io_q_addjob(char *desc, SPOOL_Q_ADDJOB *q_u, prs_struct *ps, int de
        return True;
 }
 
-/****************************************************************************
-****************************************************************************/
-void free_job_info_ctr(JOB_INFO_CTR *ctr, uint32 level, uint32 numofjobs)
-{      
-       DEBUG(4,("free_enum_jobs_info: [%d] structs to free at level [%d]\n",
-               numofjobs, level));
-       switch (level)
-       {
-               case 1:                 
-               {
-                       free_job1_array(numofjobs,
-                                       ctr->job.job_info_1);
-                       break;
-               }
-               case 2:
-               {
-                       free_job2_array(numofjobs,
-                                       ctr->job.job_info_2);
-                       break;
-               }
-       }
-}
-
-/****************************************************************************
-****************************************************************************/
-void free_r_enumjobs(SPOOL_R_ENUMJOBS *r_u)
-{      
-       free_job_info_ctr(&r_u->ctr, r_u->level, r_u->numofjobs);
-}
-
 /*******************************************************************
 ********************************************************************/  
 BOOL spoolss_io_r_enumjobs(char *desc, SPOOL_R_ENUMJOBS *r_u, prs_struct *ps, int depth)
 {              
-       uint32 useless_ptr = 0;
-       uint32 start_offset, end_offset, beginning;
-       uint32 bufsize_required=0;
-       uint32 tmp_ct = 0;
-       int i;
-       
        prs_debug(ps, depth, desc, "spoolss_io_r_enumjobs");
        depth++;
 
-       prs_align(ps);
-       
-       if (!ps->io)
-       {
-               /* writing */
-               switch (r_u->level)
-               {
-                       case 1:
-                       {
-                               for (i=0; i<r_u->numofjobs; i++)
-                               {
-                                       JOB_INFO_1 *info;
-                                       info=r_u->ctr.job.job_info_1[i];
-                                       bufsize_required += spoolss_size_job_info_1(&(info[i]));
-                               }
-                               break;
-                       }
-                       case 2:
-                       {
-                               for (i=0; i<r_u->numofjobs; i++)
-                               {
-                                       JOB_INFO_2 *info;
-                                       info=r_u->ctr.job.job_info_2[i];
-                               
-                                       bufsize_required += spoolss_size_job_info_2(&(info[i]));
-                               }
-                               break;
-                       }       
-               }
-
-               DEBUG(4,("spoolss_io_r_enumjobs, size needed: %d\n",
-                         bufsize_required));
-               DEBUG(4,("spoolss_io_r_enumjobs, size offered: %d\n",
-                         r_u->offered));
-
-               /* check if the buffer is big enough for the datas */
-               if (r_u->offered<bufsize_required)
-               {       
-                       /* it's too small */
-                       r_u->status = ERROR_INSUFFICIENT_BUFFER; /* say so */
-                       r_u->offered = bufsize_required;
-                       useless_ptr = 0;
-                       
-                       DEBUG(4,("spoolss_io_r_enumjobs, buffer too small\n"));
-
-               }
-               else
-               {
-                       useless_ptr = 1;
-               }
-       }
-
-       prs_uint32("pointer", ps, depth, &useless_ptr);
-       prs_uint32("size of buffer", ps, depth, &(r_u->offered));
-
-       if (useless_ptr != 0)
-       {
-               beginning=prs_offset(ps);
-               start_offset=prs_offset(ps);
-               end_offset=start_offset+r_u->offered;
+       if (!prs_align(ps))
+               return False;
                
-               tmp_ct = 0;
-
-               if (ps->io)
-               {
-                       /* reading */
-                       prs_set_offset(ps, beginning + r_u->offered);
-
-                       prs_align(ps);
-                       prs_uint32("buffer size", ps, depth, &(bufsize_required));
-                       prs_uint32("numofjobs", ps, depth, &(r_u->numofjobs));
+       if (!new_spoolss_io_buffer("", ps, depth, r_u->buffer))
+               return False;
 
-                       prs_set_offset(ps, beginning);
-               }
+       if (!prs_align(ps))
+               return False;
                
-               switch (r_u->level)
-               {
-                       case 1:
-                       {
-                               JOB_INFO_1 *info;
-                               for (i=0; i<r_u->numofjobs; i++)
-                               {
-                                       if (ps->io)
-                                       {
-                                               /* reading */
-/*                                             r_u->ctr.job.job_info_1[i] = add_job1_to_array(&tmp_ct, &r_u->ctr.job.job_info_1, NULL);*/
-                                       }
-                                       info = r_u->ctr.job.job_info_1[i];
-                                       smb_io_job_info_1(desc, 
-                                                         info, 
-                                                         ps, 
-                                                         depth, 
-                                                         &start_offset, 
-                                                         &end_offset);
-                               }
-                               break;
-                       }
-                       case 2:
-                       {
-                               JOB_INFO_2 *info;
-                               for (i=0; i<r_u->numofjobs; i++)
-                               {
-                                       if (ps->io)
-                                       {
-                                               /* reading */
-/*                                             r_u->ctr.job.job_info_2[i] = add_job2_to_array(&tmp_ct, &r_u->ctr.job.job_info_2, NULL);*/
-                                       }
-                                       info = r_u->ctr.job.job_info_2[i];
-                                       smb_io_job_info_2(desc, 
-                                                         info, 
-                                                         ps, 
-                                                         depth, 
-                                                         &start_offset, 
-                                                         &end_offset);
-                               }
-                               break;
-                       }
+       if (!prs_uint32("needed", ps, depth, &r_u->needed))
+               return False;
                
-               }               
-               prs_set_offset(ps, beginning+r_u->offered);
-               prs_align(ps);
+       if (!prs_uint32("returned", ps, depth, &r_u->returned))
+               return False;
                
-               /*
-                * if the buffer was too small, send the minimum required size
-                * if it was too large, send the real needed size
-                */
-                       
-               prs_uint32("buffer size", ps, depth, &(bufsize_required));
-       }
-
-       prs_uint32("numofjobs", ps, depth, &(r_u->numofjobs));  
-       prs_uint32("status", ps, depth, &(r_u->status));
-
-       if (!ps->io)
-       {
-               /* writing */
-               free_r_enumjobs(r_u);
-       }
+       if (!prs_uint32("status", ps, depth, &r_u->status))
+               return False;
 
-       return True;
+       return True;            
 }
 
+
 /*******************************************************************
 ********************************************************************/  
 BOOL make_spoolss_q_enumjobs(SPOOL_Q_ENUMJOBS *q_u, const POLICY_HND *hnd,
@@ -3102,13 +3212,13 @@ BOOL make_spoolss_q_enumjobs(SPOOL_Q_ENUMJOBS *q_u, const POLICY_HND *hnd,
        q_u->firstjob = firstjob;
        q_u->numofjobs = numofjobs;
        q_u->level = level;
-       
+/*     
        if (!make_spoolss_buffer(&q_u->buffer, buf_size))
        {
                return False;
        }
        q_u->buf_size = buf_size;
-
+*/
        return True;
 }
 
@@ -3119,16 +3229,24 @@ BOOL spoolss_io_q_enumjobs(char *desc, SPOOL_Q_ENUMJOBS *q_u, prs_struct *ps, in
        prs_debug(ps, depth, desc, "spoolss_io_q_enumjobs");
        depth++;
 
-       prs_align(ps);
+       if (!prs_align(ps))
+               return False;
 
-       smb_io_prt_hnd("printer handle",&(q_u->handle),ps,depth);
-       prs_uint32("firstjob", ps, depth, &(q_u->firstjob));
-       prs_uint32("numofjobs", ps, depth, &(q_u->numofjobs));
-       prs_uint32("level", ps, depth, &(q_u->level));
-       
-       spoolss_io_read_buffer("", ps, depth, &(q_u->buffer));
+       if (!smb_io_prt_hnd("printer handle",&q_u->handle, ps, depth))
+               return False;
+               
+       if (!prs_uint32("firstjob", ps, depth, &q_u->firstjob))
+               return False;
+       if (!prs_uint32("numofjobs", ps, depth, &q_u->numofjobs))
+               return False;
+       if (!prs_uint32("level", ps, depth, &q_u->level))
+               return False;
 
-       prs_uint32("buf_size", ps, depth, &(q_u->buf_size));
+       if (!new_spoolss_io_buffer("", ps, depth, q_u->buffer))
+               return False;   
+
+       if (!prs_uint32("offered", ps, depth, &q_u->offered))
+               return False;
 
        return True;
 }
@@ -3198,199 +3316,72 @@ BOOL spoolss_io_q_setjob(char *desc, SPOOL_Q_SETJOB *q_u, prs_struct *ps, int de
 }
 
 /*******************************************************************
+ Parse a SPOOL_R_ENUMPRINTERDRIVERS structure.
 ********************************************************************/  
-BOOL spoolss_io_r_enumdrivers(char *desc, SPOOL_R_ENUMPRINTERDRIVERS *r_u, prs_struct *ps, int depth)
-{              
-       uint32 useless_ptr=0xADDE0FF0;
-       uint32 start_offset, end_offset, beginning;
-       uint32 bufsize_required=0;
-       int i;
-       
-       prs_debug(ps, depth, desc, "spoolss_io_r_enumdrivers");
+BOOL new_spoolss_io_r_enumprinterdrivers(char *desc, SPOOL_R_ENUMPRINTERDRIVERS *r_u, prs_struct *ps, int depth)
+{
+       prs_debug(ps, depth, desc, "new_spoolss_io_r_enumprinterdrivers");
        depth++;
 
-       prs_align(ps);  
-       prs_uint32("pointer", ps, depth, &useless_ptr);
-
-       DEBUG(7,("Level [%d], number [%d]\n", r_u->level, r_u->numofdrivers));
-       switch (r_u->level)
-       {
-               case 1:
-               {
-                       DRIVER_INFO_1 *driver_info_1;
-                       driver_info_1=r_u->ctr.driver.info1;
-                       
-                       for (i=0; i<r_u->numofdrivers; i++)
-                       {
-                               bufsize_required += spoolss_size_printer_driver_info_1(&(driver_info_1[i]));
-                       }
-                       break;
-               }
-               case 2:
-               {
-                       DRIVER_INFO_2 *driver_info_2;
-                       driver_info_2=r_u->ctr.driver.info2;
-                       
-                       for (i=0; i<r_u->numofdrivers; i++)
-                       {
-                               bufsize_required += spoolss_size_printer_driver_info_2(&(driver_info_2[i]));
-                       }
-                       break;
-               }
-               case 3:
-               {
-                       DRIVER_INFO_3 *driver_info_3;
-                       driver_info_3=r_u->ctr.driver.info3;
-                       
-                       for (i=0; i<r_u->numofdrivers; i++)
-                       {
-                               bufsize_required += spoolss_size_printer_driver_info_3(&(driver_info_3[i]));
-                       }
-                       break;
-               }
-       }
-       
-       DEBUGADD(7,("size needed: %d\n",bufsize_required));
-       DEBUGADD(7,("size offered: %d\n",r_u->offered));
-
-       /* check if the buffer is big enough for the datas */
-
-       if (r_u->offered<bufsize_required)
-       {       
-
-               /* it's too small */
-               r_u->status=ERROR_INSUFFICIENT_BUFFER;  /* say so */
-               r_u->offered=0;                         /* don't send back the buffer */        
-               DEBUGADD(8,("buffer too small\n"));
+       if (!prs_align(ps))
+               return False;
+               
+       if (!new_spoolss_io_buffer("", ps, depth, r_u->buffer))
+               return False;
 
-               prs_uint32("size of buffer", ps, depth, &(r_u->offered));
-       }
-       else
-       {       
-               DEBUGADD(8,("buffer large enough\n"));
-       
-               prs_uint32("size of buffer", ps, depth, &(r_u->offered));
-               beginning=prs_offset(ps);
-               start_offset=prs_offset(ps);
-               end_offset=start_offset+r_u->offered;
+       if (!prs_align(ps))
+               return False;
                
-               switch (r_u->level)
-               {
-                       case 1:
-                       {
-                               DRIVER_INFO_1 *info;
-                               for (i=0; i<r_u->numofdrivers; i++)
-                               {
-                                       info = &(r_u->ctr.driver.info1[i]);
-                                       smb_io_printer_driver_info_1(desc, info, ps, depth, &start_offset, &end_offset);
-                               }
-                               break;
-                       }               
-                       case 2:
-                       {
-                               DRIVER_INFO_2 *info;
-                               for (i=0; i<r_u->numofdrivers; i++)
-                               {
-                                       info = &(r_u->ctr.driver.info2[i]);
-                                       smb_io_printer_driver_info_2(desc, info, ps, depth, &start_offset, &end_offset);
-                               }
-                               break;
-                       }               
-                       case 3:
-                       {
-                               DRIVER_INFO_3 *info;
-                               for (i=0; i<r_u->numofdrivers; i++)
-                               {
-                                       info = &(r_u->ctr.driver.info3[i]);
-                                       smb_io_printer_driver_info_3(desc, info, ps, depth, &start_offset, &end_offset);
-                               }
-                               break;
-                       }               
-               }               
-               prs_set_offset(ps, beginning+r_u->offered);
-               prs_align(ps);
-       }
-       
-       /*
-        * if the buffer was too small, send the minimum required size
-        * if it was too large, send the real needed size
-        */
-               
-       prs_uint32("size of buffer needed", ps, depth, &(bufsize_required));
-       prs_uint32("numofdrivers", ps, depth, &(r_u->numofdrivers));    
-       prs_uint32("status", ps, depth, &(r_u->status));
+       if (!prs_uint32("needed", ps, depth, &r_u->needed))
+               return False;
+               
+       if (!prs_uint32("returned", ps, depth, &r_u->returned))
+               return False;
+               
+       if (!prs_uint32("status", ps, depth, &r_u->status))
+               return False;
 
-       return True;
+       return True;            
 }
 
 
-void free_spoolss_r_enumdrivers(SPOOL_R_ENUMPRINTERDRIVERS *r_u)
-{
-       switch (r_u->level)
-       {
-               case 1:
-               {
-                       DRIVER_INFO_1 *driver_info_1;
-                       driver_info_1=r_u->ctr.driver.info1;
-                       
-                       free(driver_info_1);
-                       break;
-               }
-               case 2:
-               {
-                       DRIVER_INFO_2 *driver_info_2;
-                       driver_info_2=r_u->ctr.driver.info2;
-                       
-                       free(driver_info_2);
-                       break;
-               }
-               case 3:
-               {
-                       DRIVER_INFO_3 *driver_info_3;
-                       
-                       UNISTR **dependentfiles;
-                       int i;
-
-                       driver_info_3=r_u->ctr.driver.info3;
-                       
-                       for (i=0; i<r_u->numofdrivers; i++)
-                       {
-                               int j=0;
-                               dependentfiles=(driver_info_3[i]).dependentfiles;
-                               while ( dependentfiles[j] != NULL )
-                               {
-                                       free(dependentfiles[j]);
-                                       j++;
-                               }
-                               
-                               free(dependentfiles);           
-                       }
-                       free(driver_info_3);
-                       break;
-               }
-       }
-}
-
 /*******************************************************************
+ Parse a SPOOL_Q_ENUMPRINTERDRIVERS structure.
 ********************************************************************/  
 BOOL spoolss_io_q_enumprinterdrivers(char *desc, SPOOL_Q_ENUMPRINTERDRIVERS *q_u, prs_struct *ps, int depth)
 {
 
-       uint32 useless_ptr=0xADDE0FF0;
-       prs_debug(ps, depth, desc, "");
+       prs_debug(ps, depth, desc, "spoolss_io_q_enumprinterdrivers");
        depth++;
 
-       prs_align(ps);
-       prs_uint32("pointer", ps, depth, &useless_ptr);
-       smb_io_unistr2("", &(q_u->name),True,ps,depth); 
-       prs_align(ps);
-       prs_uint32("pointer", ps, depth, &useless_ptr);
-       smb_io_unistr2("", &(q_u->environment),True,ps,depth);
-       prs_align(ps);
-       prs_uint32("level", ps, depth, &(q_u->level));
-       spoolss_io_read_buffer("", ps, depth, &(q_u->buffer));
-       prs_align(ps);
-       prs_uint32("buf_size", ps, depth, &(q_u->buf_size));
+       if (!prs_align(ps))
+               return False;
+               
+       if (!prs_uint32("name_ptr", ps, depth, &q_u->name_ptr))
+               return False;
+       if (!smb_io_unistr2("", &q_u->name, q_u->name_ptr,ps, depth))
+               return False;
+               
+       if (!prs_align(ps))
+               return False;
+       if (!prs_uint32("environment_ptr", ps, depth, &q_u->environment_ptr))
+               return False;
+       if (!smb_io_unistr2("", &q_u->environment, q_u->environment_ptr, ps, depth))
+               return False;
+               
+       if (!prs_align(ps))
+               return False;
+       if (!prs_uint32("level", ps, depth, &q_u->level))
+               return False;
+               
+       if (!new_spoolss_io_buffer("", ps, depth, q_u->buffer))
+               return False;
+
+       if (!prs_align(ps))
+               return False;
+               
+       if (!prs_uint32("offered", ps, depth, &q_u->offered))
+               return False;
 
        return True;
 }
@@ -3451,114 +3442,61 @@ BOOL new_spoolss_io_r_enumforms(char *desc, SPOOL_R_ENUMFORMS *r_u, prs_struct *
 }
 
 /*******************************************************************
+ Parse a SPOOL_R_ENUMPORTS structure.
 ********************************************************************/  
-BOOL spoolss_io_r_enumports(char *desc, SPOOL_R_ENUMPORTS *r_u, prs_struct *ps, int depth)
-{              
-       uint32 useless_ptr=0xADDE0FF0;
-       uint32 start_offset, end_offset, beginning;
-       uint32 bufsize_required=0;
-       int i;
-       
-       prs_debug(ps, depth, desc, "spoolss_io_r_enumports");
+BOOL new_spoolss_io_r_enumports(char *desc, SPOOL_R_ENUMPORTS *r_u, prs_struct *ps, int depth)
+{
+       prs_debug(ps, depth, desc, "new_spoolss_io_r_enumports");
        depth++;
 
-       prs_align(ps);  
-       prs_uint32("pointer", ps, depth, &useless_ptr);
-       switch (r_u->level)
-       {
-               case 2:
-               {
-                       PORT_INFO_2 *port_2;
-                       port_2=r_u->ctr.port.info_2;
-                       
-                       for (i=0; i<r_u->numofports; i++)
-                       {
-                               bufsize_required += spoolss_size_port_info_2(&(port_2[i]));
-                       }
-                       break;
-               }
-       }
-       
-       DEBUG(4,("size needed: %d\n",bufsize_required));
-       DEBUG(4,("size offered: %d\n",r_u->offered));
-
-       /* check if the buffer is big enough for the datas */
-       if (r_u->offered<bufsize_required)
-       {       
-
-               /* it's too small */
-               r_u->status=ERROR_INSUFFICIENT_BUFFER;  /* say so */
-               r_u->offered=0;                         /* don't send back the buffer */
-               
-               DEBUG(4,("buffer too small\n"));
-
-               prs_uint32("size of buffer", ps, depth, &(r_u->offered));
-       }
-       else
-       {       
-               DEBUG(4,("buffer large enough\n"));
-       
-               prs_uint32("size of buffer", ps, depth, &(r_u->offered));
-               beginning=prs_offset(ps);
-               start_offset=prs_offset(ps);
-               end_offset=start_offset+r_u->offered;
-               
-               switch (r_u->level)
-               {
-                       case 2:
-                       {
-                               PORT_INFO_2 *info;
-                               for (i=0; i<r_u->numofports; i++)
-                               {
-                                       info = &(r_u->ctr.port.info_2[i]);
-                                       smb_io_port_2(desc, info, ps, depth, &start_offset, &end_offset);
-                               }
-                               break;
-                       }               
-               }               
-               prs_set_offset(ps, beginning+r_u->offered);
-               prs_align(ps);
-       }
-       
-       /*
-        * if the buffer was too small, send the minimum required size
-        * if it was too large, send the real needed size
-        */
-               
-       prs_uint32("size of buffer needed", ps, depth, &(bufsize_required));
-       prs_uint32("numofports", ps, depth, &(r_u->numofports));        
-       prs_uint32("status", ps, depth, &(r_u->status));
+       if (!prs_align(ps))
+               return False;
+               
+       if (!new_spoolss_io_buffer("", ps, depth, r_u->buffer))
+               return False;
 
-       return True;
-}
+       if (!prs_align(ps))
+               return False;
+               
+       if (!prs_uint32("needed", ps, depth, &r_u->needed))
+               return False;
+               
+       if (!prs_uint32("returned", ps, depth, &r_u->returned))
+               return False;
+               
+       if (!prs_uint32("status", ps, depth, &r_u->status))
+               return False;
 
-void spoolss_free_r_enumports(SPOOL_R_ENUMPORTS *r_u)
-{
-       switch (r_u->level)
-       {
-               case 2:
-               {
-                       safe_free(r_u->ctr.port.info_2);
-                       break;
-               }
-       }
+       return True;            
 }
+
 /*******************************************************************
 ********************************************************************/  
 BOOL spoolss_io_q_enumports(char *desc, SPOOL_Q_ENUMPORTS *q_u, prs_struct *ps, int depth)
 {
-       uint32 useless;
        prs_debug(ps, depth, desc, "");
        depth++;
 
-       prs_align(ps);
-       prs_uint32("useless", ps, depth, &useless);
-       smb_io_unistr2("", &(q_u->name),True,ps,depth);
-       prs_align(ps);
-       prs_uint32("level", ps, depth, &(q_u->level));
-       spoolss_io_read_buffer("", ps, depth, &(q_u->buffer));
-       prs_align(ps);
-       prs_uint32("buf_size", ps, depth, &(q_u->buf_size));
+       if (!prs_align(ps))
+               return False;
+
+       if (!prs_uint32("", ps, depth, &q_u->name_ptr))
+               return False;
+       if (!smb_io_unistr2("", &q_u->name,True,ps,depth))
+               return False;
+
+       if (!prs_align(ps))
+               return False;
+       if (!prs_uint32("level", ps, depth, &q_u->level))
+               return False;
+               
+       if (!new_spoolss_io_buffer("", ps, depth, q_u->buffer))
+               return False;
+
+       if (!prs_align(ps))
+               return False;
+       if (!prs_uint32("offered", ps, depth, &q_u->offered))
+               return False;
 
        return True;
 }
@@ -4110,82 +4048,28 @@ BOOL spoolss_io_q_getprinterdriverdir(char *desc, SPOOL_Q_GETPRINTERDRIVERDIR *q
 ********************************************************************/  
 BOOL spoolss_io_r_enumprintprocessors(char *desc, SPOOL_R_ENUMPRINTPROCESSORS *r_u, prs_struct *ps, int depth)
 {              
-       uint32 useless_ptr=0xADDE0FF0;
-       uint32 start_offset, end_offset, beginning;
-       uint32 bufsize_required=0;
-       int i;
-       
        prs_debug(ps, depth, desc, "spoolss_io_r_enumprintprocessors");
        depth++;
 
-       prs_align(ps);  
-       prs_uint32("pointer", ps, depth, &useless_ptr);
-       switch (r_u->level)
-       {
-               case 1:
-               {
-                       PRINTPROCESSOR_1 *info_1;
-                       info_1=r_u->info_1;
-                       
-                       for (i=0; i<r_u->numofprintprocessors; i++)
-                       {
-                               bufsize_required += spoolss_size_processor_info_1(&(info_1[i]));
-                       }
-                       break;
-               }
-       }
-       
-       DEBUG(4,("size needed: %d\n",bufsize_required));
-       DEBUG(4,("size offered: %d\n",r_u->offered));
-
-       /* check if the buffer is big enough for the datas */
-       if (r_u->offered<bufsize_required)
-       {       
-
-               /* it's too small */
-               r_u->status=ERROR_INSUFFICIENT_BUFFER;  /* say so */
-               r_u->offered=0;                         /* don't send back the buffer */
+       if (!prs_align(ps))
+               return False;
                
-               DEBUG(4,("buffer too small\n"));
+       if (!new_spoolss_io_buffer("", ps, depth, r_u->buffer))
+               return False;
 
-               prs_uint32("size of buffer", ps, depth, &(r_u->offered));
-       }
-       else
-       {       
-               DEBUG(4,("buffer large enough\n"));
-       
-               prs_uint32("size of buffer", ps, depth, &(r_u->offered));
-               beginning=prs_offset(ps);
-               start_offset=prs_offset(ps);
-               end_offset=start_offset+r_u->offered;
+       if (!prs_align(ps))
+               return False;
                
-               switch (r_u->level)
-               {
-                       case 1:
-                       {
-                               PRINTPROCESSOR_1 *info_1;
-                               for (i=0; i<r_u->numofprintprocessors; i++)
-                               {
-                                       info_1 = &(r_u->info_1[i]);
-                                       smb_io_processor_info_1(desc, info_1, ps, depth, &start_offset, &end_offset);
-                               }
-                               break;
-                       }               
-               }               
-               prs_set_offset(ps, beginning+r_u->offered);
-               prs_align(ps);
-       }
-       
-       /*
-        * if the buffer was too small, send the minimum required size
-        * if it was too large, send the real needed size
-        */
-               
-       prs_uint32("size of buffer needed", ps, depth, &(bufsize_required));
-       prs_uint32("numofprintprocessors", ps, depth, &(r_u->numofprintprocessors));    
-       prs_uint32("status", ps, depth, &(r_u->status));
+       if (!prs_uint32("needed", ps, depth, &r_u->needed))
+               return False;
+               
+       if (!prs_uint32("returned", ps, depth, &r_u->returned))
+               return False;
+               
+       if (!prs_uint32("status", ps, depth, &r_u->status))
+               return False;
 
-       return True;
+       return True;            
 }
 
 /*******************************************************************
@@ -4196,121 +4080,100 @@ BOOL spoolss_io_q_enumprintprocessors(char *desc, SPOOL_Q_ENUMPRINTPROCESSORS *q
        prs_debug(ps, depth, desc, "spoolss_io_q_enumprintprocessors");
        depth++;
 
-       prs_align(ps);
-       prs_uint32("useless", ps, depth, &useless);
-       smb_io_unistr2("", &(q_u->name),True,ps,depth);
-       prs_align(ps);
-       prs_uint32("useless", ps, depth, &useless);
-       smb_io_unistr2("", &(q_u->environment),True,ps,depth);
-       prs_align(ps);
-       prs_uint32("level", ps, depth, &(q_u->level));
-       spoolss_io_read_buffer("", ps, depth, &(q_u->buffer));
-       prs_align(ps);
-       prs_uint32("buf_size", ps, depth, &(q_u->buf_size));
+       if (!prs_align(ps))
+               return False;
+               
+       if (!prs_uint32("name_ptr", ps, depth, &q_u->name_ptr))
+               return False;
+       if (!smb_io_unistr2("name", &q_u->name, True, ps, depth))
+               return False;
+               
+       if (!prs_align(ps))
+               return False;
+               
+       if (!prs_uint32("", ps, depth, &q_u->environment_ptr))
+               return False;
+       if (!smb_io_unistr2("", &q_u->environment, q_u->environment_ptr, ps, depth))
+               return False;
+       
+       if (!prs_align(ps))
+               return False;
+               
+       if (!prs_uint32("level", ps, depth, &q_u->level))
+               return False;
+               
+       if(!new_spoolss_io_buffer("", ps, depth, q_u->buffer))
+               return False;
+
+       if (!prs_align(ps))
+               return False;
+
+       if (!prs_uint32("offered", ps, depth, &q_u->offered))
+               return False;
 
        return True;
 }
 
 /*******************************************************************
+ Parse a SPOOL_Q_ENUMPRINTMONITORS structure.
 ********************************************************************/  
-BOOL spoolss_io_r_enumprintmonitors(char *desc, SPOOL_R_ENUMPRINTMONITORS *r_u, prs_struct *ps, int depth)
-{              
-       uint32 useless_ptr=0xADDE0FF0;
-       uint32 start_offset, end_offset, beginning;
-       uint32 bufsize_required=0;
-       int i;
-       
-       prs_debug(ps, depth, desc, "spoolss_io_r_enumprintmonitors");
+BOOL spoolss_io_q_enumprintmonitors(char *desc, SPOOL_Q_ENUMPRINTMONITORS *q_u, prs_struct *ps, int depth)
+{
+       prs_debug(ps, depth, desc, "spoolss_io_q_enumprintmonitors");
        depth++;
 
-       prs_align(ps);  
-       prs_uint32("pointer", ps, depth, &useless_ptr);
-       switch (r_u->level)
-       {
-               case 1:
-               {
-                       PRINTMONITOR_1 *info_1;
-                       info_1=r_u->info_1;
-                       
-                       for (i=0; i<r_u->numofprintmonitors; i++)
-                       {
-                               bufsize_required += spoolss_size_monitor_info_1(&(info_1[i]));
-                       }
-                       break;
-               }
-       }
-       
-       DEBUG(4,("size needed: %d\n",bufsize_required));
-       DEBUG(4,("size offered: %d\n",r_u->offered));
-
-       /* check if the buffer is big enough for the datas */
-       if (r_u->offered<bufsize_required)
-       {       
-
-               /* it's too small */
-               r_u->status=ERROR_INSUFFICIENT_BUFFER;  /* say so */
-               r_u->offered=0;                         /* don't send back the buffer */
+       if (!prs_align(ps))
+               return False;
                
-               DEBUG(4,("buffer too small\n"));
-
-               prs_uint32("size of buffer", ps, depth, &(r_u->offered));
-       }
-       else
-       {       
-               DEBUG(4,("buffer large enough\n"));
-       
-               prs_uint32("size of buffer", ps, depth, &(r_u->offered));
-               beginning=prs_offset(ps);
-               start_offset=prs_offset(ps);
-               end_offset=start_offset+r_u->offered;
+       if (!prs_uint32("name_ptr", ps, depth, &q_u->name_ptr))
+               return False;
+       if (!smb_io_unistr2("name", &q_u->name, True, ps, depth))
+               return False;
                
-               switch (r_u->level)
-               {
-                       case 1:
-                       {
-                               PRINTMONITOR_1 *info_1;
-                               for (i=0; i<r_u->numofprintmonitors; i++)
-                               {
-                                       info_1 = &(r_u->info_1[i]);
-                                       smb_io_monitor_info_1(desc, info_1, ps, depth, &start_offset, &end_offset);
-                               }
-                               break;
-                       }               
-               }               
-               prs_set_offset(ps, beginning+r_u->offered);
-               prs_align(ps);
-       }
-       
-       /*
-        * if the buffer was too small, send the minimum required size
-        * if it was too large, send the real needed size
-        */
-               
-       prs_uint32("size of buffer needed", ps, depth, &(bufsize_required));
-       prs_uint32("numofprintmonitors", ps, depth, &(r_u->numofprintmonitors));        
-       prs_uint32("status", ps, depth, &(r_u->status));
+       if (!prs_align(ps))
+               return False;
+                               
+       if (!prs_uint32("level", ps, depth, &q_u->level))
+               return False;
+               
+       if(!new_spoolss_io_buffer("", ps, depth, q_u->buffer))
+               return False;
+
+       if (!prs_align(ps))
+               return False;
+
+       if (!prs_uint32("offered", ps, depth, &q_u->offered))
+               return False;
 
        return True;
 }
 
 /*******************************************************************
 ********************************************************************/  
-BOOL spoolss_io_q_enumprintmonitors(char *desc, SPOOL_Q_ENUMPRINTMONITORS *q_u, prs_struct *ps, int depth)
-{
-       uint32 useless;
-       prs_debug(ps, depth, desc, "spoolss_io_q_enumprintmonitors");
+BOOL spoolss_io_r_enumprintmonitors(char *desc, SPOOL_R_ENUMPRINTMONITORS *r_u, prs_struct *ps, int depth)
+{              
+       prs_debug(ps, depth, desc, "spoolss_io_r_enumprintmonitors");
        depth++;
 
-       prs_align(ps);
-       prs_uint32("useless", ps, depth, &useless);
-       smb_io_unistr2("", &(q_u->name),True,ps,depth);
-       prs_align(ps);
-       prs_uint32("level", ps, depth, &(q_u->level));
-       spoolss_io_read_buffer("", ps, depth, &(q_u->buffer));
-       prs_align(ps);
-       prs_uint32("buf_size", ps, depth, &(q_u->buf_size));
+       if (!prs_align(ps))
+               return False;
+               
+       if (!new_spoolss_io_buffer("", ps, depth, r_u->buffer))
+               return False;
 
-       return True;
+       if (!prs_align(ps))
+               return False;
+               
+       if (!prs_uint32("needed", ps, depth, &r_u->needed))
+               return False;
+               
+       if (!prs_uint32("returned", ps, depth, &r_u->returned))
+               return False;
+               
+       if (!prs_uint32("status", ps, depth, &r_u->status))
+               return False;
+
+       return True;            
 }
 
 /*******************************************************************
index 2cebc8148ba76c50e80bad7186c40d247ff982c1..6e8b30676005703b523746cf5067a4be7bf406a8 100644 (file)
@@ -796,7 +796,7 @@ static BOOL api_pipe_bind_and_alt_req(pipes_struct *p, prs_struct *pd, enum RPC_
         * Create the header, now we know the length.
         */
 
-       init_rpc_hdr(&p->hdr, RPC_BINDACK, RPC_FLG_FIRST | RPC_FLG_LAST,
+       init_rpc_hdr(&p->hdr, pkt_type, RPC_FLG_FIRST | RPC_FLG_LAST,
                        p->hdr.call_id,
                        RPC_HEADER_LEN + prs_offset(&out_hdr_ba) + prs_offset(&out_auth),
                        auth_len);
index 60333e1f3b434f55559afad213a930b35c19428e..50b6dd38460520ce170fcda465d265e984fa37db 100755 (executable)
@@ -107,10 +107,18 @@ static BOOL api_spoolss_closeprinter(uint16 vuid, prs_struct *data, prs_struct *
        ZERO_STRUCT(q_u);
        ZERO_STRUCT(r_u);
 
-       spoolss_io_q_closeprinter("", &q_u, data, 0);
+       if (!spoolss_io_q_closeprinter("", &q_u, data, 0)) {
+               DEBUG(0,("spoolss_io_q_closeprinter: unable to unmarshall SPOOL_Q_CLOSEPRINTER.\n"));
+               return False;
+       }
+       
        r_u.status = _spoolss_closeprinter(&q_u.handle);
        memcpy(&r_u.handle, &q_u.handle, sizeof(r_u.handle));
-       spoolss_io_r_closeprinter("",&r_u,rdata,0);
+
+       if (!spoolss_io_r_closeprinter("",&r_u,rdata,0)) {
+               DEBUG(0,("spoolss_io_r_closeprinter: unable to marshall SPOOL_R_CLOSEPRINTER.\n"));
+               return False;
+       }
 }
 
 /********************************************************************
@@ -125,12 +133,19 @@ static BOOL api_spoolss_rffpcnex(uint16 vuid, prs_struct *data, prs_struct *rdat
        ZERO_STRUCT(q_u);
        ZERO_STRUCT(r_u);
 
-       spoolss_io_q_rffpcnex("", &q_u, data, 0);
+       if (!spoolss_io_q_rffpcnex("", &q_u, data, 0)) {
+               DEBUG(0,("spoolss_io_q_rffpcnex: unable to unmarshall SPOOL_Q_RFFPCNEX.\n"));
+               return False;
+       }
 
        r_u.status = _spoolss_rffpcnex(&q_u.handle, q_u.flags,
                                       q_u.options, &q_u.localmachine,
                                       q_u.printerlocal, &q_u.option);
-       spoolss_io_r_rffpcnex("",&r_u,rdata,0);
+                                      
+       if (!spoolss_io_r_rffpcnex("",&r_u,rdata,0)) {
+               DEBUG(0,("spoolss_io_r_rffpcnex: unable to marshall SPOOL_R_RFFPCNEX.\n"));
+               return False;
+       }
 }
 
 
@@ -148,11 +163,18 @@ static BOOL api_spoolss_rfnpcnex(uint16 vuid, prs_struct *data, prs_struct *rdat
        ZERO_STRUCT(q_u);
        ZERO_STRUCT(r_u);
 
-       spoolss_io_q_rfnpcnex("", &q_u, data, 0);
+       if (!spoolss_io_q_rfnpcnex("", &q_u, data, 0)) {
+               DEBUG(0,("spoolss_io_q_rfnpcnex: unable to unmarshall SPOOL_Q_RFNPCNEX.\n"));
+               return False;
+       }
 
        r_u.status = _spoolss_rfnpcnex(&q_u.handle, q_u.change,
                                       &q_u.option, &r_u.count, &r_u.info);
-       spoolss_io_r_rfnpcnex("", &r_u, rdata, 0);
+                                      
+       if (!spoolss_io_r_rfnpcnex("", &r_u, rdata, 0)) {
+               DEBUG(0,("spoolss_io_r_rfnpcnex: unable to marshall SPOOL_R_RFNPCNEX.\n"));
+               return False;
+       }
 }
 
 
@@ -169,32 +191,33 @@ static BOOL api_spoolss_enumprinters(uint16 vuid, prs_struct *data, prs_struct *
        ZERO_STRUCT(q_u);
        ZERO_STRUCT(r_u);
 
-       spoolss_io_q_enumprinters("", &q_u, data, 0);
+       DEBUG(5,("api_spoolss_enumprinters\n"));
 
-       /* lkclXXX DAMN DAMN DAMN!  MICROSOFT @#$%S IT UP, AGAIN, AND WE
-          HAVE TO DEAL WITH IT!  AGH!
-        */
-       r_u.level = q_u.level;
-       r_u.status = _spoolss_enumprinters(
-                               q_u.flags,
-                               &q_u.servername,
-                               q_u.level,
-                               &q_u.buffer,
-                               q_u.buf_size,
-                               &r_u.offered,
-                               &r_u.needed,
-                               &r_u.ctr,
-                               &r_u.returned);
+       new_spoolss_allocate_buffer(&q_u.buffer);
+
+       if (!spoolss_io_q_enumprinters("", &q_u, data, 0)) {
+               DEBUG(0,("spoolss_io_q_enumprinters: unable to unmarshall SPOOL_Q_ENUMPRINTERS.\n"));
+               return False;
+       }
+
+       /* that's an [in out] buffer */
+       new_spoolss_move_buffer(q_u.buffer, &r_u.buffer);
+
+       r_u.status = _spoolss_enumprinters( q_u.flags, &q_u.servername, q_u.level,
+                                           r_u.buffer, q_u.offered,
+                                           &r_u.needed, &r_u.returned);
        
-       memcpy(r_u.servername.buffer,q_u.servername.buffer,
-              2*q_u.servername.uni_str_len);
-       r_u.servername.buffer[q_u.servername.uni_str_len] = 0;
+       if (!new_spoolss_io_r_enumprinters("", &r_u, rdata, 0)) {
+               DEBUG(0,("new_spoolss_io_r_enumprinters: unable to marshall SPOOL_R_ENUMPRINTERS.\n"));
+               new_spoolss_free_buffer(q_u.buffer);
+               return False;
+       }
 
-       spoolss_io_free_buffer(&(q_u.buffer));
-       spoolss_io_r_enumprinters("",&r_u,rdata,0);
+       new_spoolss_free_buffer(q_u.buffer);
+       
+       return True;
 }
 
-
 /********************************************************************
  * api_spoolss_getprinter
  * called from the spoolss dispatcher
@@ -208,7 +231,10 @@ static BOOL api_spoolss_getprinter(uint16 vuid, prs_struct *data, prs_struct *rd
        ZERO_STRUCT(q_u);
        ZERO_STRUCT(r_u);
 
-       spoolss_io_q_getprinter("", &q_u, data, 0);
+       if(!spoolss_io_q_getprinter("", &q_u, data, 0)) {
+               DEBUG(0,("spoolss_io_q_getprinter: unable to unmarshall SPOOL_Q_GETPRINTER.\n"));
+               return False;
+       }
 
        r_u.status = _spoolss_getprinter(&q_u.handle, q_u.level,
                                        &r_u.ctr, &q_u.offered, &r_u.needed);
@@ -218,7 +244,12 @@ static BOOL api_spoolss_getprinter(uint16 vuid, prs_struct *data, prs_struct *rd
        r_u.level = q_u.level;
        safe_free(q_u.buffer);
 
-       spoolss_io_r_getprinter("",&r_u,rdata,0);
+       if(!spoolss_io_r_getprinter("",&r_u,rdata,0)) {
+               DEBUG(0,("spoolss_io_r_getprinter: unable to marshall SPOOL_R_GETPRINTER.\n"));
+               return False;
+       }
+       
+       return True;
 }
 
 
@@ -235,7 +266,10 @@ static BOOL api_spoolss_getprinterdriver2(uint16 vuid, prs_struct *data, prs_str
        ZERO_STRUCT(q_u);
        ZERO_STRUCT(r_u);
        
-       spoolss_io_q_getprinterdriver2("", &q_u, data, 0);
+       if(!spoolss_io_q_getprinterdriver2("", &q_u, data, 0)) {
+               DEBUG(0,("spoolss_io_q_getprinterdriver2: unable to unmarshall SPOOL_Q_GETPRINTERDRIVER2.\n"));
+               return False;
+       }
        
        r_u.status = _spoolss_getprinterdriver2(&q_u.handle,
                                &q_u.architecture, q_u.level,
@@ -246,7 +280,12 @@ static BOOL api_spoolss_getprinterdriver2(uint16 vuid, prs_struct *data, prs_str
        r_u.level = q_u.level;
        spoolss_io_free_buffer(&(q_u.buffer));
 
-       spoolss_io_r_getprinterdriver2("",&r_u,rdata,0);
+       if(!spoolss_io_r_getprinterdriver2("",&r_u,rdata,0)) {
+               DEBUG(0,("spoolss_io_r_getprinterdriver2: unable to marshall SPOOL_R_GETPRINTERDRIVER2.\n"));
+               return False;
+       }
+       
+       return True;
 }
 
 /********************************************************************
@@ -262,9 +301,19 @@ static BOOL api_spoolss_startpageprinter(uint16 vuid, prs_struct *data, prs_stru
        ZERO_STRUCT(q_u);
        ZERO_STRUCT(r_u);
        
-       spoolss_io_q_startpageprinter("", &q_u, data, 0);
+       if(!spoolss_io_q_startpageprinter("", &q_u, data, 0)) {
+               DEBUG(0,("spoolss_io_q_startpageprinter: unable to unmarshall SPOOL_Q_STARTPAGEPRINTER.\n"));
+               return False;
+       }
+       
        r_u.status = _spoolss_startpageprinter(&q_u.handle);
-       spoolss_io_r_startpageprinter("",&r_u,rdata,0);         
+       
+       if(!spoolss_io_r_startpageprinter("",&r_u,rdata,0)) {
+               DEBUG(0,("spoolss_io_r_startpageprinter: unable to marshall SPOOL_R_STARTPAGEPRINTER.\n"));
+               return False;
+       }
+       
+       return True;    
 }
 
 
@@ -281,9 +330,19 @@ static BOOL api_spoolss_endpageprinter(uint16 vuid, prs_struct *data, prs_struct
        ZERO_STRUCT(q_u);
        ZERO_STRUCT(r_u);
        
-       spoolss_io_q_endpageprinter("", &q_u, data, 0);
+       if(!spoolss_io_q_endpageprinter("", &q_u, data, 0)) {
+               DEBUG(0,("spoolss_io_q_endpageprinter: unable to unmarshall SPOOL_Q_ENDPAGEPRINTER.\n"));
+               return False;
+       }
+       
        r_u.status = _spoolss_endpageprinter(&q_u.handle);
-       spoolss_io_r_endpageprinter("",&r_u,rdata,0);           
+       
+       if(!spoolss_io_r_endpageprinter("",&r_u,rdata,0)) {
+               DEBUG(0,("spoolss_io_r_endpageprinter: unable to marshall SPOOL_R_ENDPAGEPRINTER.\n"));
+               return False;
+       }
+       
+       return True;
 }
 
 /********************************************************************
@@ -299,12 +358,22 @@ static BOOL api_spoolss_startdocprinter(uint16 vuid, prs_struct *data, prs_struc
        ZERO_STRUCT(q_u);
        ZERO_STRUCT(r_u);
        
-       spoolss_io_q_startdocprinter("", &q_u, data, 0);
+       if(!spoolss_io_q_startdocprinter("", &q_u, data, 0)) {
+               DEBUG(0,("spoolss_io_q_startdocprinter: unable to unmarshall SPOOL_Q_STARTDOCPRINTER.\n"));
+               return False;
+       }
+       
        r_u.status = _spoolss_startdocprinter(&q_u.handle,
                                  q_u.doc_info_container.level,
                                  &q_u.doc_info_container.docinfo,
                                  &r_u.jobid);
-       spoolss_io_r_startdocprinter("",&r_u,rdata,0);          
+       
+       if(!spoolss_io_r_startdocprinter("",&r_u,rdata,0)) {
+               DEBUG(0,("spoolss_io_r_startdocprinter: unable to marshall SPOOL_R_STARTDOCPRINTER.\n"));
+               return False;
+       }
+       
+       return True;
 }
 
 /********************************************************************
@@ -320,9 +389,19 @@ static BOOL api_spoolss_enddocprinter(uint16 vuid, prs_struct *data, prs_struct
        ZERO_STRUCT(q_u);
        ZERO_STRUCT(r_u);
        
-       spoolss_io_q_enddocprinter("", &q_u, data, 0);
+       if(!spoolss_io_q_enddocprinter("", &q_u, data, 0)) {
+               DEBUG(0,("spoolss_io_q_enddocprinter: unable to unmarshall SPOOL_Q_ENDDOCPRINTER.\n"));
+               return False;
+       }
+       
        r_u.status = _spoolss_enddocprinter(&q_u.handle);
-       spoolss_io_r_enddocprinter("",&r_u,rdata,0);            
+       
+       if(!spoolss_io_r_enddocprinter("",&r_u,rdata,0)) {
+               DEBUG(0,("spoolss_io_r_enddocprinter: unable to marshall SPOOL_R_ENDDOCPRINTER.\n"));
+               return False;
+       }
+       
+       return True;            
 }
 
 
@@ -339,14 +418,24 @@ static BOOL api_spoolss_writeprinter(uint16 vuid, prs_struct *data, prs_struct *
        ZERO_STRUCT(q_u);
        ZERO_STRUCT(r_u);
        
-       spoolss_io_q_writeprinter("", &q_u, data, 0);
+       if(!spoolss_io_q_writeprinter("", &q_u, data, 0)) {
+               DEBUG(0,("spoolss_io_q_writeprinter: unable to unmarshall SPOOL_Q_WRITEPRINTER.\n"));
+               return False;
+       }
+       
        r_u.status = _spoolss_writeprinter(&q_u.handle,
                                           q_u.buffer_size,
                                           q_u.buffer,
                                           &q_u.buffer_size2);
        r_u.buffer_written = q_u.buffer_size2;
        safe_free(q_u.buffer);
-       spoolss_io_r_writeprinter("",&r_u,rdata,0);             
+       
+       if(!spoolss_io_r_writeprinter("",&r_u,rdata,0)) {
+               DEBUG(0,("spoolss_io_r_writeprinter: unable to marshall SPOOL_R_WRITEPRINTER.\n"));
+               return False;
+       }
+
+       return True;
 }
 
 /****************************************************************************
@@ -359,7 +448,11 @@ static BOOL api_spoolss_setprinter(uint16 vuid, prs_struct *data, prs_struct *rd
        ZERO_STRUCT(q_u);
        ZERO_STRUCT(r_u);
 
-       spoolss_io_q_setprinter("", &q_u, data, 0);
+       if(!spoolss_io_q_setprinter("", &q_u, data, 0)) {
+               DEBUG(0,("spoolss_io_q_setprinter: unable to unmarshall SPOOL_Q_SETPRINTER.\n"));
+               return False;
+       }
+       
        DEBUG(0,("api_spoolss_setprinter: typecast sec_des to uint8*!\n"));
        r_u.status = _spoolss_setprinter(&q_u.handle,
                                         q_u.level, &q_u.info,
@@ -367,7 +460,13 @@ static BOOL api_spoolss_setprinter(uint16 vuid, prs_struct *data, prs_struct *rd
                                         q_u.security.size_of_buffer,
                                         (const uint8*)q_u.security.data,
                                         q_u.command);
-       spoolss_io_r_setprinter("",&r_u,rdata,0);
+       
+       if(!spoolss_io_r_setprinter("",&r_u,rdata,0)) {
+               DEBUG(0,("spoolss_io_r_setprinter: unable to marshall SPOOL_R_SETPRINTER.\n"));
+               return False;
+       }
+
+       return True;
 }
 
 /****************************************************************************
@@ -380,9 +479,19 @@ static BOOL api_spoolss_fcpn(uint16 vuid, prs_struct *data, prs_struct *rdata)
        ZERO_STRUCT(q_u);
        ZERO_STRUCT(r_u);
 
-       spoolss_io_q_fcpn("", &q_u, data, 0);
+       if(!spoolss_io_q_fcpn("", &q_u, data, 0)) {
+               DEBUG(0,("spoolss_io_q_fcpn: unable to unmarshall SPOOL_Q_FCPN.\n"));
+               return False;
+       }
+       
        r_u.status = _spoolss_fcpn(&q_u.handle);
-       spoolss_io_r_fcpn("",&r_u,rdata,0);             
+       
+       if(!spoolss_io_r_fcpn("",&r_u,rdata,0)) {
+               DEBUG(0,("spoolss_io_r_fcpn: unable to marshall SPOOL_R_FCPN.\n"));
+               return False;
+       }
+
+       return True;
 }
 
 
@@ -396,13 +505,22 @@ static BOOL api_spoolss_addjob(uint16 vuid, prs_struct *data, prs_struct *rdata)
        ZERO_STRUCT(q_u);
        ZERO_STRUCT(r_u);
        
-       spoolss_io_q_addjob("", &q_u, data, 0);
+       if(!spoolss_io_q_addjob("", &q_u, data, 0)) {
+               DEBUG(0,("spoolss_io_q_addjob: unable to unmarshall SPOOL_Q_ADDJOB.\n"));
+               return False;
+       }
 
        r_u.status = _spoolss_addjob(&q_u.handle, q_u.level,
                                     &q_u.buffer, q_u.buf_size);
        
        spoolss_io_free_buffer(&(q_u.buffer));
-       spoolss_io_r_addjob("",&r_u,rdata,0);           
+       
+       if(!spoolss_io_r_addjob("",&r_u,rdata,0)) {
+               DEBUG(0,("spoolss_io_r_addjob: unable to marshall SPOOL_R_ADDJOB.\n"));
+               return False;
+       }
+
+       return True;            
 }
 
 
@@ -415,15 +533,30 @@ static BOOL api_spoolss_enumjobs(uint16 vuid, prs_struct *data, prs_struct *rdat
 
        ZERO_STRUCT(q_u);
        ZERO_STRUCT(r_u);
+
+       new_spoolss_allocate_buffer(&q_u.buffer);
+
+       if (!spoolss_io_q_enumjobs("", &q_u, data, 0)) {
+               DEBUG(0,("spoolss_io_q_enumjobs: unable to unmarshall SPOOL_Q_ENUMJOBS.\n"));
+               return False;
+       }
+
+       /* that's an [in out] buffer */
+       new_spoolss_move_buffer(q_u.buffer, &r_u.buffer);
+
+       r_u.status = _spoolss_enumjobs(&q_u.handle, q_u.firstjob, q_u.numofjobs, q_u.level,
+                                       r_u.buffer, q_u.offered,
+                                       &r_u.needed, &r_u.returned);
+
+       if (!spoolss_io_r_enumjobs("",&r_u,rdata,0)) {
+               DEBUG(0,("spoolss_io_r_enumjobs: unable to marshall SPOOL_R_ENUMJOBS.\n"));
+               new_spoolss_free_buffer(q_u.buffer);
+               return False;
+       }
+
+       new_spoolss_free_buffer(q_u.buffer);
        
-       spoolss_io_q_enumjobs("", &q_u, data, 0);
-       r_u.offered = q_u.buf_size;
-       r_u.level = q_u.level;
-       r_u.status = _spoolss_enumjobs(&q_u.handle,
-                               q_u.firstjob, q_u.numofjobs, q_u.level,
-                               &r_u.ctr, &r_u.offered, &r_u.numofjobs);
-       spoolss_io_free_buffer(&(q_u.buffer));
-       spoolss_io_r_enumjobs("",&r_u,rdata,0);
+       return True;
 }
 
 
@@ -437,9 +570,19 @@ static BOOL api_spoolss_schedulejob(uint16 vuid, prs_struct *data, prs_struct *r
        ZERO_STRUCT(q_u);
        ZERO_STRUCT(r_u);
        
-       spoolss_io_q_schedulejob("", &q_u, data, 0);
+       if(!spoolss_io_q_schedulejob("", &q_u, data, 0)) {
+               DEBUG(0,("spoolss_io_q_schedulejob: unable to unmarshall SPOOL_Q_SCHEDULEJOB.\n"));
+               return False;
+       }
+       
        r_u.status = _spoolss_schedulejob(&q_u.handle, q_u.jobid);
-       spoolss_io_r_schedulejob("",&r_u,rdata,0);              
+       
+       if(!spoolss_io_r_schedulejob("",&r_u,rdata,0)) {
+               DEBUG(0,("spoolss_io_r_schedulejob: unable to marshall SPOOL_R_SCHEDULEJOB.\n"));
+               return False;
+       }
+       
+       return True;
 }
 
 /****************************************************************************
@@ -452,10 +595,20 @@ static BOOL api_spoolss_setjob(uint16 vuid, prs_struct *data, prs_struct *rdata)
        ZERO_STRUCT(q_u);
        ZERO_STRUCT(r_u);
        
-       spoolss_io_q_setjob("", &q_u, data, 0);
+       if(!spoolss_io_q_setjob("", &q_u, data, 0)) {
+               DEBUG(0,("spoolss_io_q_setjob: unable to unmarshall SPOOL_Q_SETJOB.\n"));
+               return False;
+       }
+       
        r_u.status = _spoolss_setjob(&q_u.handle, q_u.jobid,
                                q_u.level, &q_u.ctr, q_u.command);
-       spoolss_io_r_setjob("",&r_u,rdata,0);
+                               
+       if(!spoolss_io_r_setjob("",&r_u,rdata,0)) {
+               DEBUG(0,("spoolss_io_r_setjob: unable to marshall SPOOL_R_SETJOB.\n"));
+               return False;
+       }
+       
+       return True;
 }
 
 /****************************************************************************
@@ -468,18 +621,30 @@ static BOOL api_spoolss_enumprinterdrivers(uint16 vuid, prs_struct *data, prs_st
        
        ZERO_STRUCT(q_u);
        ZERO_STRUCT(r_u);
-       
-       spoolss_io_q_enumprinterdrivers("", &q_u, data, 0);
 
-       r_u.offered = q_u.buf_size;
-       r_u.level = q_u.level;
-       r_u.status = _spoolss_enumprinterdrivers(&q_u.name,
-                               &q_u.environment, q_u. level,
-                               &r_u.ctr, &r_u.offered, &r_u.numofdrivers);
+       new_spoolss_allocate_buffer(&q_u.buffer);
 
-       spoolss_io_free_buffer(&q_u.buffer);
-       spoolss_io_r_enumdrivers("",&r_u,rdata,0);
-       free_spoolss_r_enumdrivers(&r_u);
+       if (!spoolss_io_q_enumprinterdrivers("", &q_u, data, 0)) {
+               DEBUG(0,("spoolss_io_q_enumprinterdrivers: unable to unmarshall SPOOL_Q_ENUMPRINTERDRIVERS.\n"));
+               return False;
+       }
+
+       /* that's an [in out] buffer */
+       new_spoolss_move_buffer(q_u.buffer, &r_u.buffer);
+
+       r_u.status = _spoolss_enumprinterdrivers(&q_u.name, &q_u.environment, q_u.level,
+                                                r_u.buffer, q_u.offered,
+                                                &r_u.needed, &r_u.returned);
+
+       if (!new_spoolss_io_r_enumprinterdrivers("",&r_u,rdata,0)) {
+               DEBUG(0,("new_spoolss_io_r_enumprinterdrivers: unable to marshall SPOOL_R_ENUMPRINTERDRIVERS.\n"));
+               new_spoolss_free_buffer(q_u.buffer);
+               return False;
+       }
+
+       new_spoolss_free_buffer(q_u.buffer);
+       
+       return True;
 }
 
 
@@ -493,12 +658,12 @@ static BOOL api_spoolss_enumforms(uint16 vuid, prs_struct *data, prs_struct *rda
        ZERO_STRUCT(q_u);
        ZERO_STRUCT(r_u);
 
-       DEBUG(5,("spoolss_io_q_enumforms\n"));
-
        new_spoolss_allocate_buffer(&q_u.buffer);
 
-       if (!spoolss_io_q_enumforms("", &q_u, data, 0))
+       if (!spoolss_io_q_enumforms("", &q_u, data, 0)) {
+               DEBUG(0,("spoolss_io_q_enumforms: unable to unmarshall SPOOL_Q_ENUMFORMS.\n"));
                return False;
+       }
 
        /* that's an [in out] buffer */
        new_spoolss_move_buffer(q_u.buffer, &r_u.buffer);
@@ -508,6 +673,7 @@ static BOOL api_spoolss_enumforms(uint16 vuid, prs_struct *data, prs_struct *rda
                                &r_u.needed, &r_u.numofforms);
 
        if (!new_spoolss_io_r_enumforms("",&r_u,rdata,0)) {
+               DEBUG(0,("new_spoolss_io_r_enumforms: unable to marshall SPOOL_R_ENUMFORMS.\n"));
                new_spoolss_free_buffer(q_u.buffer);
                return False;
        }
@@ -527,20 +693,30 @@ static BOOL api_spoolss_enumports(uint16 vuid, prs_struct *data, prs_struct *rda
        
        ZERO_STRUCT(q_u);
        ZERO_STRUCT(r_u);
-       
-       spoolss_io_q_enumports("", &q_u, data, 0);
 
-       r_u.offered = q_u.buf_size;
-       r_u.level = q_u.level;
-       r_u.status = _spoolss_enumports(&q_u.name,
-                               q_u.level,
-                               &r_u.ctr,
-                               &r_u.offered,
-                               &r_u.numofports);
+       new_spoolss_allocate_buffer(&q_u.buffer);
+
+       if(!spoolss_io_q_enumports("", &q_u, data, 0)) {
+               DEBUG(0,("spoolss_io_q_enumports: unable to unmarshall SPOOL_Q_ENUMPORTS.\n"));
+               return False;
+       }
+
+       /* that's an [in out] buffer */
+       new_spoolss_move_buffer(q_u.buffer, &r_u.buffer);
        
-       spoolss_io_free_buffer(&(q_u.buffer));
-       spoolss_io_r_enumports("",&r_u,rdata,0);
-       spoolss_free_r_enumports(&r_u);
+       r_u.status = _spoolss_enumports(&q_u.name, q_u.level,
+                                       r_u.buffer, q_u.offered,
+                                       &r_u.needed, &r_u.returned);
+       
+       if (!new_spoolss_io_r_enumports("",&r_u,rdata,0)) {
+               DEBUG(0,("new_spoolss_io_r_enumports: unable to marshall SPOOL_R_ENUMPORTS.\n"));
+               new_spoolss_free_buffer(q_u.buffer);
+               return False;
+       }
+       
+       new_spoolss_free_buffer(q_u.buffer);
+       
+       return True;
 }
 
 
@@ -554,13 +730,23 @@ static BOOL api_spoolss_addprinterex(uint16 vuid, prs_struct *data, prs_struct *
        ZERO_STRUCT(q_u);
        ZERO_STRUCT(r_u);
        
-       spoolss_io_q_addprinterex("", &q_u, data, 0);
+       if(!spoolss_io_q_addprinterex("", &q_u, data, 0)) {
+               DEBUG(0,("spoolss_io_q_addprinterex: unable to unmarshall SPOOL_Q_ADDPRINTEREX.\n"));
+               return False;
+       }
+       
        r_u.status = _spoolss_addprinterex(&q_u.server_name,
                                q_u.level, &q_u.info,
                                q_u.unk0, q_u.unk1, q_u.unk2, q_u.unk3,
                                q_u.user_level, &q_u.user,
                                &r_u.handle);
-       spoolss_io_r_addprinterex("", &r_u, rdata, 0);
+                               
+       if(!spoolss_io_r_addprinterex("", &r_u, rdata, 0)) {
+               DEBUG(0,("spoolss_io_r_addprinterex: unable to marshall SPOOL_R_ADDPRINTEREX.\n"));
+               return False;
+       }
+       
+       return True;
 }
 
 /****************************************************************************
@@ -573,10 +759,20 @@ static BOOL api_spoolss_addprinterdriver(uint16 vuid, prs_struct *data, prs_stru
        ZERO_STRUCT(q_u);
        ZERO_STRUCT(r_u);
        
-       spoolss_io_q_addprinterdriver("", &q_u, data, 0);
+       if(!spoolss_io_q_addprinterdriver("", &q_u, data, 0)) {
+               DEBUG(0,("spoolss_io_q_addprinterdriver: unable to unmarshall SPOOL_Q_ADDPRINTERDRIVER.\n"));
+               return False;
+       }
+       
        r_u.status = _spoolss_addprinterdriver(&q_u.server_name,
                                q_u.level, &q_u.info);
-       spoolss_io_r_addprinterdriver("", &r_u, rdata, 0);
+                               
+       if(!spoolss_io_r_addprinterdriver("", &r_u, rdata, 0)) {
+               DEBUG(0,("spoolss_io_r_addprinterdriver: unable to marshall SPOOL_R_ADDPRINTERDRIVER.\n"));
+               return False;
+       }
+       
+       return True;
 }
 
 /****************************************************************************
@@ -586,7 +782,10 @@ static BOOL api_spoolss_getprinterdriverdirectory(uint16 vuid, prs_struct *data,
        SPOOL_Q_GETPRINTERDRIVERDIR q_u;
        SPOOL_R_GETPRINTERDRIVERDIR r_u;
        
-       spoolss_io_q_getprinterdriverdir("", &q_u, data, 0);
+       if(!spoolss_io_q_getprinterdriverdir("", &q_u, data, 0)) {
+               DEBUG(0,("spoolss_io_q_getprinterdriverdir: unable to unmarshall SPOOL_Q_GETPRINTERDRIVERDIR.\n"));
+               return False;
+       }
        
        r_u.offered = q_u.buf_size;
        r_u.level = q_u.level;
@@ -596,7 +795,13 @@ static BOOL api_spoolss_getprinterdriverdirectory(uint16 vuid, prs_struct *data,
                                &r_u.ctr,
                                &r_u.offered);
        spoolss_io_free_buffer(&q_u.buffer);
-       spoolss_io_r_getprinterdriverdir("", &r_u, rdata, 0);
+       
+       if(!spoolss_io_r_getprinterdriverdir("", &r_u, rdata, 0)) {
+               DEBUG(0,("spoolss_io_r_getprinterdriverdir: unable to marshall SPOOL_R_GETPRINTERDRIVERDIR.\n"));
+               return False;
+       }
+       
+       return True;
 }
 
 /****************************************************************************
@@ -609,7 +814,11 @@ static BOOL api_spoolss_enumprinterdata(uint16 vuid, prs_struct *data, prs_struc
        ZERO_STRUCT(q_u);
        ZERO_STRUCT(r_u);
        
-       spoolss_io_q_enumprinterdata("", &q_u, data, 0);
+       if(!spoolss_io_q_enumprinterdata("", &q_u, data, 0)) {
+               DEBUG(0,("spoolss_io_q_enumprinterdata: unable to unmarshall SPOOL_Q_ENUMPRINTERDATA.\n"));
+               return False;
+       }
+       
        r_u.valuesize = q_u.valuesize;
        r_u.datasize = q_u.datasize;
 
@@ -622,8 +831,15 @@ static BOOL api_spoolss_enumprinterdata(uint16 vuid, prs_struct *data, prs_struc
                                &r_u.datasize,/* in out */
                                &r_u.data,/* out */
                                &r_u.realdatasize);/* out */
-       spoolss_io_r_enumprinterdata("", &r_u, rdata, 0);
+                               
+       if(!spoolss_io_r_enumprinterdata("", &r_u, rdata, 0)) {
+               DEBUG(0,("spoolss_io_r_enumprinterdata: unable to marshall SPOOL_R_ENUMPRINTERDATA.\n"));
+               return False;
+       }
+
        safe_free(r_u.data);
+
+       return True;
 }
 
 /****************************************************************************
@@ -636,12 +852,21 @@ static BOOL api_spoolss_setprinterdata(uint16 vuid, prs_struct *data, prs_struct
        ZERO_STRUCT(q_u);
        ZERO_STRUCT(r_u);
        
-       spoolss_io_q_setprinterdata("", &q_u, data, 0);
+       if(!spoolss_io_q_setprinterdata("", &q_u, data, 0)) {
+               DEBUG(0,("spoolss_io_q_setprinterdata: unable to unmarshall SPOOL_Q_SETPRINTERDATA.\n"));
+               return False;
+       }
+       
        r_u.status = _spoolss_setprinterdata(&q_u.handle,
                                &q_u.value, q_u.type, q_u.max_len,
                                q_u.data, q_u.real_len, q_u.numeric_data);
-       spoolss_io_r_setprinterdata("", &r_u, rdata, 0);
-       safe_free(q_u.data);
+                               
+       if(!spoolss_io_r_setprinterdata("", &r_u, rdata, 0)) {
+               DEBUG(0,("spoolss_io_r_setprinterdata: unable to marshall SPOOL_R_SETPRINTERDATA.\n"));
+               return False;
+       }
+
+       return True;
 }
 
 /****************************************************************************
@@ -654,9 +879,19 @@ static BOOL api_spoolss_addform(uint16 vuid, prs_struct *data, prs_struct *rdata
        ZERO_STRUCT(q_u);
        ZERO_STRUCT(r_u);
        
-       spoolss_io_q_addform("", &q_u, data, 0);
+       if(!spoolss_io_q_addform("", &q_u, data, 0)) {
+               DEBUG(0,("spoolss_io_q_addform: unable to unmarshall SPOOL_Q_ADDFORM.\n"));
+               return False;
+       }
+       
        r_u.status = _spoolss_addform(&q_u.handle, q_u.level, &q_u.form);
-       spoolss_io_r_addform("", &r_u, rdata, 0);
+       
+       if(!spoolss_io_r_addform("", &r_u, rdata, 0)) {
+               DEBUG(0,("spoolss_io_r_addform: unable to marshall SPOOL_R_ADDFORM.\n"));
+               return False;
+       }
+
+       return True;
 }
 
 /****************************************************************************
@@ -669,10 +904,20 @@ static BOOL api_spoolss_setform(uint16 vuid, prs_struct *data, prs_struct *rdata
        ZERO_STRUCT(q_u);
        ZERO_STRUCT(r_u);
        
-       spoolss_io_q_setform("", &q_u, data, 0);
+       if(!spoolss_io_q_setform("", &q_u, data, 0)) {
+               DEBUG(0,("spoolss_io_q_setform: unable to unmarshall SPOOL_Q_SETFORM.\n"));
+               return False;
+       }
+       
        r_u.status = _spoolss_setform(&q_u.handle,
                                      &q_u.name, q_u.level, &q_u.form);
-       spoolss_io_r_setform("", &r_u, rdata, 0);
+                                     
+       if(!spoolss_io_r_setform("", &r_u, rdata, 0)) {
+               DEBUG(0,("spoolss_io_r_setform: unable to marshall SPOOL_R_SETFORM.\n"));
+               return False;
+       }
+
+       return True;
 }
 
 /****************************************************************************
@@ -685,18 +930,29 @@ static BOOL api_spoolss_enumprintprocessors(uint16 vuid, prs_struct *data, prs_s
        ZERO_STRUCT(q_u);
        ZERO_STRUCT(r_u);
        
-       spoolss_io_q_enumprintprocessors("", &q_u, data, 0);
-       r_u.offered = q_u.buf_size;
-       r_u.level = q_u.level;
-       r_u.status = _spoolss_enumprintprocessors(&q_u.name,
-                               &q_u.environment,
-                               q_u.level,
-                               &r_u.info_1,
-                               &r_u.offered,
-                               &r_u.numofprintprocessors);
-       spoolss_io_free_buffer(&q_u.buffer);
-       spoolss_io_r_enumprintprocessors("", &r_u, rdata, 0);
-       safe_free(r_u.info_1);
+       new_spoolss_allocate_buffer(&q_u.buffer);
+
+       if(!spoolss_io_q_enumprintprocessors("", &q_u, data, 0)) {
+               DEBUG(0,("spoolss_io_q_enumprintprocessors: unable to unmarshall SPOOL_Q_ENUMPRINTPROCESSORS.\n"));
+               return False;
+       }
+       
+       /* that's an [in out] buffer */
+       new_spoolss_move_buffer(q_u.buffer, &r_u.buffer);
+       
+       r_u.status = _spoolss_enumprintprocessors(&q_u.name, &q_u.environment, q_u.level,
+                                                 r_u.buffer, q_u.offered,
+                                                 &r_u.needed, &r_u.returned);
+
+       if(!spoolss_io_r_enumprintprocessors("", &r_u, rdata, 0)) {
+               DEBUG(0,("spoolss_io_r_enumprintprocessors: unable to marshall SPOOL_R_ENUMPRINTPROCESSORS.\n"));
+               new_spoolss_free_buffer(q_u.buffer);
+               return False;
+       }
+       
+       new_spoolss_free_buffer(q_u.buffer);
+       
+       return True;
 }
 
 /****************************************************************************
@@ -709,17 +965,29 @@ static BOOL api_spoolss_enumprintmonitors(uint16 vuid, prs_struct *data, prs_str
        ZERO_STRUCT(q_u);
        ZERO_STRUCT(r_u);
        
-       spoolss_io_q_enumprintmonitors("", &q_u, data, 0);
-       r_u.offered = q_u.buf_size;
-       r_u.level = q_u.level;
-       r_u.status = _spoolss_enumprintmonitors(&q_u.name,
-                               q_u.level,
-                               &r_u.info_1,
-                               &r_u.offered,
-                               &r_u.numofprintmonitors);
-       spoolss_io_free_buffer(&q_u.buffer);
-       spoolss_io_r_enumprintmonitors("", &r_u, rdata, 0);
-       safe_free(r_u.info_1);
+       new_spoolss_allocate_buffer(&q_u.buffer);
+
+       if (!spoolss_io_q_enumprintmonitors("", &q_u, data, 0)) {
+               DEBUG(0,("spoolss_io_q_enumprintmonitors: unable to unmarshall SPOOL_Q_ENUMPRINTMONITORS.\n"));
+               return False;
+       }
+               
+       /* that's an [in out] buffer */
+       new_spoolss_move_buffer(q_u.buffer, &r_u.buffer);
+
+       r_u.status = _spoolss_enumprintmonitors(&q_u.name, q_u.level,
+                                               r_u.buffer, q_u.offered,
+                                               &r_u.needed, &r_u.returned);
+
+       if (!spoolss_io_r_enumprintmonitors("", &r_u, rdata, 0)) {
+               DEBUG(0,("spoolss_io_r_enumprintmonitors: unable to marshall SPOOL_R_ENUMPRINTMONITORS.\n"));
+               new_spoolss_free_buffer(q_u.buffer);
+               return False;
+       }
+       
+       new_spoolss_free_buffer(q_u.buffer);
+       
+       return True;
 }
 
 /****************************************************************************
@@ -729,7 +997,10 @@ static BOOL api_spoolss_getjob(uint16 vuid, prs_struct *data, prs_struct *rdata)
        SPOOL_Q_GETJOB q_u;
        SPOOL_R_GETJOB r_u;
        
-       spoolss_io_q_getjob("", &q_u, data, 0);
+       if(!spoolss_io_q_getjob("", &q_u, data, 0)) {
+               DEBUG(0,("spoolss_io_q_getjob: unable to unmarshall SPOOL_Q_GETJOB.\n"));
+               return False;
+       }
 
        r_u.offered = q_u.buf_size;
        r_u.level = q_u.level;
@@ -739,8 +1010,15 @@ static BOOL api_spoolss_getjob(uint16 vuid, prs_struct *data, prs_struct *rdata)
                                &r_u.ctr,
                                &r_u.offered);
        spoolss_io_free_buffer(&(q_u.buffer));
-       spoolss_io_r_getjob("",&r_u,rdata,0);
+       
+       if(!spoolss_io_r_getjob("",&r_u,rdata,0)) {
+               DEBUG(0,("spoolss_io_r_getjob: unable to marshall SPOOL_R_GETJOB.\n"));
+               return False;
+       }
+       
        free_spoolss_r_getjob(&r_u);
+       
+       return True;
 }
 
 /*******************************************************************
index d25281cea527988ce6be2f3d5b2022fd9a6023a3..2e80cbdbf6ffccf1053c7e6c1743e1ec34e00f6e 100644 (file)
@@ -200,11 +200,8 @@ static BOOL open_printer_hnd(POLICY_HND *hnd)
        {
                if (!Printer[i].open)
                {
-                       Printer[i].open = True; 
-                       Printer[i].ok = True;   
-               
+                       Printer[i].open = True;                 
                        memcpy(&(Printer[i].printer_hnd), hnd, sizeof(*hnd));
-
                        DEBUG(4,("Opened printer handle[%x] ", i));
                        dump_data(4, hnd->data, sizeof(hnd->data));
                        return True;
@@ -221,32 +218,14 @@ static BOOL set_printer_hnd_accesstype(POLICY_HND *hnd, uint32 access_required)
 {
        int pnum = find_printer_index_by_hnd(hnd);
 
-       if (OPEN_HANDLE(pnum)) {
-               DEBUG(4,("Setting printer access=%x (pnum=%x)\n", access_required, pnum));
-               Printer[pnum].access = access_required;
-               return True;            
-       }
-       else {
+       if (!OPEN_HANDLE(pnum)) {
                DEBUG(4,("Error setting printer type=%x (pnum=%x)", access_required, pnum));
                return False;
        }
-       return False;
-}
-
-/****************************************************************************
-  .
-****************************************************************************/
-static BOOL printer_entry_is_valid(POLICY_HND *hnd)
-{
-       int pnum = find_printer_index_by_hnd(hnd);
 
-       if (!OPEN_HANDLE(pnum))
-               return False;           
-       
-       if (Printer[pnum].ok == False)
-               return False;
-               
-       return True;
+       DEBUG(4,("Setting printer access=%x (pnum=%x)\n", access_required, pnum));
+       Printer[pnum].access = access_required;
+       return True;            
 }
 
 /****************************************************************************
@@ -266,23 +245,19 @@ static BOOL set_printer_hnd_printertype(POLICY_HND *hnd, char *printername)
 
        if ( strlen(printername) < 3 ) {
                DEBUGADD(4,("A print server must have at least 1 char ! %s\n", printername));
-               Printer[pnum].ok=False;
                return False;
        }
 
        /* it's a print server */
        if (!strchr(printername+2, '\\')) {
                DEBUGADD(4,("Printer is a print server\n"));
-               Printer[pnum].printer_type = PRINTER_HANDLE_IS_PRINTSERVER;
-               Printer[pnum].ok=True;
-               
+               Printer[pnum].printer_type = PRINTER_HANDLE_IS_PRINTSERVER;             
                return True;
        }
        /* it's a printer */
        else {
                DEBUGADD(4,("Printer is a printer\n"));
                Printer[pnum].printer_type = PRINTER_HANDLE_IS_PRINTER;
-               Printer[pnum].ok=True;
                return True;
        }
 
@@ -295,11 +270,11 @@ static BOOL set_printer_hnd_printertype(POLICY_HND *hnd, char *printername)
 static BOOL set_printer_hnd_printername(POLICY_HND *hnd, char *printername)
 {
        int pnum = find_printer_index_by_hnd(hnd);
-       char *back;
        NT_PRINTER_INFO_LEVEL printer;
        int snum;
        int n_services=lp_numservices();
-       uint32 marche;
+       char *aprinter;
+       BOOL found=False;
        
        if (!OPEN_HANDLE(pnum))
        {
@@ -309,54 +284,66 @@ static BOOL set_printer_hnd_printername(POLICY_HND *hnd, char *printername)
 
        DEBUG(4,("Setting printer name=%s (len=%d) (pnum=%x)\n", printername, strlen(printername), pnum));
 
-       switch (Printer[pnum].printer_type) {
-       case PRINTER_HANDLE_IS_PRINTSERVER:
+       if (Printer[pnum].printer_type==PRINTER_HANDLE_IS_PRINTSERVER) {
                ZERO_STRUCT(Printer[pnum].dev.printerservername);
                strncpy(Printer[pnum].dev.printerservername, printername, strlen(printername));
                return True;
-               break;
+       }
 
-       case PRINTER_HANDLE_IS_PRINTER:
-               back=strchr(printername+2, '\\');
-               back=back+1;
-               DEBUGADD(5,("searching for %s (len=%d)\n", back,strlen(back)));
-               /*
-                * store the Samba share name in it
-                * in back we have the long printer name
-                * need to iterate all the snum and do a
-                * get_a_printer each time to find the printer
-                * faster to do it here than later.
-                */
-               for (snum=0;snum<n_services; snum++) {
-                       if (lp_browseable(snum) && lp_snum_ok(snum) && lp_print_ok(snum) ) {
-                               DEBUGADD(5,("share:%s\n",lp_servicename(snum)));
-
-                               marche=get_a_printer(&printer, 2, lp_servicename(snum));
-                               DEBUGADD(6,("marche:%d\n",marche));
-
-                               if ( marche==0 && ( strlen(printer.info_2->printername) == strlen(back) )
-                                    && ( !strncasecmp(printer.info_2->printername, back, strlen(back)))
-                                  ) {
-                                       DEBUGADD(4,("Printer found: %s[%x]\n",lp_servicename(snum),snum));
-                                       ZERO_STRUCT(Printer[pnum].dev.printername);
-                                       strncpy(Printer[pnum].dev.printername, lp_servicename(snum), strlen(lp_servicename(snum)));
-                                       free_a_printer(printer, 2);
-                                       return True;
-                                       break;
-                               }
-                               free_a_printer(printer, 2);
-                       }
-               }
+       if (Printer[pnum].printer_type!=PRINTER_HANDLE_IS_PRINTER)
                return False;
-               break;
-                               
-          default:
+       
+       aprinter=strchr(printername+2, '\\');
+       aprinter++;
+
+       DEBUGADD(5,("searching for [%s] (len=%d)\n", aprinter, strlen(aprinter)));
+       /*
+        * store the Samba share name in it
+        * in back we have the long printer name
+        * need to iterate all the snum and do a
+        * get_a_printer each time to find the printer
+        * faster to do it here than later.
+        */
+
+       for (snum=0;snum<n_services && found==False;snum++) {
+       
+               if ( !(lp_browseable(snum) && lp_snum_ok(snum) && lp_print_ok(snum) ) )
+                       continue;
+               
+               DEBUGADD(5,("share:%s\n",lp_servicename(snum)));
+
+               if (get_a_printer(&printer, 2, lp_servicename(snum))!=0)
+                       continue;
+
+               if ( strlen(printer.info_2->printername) != strlen(aprinter) ) {
+                       free_a_printer(printer, 2);
+                       continue;
+               }
+               
+               if ( strncasecmp(printer.info_2->printername, aprinter, strlen(aprinter)))  {
+                       free_a_printer(printer, 2);
+                       continue;
+               }
+               
+               found=True;
+       }
+
+       if (found==False)
+       {
+               DEBUGADD(4,("Printer not found\n"));
                return False;
-               break;
-        }
+       }
+       
+       DEBUGADD(4,("Printer found: %s[%x]\n",lp_servicename(snum),snum));
+       ZERO_STRUCT(Printer[pnum].dev.printername);
+       strncpy(Printer[pnum].dev.printername, lp_servicename(snum), strlen(lp_servicename(snum)));
+       free_a_printer(printer, 2);
+       
+       return True;
 }
 
 /********************************************************************
+ Return True is the handle is a print server.
  ********************************************************************/
 static BOOL handle_is_printserver(const POLICY_HND *handle)
 {
@@ -371,6 +358,30 @@ static BOOL handle_is_printserver(const POLICY_HND *handle)
        return True;
 }
 
+/****************************************************************************
+ allocate more memory for a BUFFER.
+****************************************************************************/
+static BOOL alloc_buffer_size(NEW_BUFFER *buffer, uint32 buffer_size)
+{
+       prs_struct *ps;
+       uint32 extra_space;
+       
+       ps=&(buffer->prs);
+
+       /* damn, I'm doing the reverse operation of prs_grow() :) */
+       if (buffer_size < prs_data_size(ps))
+               extra_space=0;
+       else    
+               extra_space = buffer_size - prs_data_size(ps);
+       
+       if (!prs_grow(ps, extra_space))
+               return False;
+
+       buffer->string_at_end=prs_data_size(ps);
+
+       return True;
+}
+
 /********************************************************************
  * spoolss_open_printer
  *
@@ -400,9 +411,15 @@ uint32 _spoolss_open_printer_ex( const UNISTR2 *printername,
 
        open_printer_hnd(handle);
        
-       set_printer_hnd_printertype(handle, name);
+       if (!set_printer_hnd_printertype(handle, name)) {
+               close_printer_handle(handle);
+               return NT_STATUS_ACCESS_DENIED;
+       }
        
-       set_printer_hnd_printername(handle, name);
+       if (!set_printer_hnd_printername(handle, name)) {
+               close_printer_handle(handle);
+               return NT_STATUS_ACCESS_DENIED;
+       }
 
 /*
        if (printer_default->datatype_ptr != NULL)
@@ -414,14 +431,11 @@ uint32 _spoolss_open_printer_ex( const UNISTR2 *printername,
                set_printer_hnd_datatype(handle, "");
 */
        
-       set_printer_hnd_accesstype(handle, printer_default->access_required);
-
-       if (!printer_entry_is_valid(handle))
-       {
+       if (!set_printer_hnd_accesstype(handle, printer_default->access_required)) {
                close_printer_handle(handle);
                return NT_STATUS_ACCESS_DENIED;
        }
-       
+               
        return NT_STATUS_NO_PROBLEMO;
 }
 
@@ -536,7 +550,8 @@ uint32 _spoolss_closeprinter(POLICY_HND *handle)
 }
 
 /********************************************************************
- ********************************************************************/
+ GetPrinterData on a printer server Handle.
+********************************************************************/
 static BOOL getprinterdata_printer_server(fstring value, uint32 *type, uint8 **data, uint32 *needed, uint32 in_size)
 {              
        int i;
@@ -585,7 +600,7 @@ static BOOL getprinterdata_printer_server(fstring value, uint32 *type, uint8 **d
                *type = 0x1;                    
                *needed = 2*(strlen(string)+1);         
                *data  = (uint8 *)malloc( ((*needed > in_size) ? *needed:in_size) *sizeof(uint8));
-               ZERO_STRUCTP(*data);
+               memset(*data, 0, (*needed > in_size) ? *needed:in_size);
                
                /* it's done by hand ready to go on the wire */
                for (i=0; i<strlen(string); i++)
@@ -602,7 +617,7 @@ static BOOL getprinterdata_printer_server(fstring value, uint32 *type, uint8 **d
                *type = 0x1;                    
                *needed = 2*(strlen(string)+1); 
                *data  = (uint8 *)malloc( ((*needed > in_size) ? *needed:in_size) *sizeof(uint8));
-               ZERO_STRUCTP(*data);
+               memset(*data, 0, (*needed > in_size) ? *needed:in_size);
                for (i=0; i<strlen(string); i++)
                {
                        (*data)[2*i]=string[i];
@@ -615,7 +630,8 @@ static BOOL getprinterdata_printer_server(fstring value, uint32 *type, uint8 **d
 }
 
 /********************************************************************
- ********************************************************************/
+ GetPrinterData on a printer Handle.
+********************************************************************/
 static BOOL getprinterdata_printer(const POLICY_HND *handle,
                                fstring value, uint32 *type, 
                                uint8 **data, uint32 *needed, uint32 in_size )
@@ -674,8 +690,8 @@ uint32 _spoolss_getprinterdata(const POLICY_HND *handle, UNISTR2 *valuename,
        *out_size=in_size;
 
        /* in case of problem, return some default values */
-       *needed=in_size;
-       *type=4;
+       *needed=0;
+       *type=0;
        
        DEBUG(4,("_spoolss_getprinterdata\n"));
        
@@ -694,6 +710,7 @@ uint32 _spoolss_getprinterdata(const POLICY_HND *handle, UNISTR2 *valuename,
        if (found==False) {
                /* reply this param doesn't exist */
                *data=(uint8 *)malloc(4*sizeof(uint8));
+               memset(*data, 0x0, 4);
                return ERROR_INVALID_PARAMETER;
        }
        
@@ -1495,9 +1512,10 @@ static BOOL construct_printer_info_0(PRINTER_INFO_0 *printer,int snum, pstring s
  * construct_printer_info_1
  * fill a printer_info_1 struct
  ********************************************************************/
-static BOOL construct_printer_info_1(PRINTER_INFO_1 *printer,int snum, pstring servername)
+static BOOL construct_printer_info_1(PRINTER_INFO_1 *printer, int snum, pstring servername)
 {
        pstring chaine;
+       pstring chaine2;
        NT_PRINTER_INFO_LEVEL ntprinter;
        
        if (get_a_printer(&ntprinter, 2, lp_servicename(snum)) != 0)
@@ -1505,21 +1523,23 @@ static BOOL construct_printer_info_1(PRINTER_INFO_1 *printer,int snum, pstring s
                return (False);
        }
        
-       printer->flags=PRINTER_ENUM_NAME;
+       printer->flags=PRINTER_ENUM_ICON8;
 
        /* the description and the name are of the form \\server\share */
-       slprintf(chaine,sizeof(chaine)-1,"\\\\%s\\%s,%s,%s",servername,
+
+       snprintf(chaine,sizeof(chaine)-1,"\\\\%s\\%s,%s,%s",servername,
                                                            ntprinter.info_2->printername,
                                                            ntprinter.info_2->drivername,
                                                            lp_comment(snum));
        init_unistr(&(printer->description), chaine);
        
-       slprintf(chaine,sizeof(chaine)-1,"\\\\%s\\%s", servername, ntprinter.info_2->printername);
-       init_unistr(&(printer->name), chaine);
+       snprintf(chaine2,sizeof(chaine)-1,"\\\\%s\\%s", servername, ntprinter.info_2->printername);
+       init_unistr(&(printer->name), chaine2);
        
        init_unistr(&(printer->comment), lp_comment(snum));
        
        free_a_printer(ntprinter, 2);
+
        return (True);
 }
 
@@ -1648,29 +1668,26 @@ static BOOL construct_printer_info_2(PRINTER_INFO_2 *printer, int snum, pstring
  * enum_printer_info_1
  * glue between spoolss_enumprinters and construct_printer_info_1
  ********************************************************************/
-static BOOL enum_printer_info_1(PRINTER_INFO_1 **printer, int snum, int number)
+static BOOL get_printer_info_1(PRINTER_INFO_1 **printer, int snum, int number)
 {
        pstring servername;
 
        *printer=(PRINTER_INFO_1 *)malloc(sizeof(PRINTER_INFO_1));
        DEBUG(4,("Allocated memory for ONE PRINTER_INFO_1 at [%p]\n", *printer));       
        pstrcpy(servername, global_myname);
-       if (!construct_printer_info_1(*printer, snum, servername))
-       {
+       if (!construct_printer_info_1(*printer, snum, servername)) {
                free(*printer);
-               return (False);
+               return False;
        }
        else
-       {
-               return (True);
-       }
+               return True;
 }
 
 /********************************************************************
  * enum_printer_info_2
  * glue between spoolss_enumprinters and construct_printer_info_2
  ********************************************************************/
-static BOOL enum_printer_info_2(PRINTER_INFO_2 **printer, int snum, int number)
+static BOOL get_printer_info_2(PRINTER_INFO_2 **printer, int snum, int number)
 {
        pstring servername;
 
@@ -1693,26 +1710,100 @@ static BOOL enum_printer_info_2(PRINTER_INFO_2 **printer, int snum, int number)
  *
  * called from api_spoolss_enumprinters (see this to understand)
  ********************************************************************/
-static void enum_all_printers_info_1(PRINTER_INFO_1 ***printers, uint32 *number)
+static BOOL enum_printer_info_1(fstring name, NEW_BUFFER *buffer, uint32 offered, uint32 *needed, uint32 *returned)
 {
        int snum;
+       int i;
        int n_services=lp_numservices();
-       *printers=NULL;
-       *number=0;
+       PRINTER_INFO_1 *printer=NULL;
+DEBUG(1,("enum_printer_info_1\n"));
+       for (snum=0; snum<n_services; snum++) {
+               if (lp_browseable(snum) && lp_snum_ok(snum) && lp_print_ok(snum) ) {
+                       DEBUG(4,("Found a printer in smb.conf: %s[%x]\n", lp_servicename(snum), snum));
+               
+                       /*
+                               JFM: here we should check the name
+                       
+                        */
+                               
+                       if (get_printer_info_1(&printer , snum, *returned) )                    
+                               (*returned)++;
+               }
+       }
+       
+       /* check the required size. */  
+       for (i=0; i<*returned; i++)
+               (*needed) += spoolss_size_printer_info_1(printer);
 
-       for (snum=0;snum<n_services; snum++)
-       {
-               if (lp_browseable(snum) && lp_snum_ok(snum) && lp_print_ok(snum) )
-               {
-                       DEBUG(4,("Found a printer: %s[%x]\n",lp_servicename(snum),snum));
-                       *printers=Realloc(*printers, (*number+1)*sizeof(PRINTER_INFO_1 *));                     
-                       DEBUG(4,("ReAlloced memory for [%d] PRINTER_INFO_1 pointers at [%p]\n", *number+1, *printers));         
-                       if (enum_printer_info_1( &((*printers)[*number]), snum, *number) )
-                       {                       
-                               (*number)++;
+       if (!alloc_buffer_size(buffer, *needed))
+               return ERROR_INSUFFICIENT_BUFFER;
+
+       /* fill the buffer with the structures */
+
+       for (i=0; i<*returned; i++)
+               new_smb_io_printer_info_1("", buffer, printer, 0);      
+       
+       /* clear memory */
+
+       if (*needed > offered) {
+               *returned=0;
+               return ERROR_INSUFFICIENT_BUFFER;
+       }
+       else
+               return NT_STATUS_NO_PROBLEMO;
+}
+
+/********************************************************************
+ Spoolss_enumprinters.
+********************************************************************/
+static BOOL enum_all_printers_info_1(NEW_BUFFER *buffer, uint32 offered, uint32 *needed, uint32 *returned)
+{
+       int snum;
+       int i;
+       int n_services=lp_numservices();
+       PRINTER_INFO_1 *printers=NULL;
+       PRINTER_INFO_1 current_prt;
+       pstring servername;
+       
+       DEBUG(4,("enum_all_printers_info_1\n"));
+       
+       pstrcpy(servername, global_myname);
+
+       for (snum=0; snum<n_services; snum++) {
+               if (lp_browseable(snum) && lp_snum_ok(snum) && lp_print_ok(snum) ) {
+                       DEBUG(4,("Found a printer in smb.conf: %s[%x]\n", lp_servicename(snum), snum));
+                               
+                       if (construct_printer_info_1(&current_prt, snum, servername))
+                       {
+                               printers=Realloc(printers, (*returned +1)*sizeof(PRINTER_INFO_1));
+                               DEBUG(4,("ReAlloced memory for [%d] PRINTER_INFO_1\n", *returned));             
+                               memcpy(&(printers[*returned]), &current_prt, sizeof(PRINTER_INFO_1));
+                               (*returned)++;
                        }
                }
        }
+               
+       /* check the required size. */  
+       for (i=0; i<*returned; i++)
+               (*needed) += spoolss_size_printer_info_1(&(printers[i]));
+
+       if (!alloc_buffer_size(buffer, *needed))
+               return ERROR_INSUFFICIENT_BUFFER;
+
+
+       /* fill the buffer with the structures */
+
+       for (i=0; i<*returned; i++)
+               new_smb_io_printer_info_1("", buffer, &(printers[i]), 0);       
+
+       /* clear memory */
+
+       if (*needed > offered) {
+               *returned=0;
+               return ERROR_INSUFFICIENT_BUFFER;
+       }
+       else
+               return NT_STATUS_NO_PROBLEMO;
 }
 
 /********************************************************************
@@ -1720,26 +1811,90 @@ static void enum_all_printers_info_1(PRINTER_INFO_1 ***printers, uint32 *number)
  *
  * called from api_spoolss_enumprinters (see this to understand)
  ********************************************************************/
-static void enum_all_printers_info_2(PRINTER_INFO_2 ***printers, uint32 *number)
+static BOOL enum_all_printers_info_2(NEW_BUFFER *buffer, uint32 offered, uint32 *needed, uint32 *returned)
 {
        int snum;
+       int i;
        int n_services=lp_numservices();
-       *printers=NULL;
-       *number=0;
+       PRINTER_INFO_2 **printers=NULL;
 
-       for (snum=0;snum<n_services; snum++)
-       {
-               if (lp_browseable(snum) && lp_snum_ok(snum) && lp_print_ok(snum) )
-               {
-                       DEBUG(4,("Found a printer: %s[%x]\n",lp_servicename(snum),snum));
-                       *printers=Realloc(*printers, (*number+1)*sizeof(PRINTER_INFO_2 *));                     
-                       DEBUG(4,("ReAlloced memory for [%d] PRINTER_INFO_2 pointers at [%p]\n", *number+1, *printers));                 
-                       if (enum_printer_info_2( &((*printers)[*number]), snum, *number) )
-                       {                       
-                               (*number)++;
-                       }
+       for (snum=0; snum<n_services; snum++) {
+               if (lp_browseable(snum) && lp_snum_ok(snum) && lp_print_ok(snum) ) {
+               
+                       DEBUG(4,("Found a printer in smb.conf: %s[%x]\n", lp_servicename(snum), snum));
+                       
+                       printers=Realloc(printers, ((*returned)+1)*sizeof(PRINTER_INFO_2 *));
+                                               
+                       DEBUG(4,("ReAlloced memory for [%d] PRINTER_INFO_2 pointers\n", (*returned)+1));                        
+
+                       if (get_printer_info_2( &(printers[*returned]), snum, *returned) )
+                               (*returned)++;
                }
        }
+       
+       /* check the required size. */  
+       for (i=0; i<*returned; i++)
+               (*needed) += spoolss_size_printer_info_2(printers[i]);
+
+       if (!alloc_buffer_size(buffer, *needed))
+               return ERROR_INSUFFICIENT_BUFFER;
+
+       /* fill the buffer with the structures */
+       for (i=0; i<*returned; i++)
+               new_smb_io_printer_info_2("", buffer, printers[i], 0);  
+       
+       /* clear memory */
+
+       if (*needed > offered) {
+               *returned=0;
+               return ERROR_INSUFFICIENT_BUFFER;
+       }
+       else
+               return NT_STATUS_NO_PROBLEMO;
+}
+
+/********************************************************************
+ * handle enumeration of printers at level 1
+ ********************************************************************/
+static uint32 enumprinters_level1( uint32 flags, fstring name,
+                                NEW_BUFFER *buffer, uint32 offered,
+                                uint32 *needed, uint32 *returned)
+{
+       if (flags && PRINTER_ENUM_NETWORK)
+               return enum_all_printers_info_1(buffer, offered, needed, returned);
+       
+       if (flags && PRINTER_ENUM_NAME) {
+               if (*name=='\0')
+                       return enum_all_printers_info_1(buffer, offered, needed, returned);
+               else
+                       return enum_printer_info_1(name, buffer, offered, needed, returned);
+       }
+       
+       if (flags && PRINTER_ENUM_REMOTE)
+               return enum_all_printers_info_1(buffer, offered, needed, returned);
+
+
+}
+
+/********************************************************************
+ * handle enumeration of printers at level 2
+ ********************************************************************/
+static uint32 enumprinters_level2( uint32 flags, fstring servername,
+                                NEW_BUFFER *buffer, uint32 offered,
+                                uint32 *needed, uint32 *returned)
+{
+       return enum_all_printers_info_2(buffer, offered, needed, returned);
+}
+
+/********************************************************************
+ * handle enumeration of printers at level 5
+ ********************************************************************/
+static uint32 enumprinters_level5( uint32 flags, fstring servername,
+                                NEW_BUFFER *buffer, uint32 offered,
+                                uint32 *needed, uint32 *returned)
+{
+/*     return enum_all_printers_info_5(buffer, offered, needed, returned);*/
+       return NT_STATUS_NO_PROBLEMO;
 }
 
 /********************************************************************
@@ -1747,55 +1902,48 @@ static void enum_all_printers_info_2(PRINTER_INFO_2 ***printers, uint32 *number)
  *
  * called from api_spoolss_enumprinters (see this to understand)
  ********************************************************************/
-uint32 _spoolss_enumprinters(
-                               uint32 flags,
-                               const UNISTR2 *servername,
-                               uint32 level,
-                               const BUFFER *buffer,
-                               uint32 buf_size,
-                               uint32 *offered,
-                               uint32 *needed,
-                               PRINTER_INFO_CTR *ctr,
-                               uint32 *returned)
+uint32 _spoolss_enumprinters( uint32 flags, const UNISTR2 *servername, uint32 level,
+                             NEW_BUFFER *buffer, uint32 offered,
+                             uint32 *needed, uint32 *returned)
 {
-       DEBUG(4,("Enumerating printers\n"));
+       fstring name;
+       
+       DEBUG(4,("_spoolss_enumprinters\n"));
 
-       (*returned)=0;
+       *needed=0;
+       *returned=0;
+       
+       /*
+        * Level 1: 
+        *          flags==PRINTER_ENUM_NAME
+        *           if name=="" then enumerates all printers
+        *           if name!="" then enumerate the printer
+        *          flags==PRINTER_ENUM_REMOTE
+        *          name is NULL, enumerate printers
+        * Level 2: name!="" enumerates printers, name can't be NULL
+        * Level 3: doesn't exist
+        * Level 4: does a local registry lookup
+        * Level 5: same as Level 2
+        */
 
-       switch (level)
-       {
-               case 1:
-                       if (flags == PRINTER_ENUM_NAME ||
-                           flags == PRINTER_ENUM_NETWORK )
-                       {
-                               /*if (is_a_printerserver(servername))*/
-                                       enum_all_printers_info_1(&ctr->printer.printers_1, returned );
-                               /*else  
-                                       enum_one_printer_info_1(&r_u);*/
-                               break;
-                       }
-               case 2:
-                       if (flags == PRINTER_ENUM_NAME ||
-                           flags == PRINTER_ENUM_NETWORK )
-                       {
-                               /*if (is_a_printerserver(servername))*/
-                                       enum_all_printers_info_2(&ctr->printer.printers_2, returned );
-                               /*else  
-                                       enum_one_printer_info_2(&r_u);*/
-                               break;
-                       }
-               case 3:         /* doesn't exist */
-                       return NT_STATUS_INVALID_INFO_CLASS;
-               case 4:         /* can't, always on local machine */
-                       break;
-               case 5:
-                       return NT_STATUS_INVALID_INFO_CLASS;
-                       
-       }
-       DEBUG(4,("%d printers enumerated\n", *returned));
-       (*offered) = buffer->size;
+       unistr2_to_ascii(name, servername, sizeof(name)-1);
 
-       return 0x0;
+       switch (level) {
+       case 1:
+               return enumprinters_level1(flags, name, buffer, offered, needed, returned);
+               break;
+       case 2:
+               return enumprinters_level2(flags, name, buffer, offered, needed, returned);
+               break;                          
+       case 5:
+               return enumprinters_level5(flags, name, buffer, offered, needed, returned);
+               break;                          
+       case 3:
+       case 4:
+       default:
+               return NT_STATUS_INVALID_LEVEL;
+               break;
+       }
 }
 
 /****************************************************************************
@@ -2562,86 +2710,135 @@ static BOOL fill_job_info_2(JOB_INFO_2 *job_info, print_queue_struct *queue,
 }
 
 /****************************************************************************
+ Enumjobs at level 1.
 ****************************************************************************/
-uint32 _spoolss_enumjobs( const POLICY_HND *handle,
-                               uint32 reqfirstjob,
-                               uint32 reqnumofjobs,
-                               uint32 level,
-                               JOB_INFO_CTR *ctr,
-                               uint32 *buf_size,
-                               uint32 *numofjobs)
+static uint32 enumjobs_level1(print_queue_struct *queue, int snum, 
+                             NEW_BUFFER *buffer, uint32 offered, 
+                             uint32 *needed, uint32 *returned)
 {
-       int snum;
-       int count;
+       JOB_INFO_1 *info;
        int i;
-       print_queue_struct *queue=NULL;
-       print_status_struct prt_status;
-
-       DEBUG(4,("spoolss_enumjobs\n"));
-       
-       ZERO_STRUCT(prt_status);
-
-       if (!get_printer_snum(handle, &snum))
-       {
-               return NT_STATUS_INVALID_HANDLE;
-       }
-
-       count = get_printqueue(snum, NULL, &queue, &prt_status);
-       (*numofjobs) = 0;
        
-       DEBUG(4,("count:[%d], status:[%d], [%s]\n",
-                 count, prt_status.status, prt_status.message));
+       info=(JOB_INFO_1 *)malloc(*returned*sizeof(JOB_INFO_1));
        
-       switch (level)
+       for (i=0; i<*returned; i++)
        {
-               case 1:
-               {
-                       for (i=0; i<count; i++)
-                       {
-                               JOB_INFO_1 *job_info_1;
-                               job_info_1=(JOB_INFO_1 *)malloc(sizeof(JOB_INFO_1));
-                               add_job1_to_array(numofjobs,
-                                                 &ctr->job.job_info_1,
-                                                 job_info_1);
-
-                               fill_job_info_1(ctr->job.job_info_1[i],
-                                               &(queue[i]), i, snum);
-                       }
-                       safe_free(queue);
-                       return 0x0;
-               }
-               case 2:
-               {
-                       for (i=0; i<count; i++)
-                       {
-                               JOB_INFO_2 *job_info_2;
-                               job_info_2=(JOB_INFO_2 *)malloc(sizeof(JOB_INFO_2));
-                               add_job2_to_array(numofjobs,
-                                                 &ctr->job.job_info_2,
-                                                 job_info_2);
-
-                               fill_job_info_2(ctr->job.job_info_2[i],
-                                               &(queue[i]), i, snum);
-                       }
-                       safe_free(queue);
-                       return 0x0;
-               }
+               fill_job_info_1(&(info[i]), &(queue[i]), i, snum);
        }
 
+       /* check the required size. */  
+       for (i=0; i<*returned; i++)
+               (*needed) += spoolss_size_job_info_1(&(info[i]));
+
+       if (!alloc_buffer_size(buffer, *needed))
+               return ERROR_INSUFFICIENT_BUFFER;
+
+       /* fill the buffer with the structures */
+       for (i=0; i<*returned; i++)
+               new_smb_io_job_info_1("", buffer, &(info[i]), 0);       
+
+       /* clear memory */
        safe_free(queue);
+       safe_free(info);
 
-       return NT_STATUS_INVALID_INFO_CLASS;
+       if (*needed > offered) {
+               *returned=0;
+               return ERROR_INSUFFICIENT_BUFFER;
+       }
+       else
+               return NT_STATUS_NO_PROBLEMO;
 }
 
 /****************************************************************************
+ Enumjobs at level 2.
 ****************************************************************************/
-uint32 _spoolss_schedulejob( const POLICY_HND *handle, uint32 jobid)
+static uint32 enumjobs_level2(print_queue_struct *queue, int snum, 
+                             NEW_BUFFER *buffer, uint32 offered, 
+                             uint32 *needed, uint32 *returned)
 {
-       return 0x0;
-}
-
-/****************************************************************************
-****************************************************************************/
+       JOB_INFO_2 *info;
+       int i;
+       
+       info=(JOB_INFO_2 *)malloc(*returned*sizeof(JOB_INFO_2));
+       
+       for (i=0; i<*returned; i++)
+       {
+               fill_job_info_2(&(info[i]), &(queue[i]), i, snum);
+       }
+
+       /* check the required size. */  
+       for (i=0; i<*returned; i++)
+               (*needed) += spoolss_size_job_info_2(&(info[i]));
+
+       if (!alloc_buffer_size(buffer, *needed))
+               return ERROR_INSUFFICIENT_BUFFER;
+
+       /* fill the buffer with the structures */
+       for (i=0; i<*returned; i++)
+               new_smb_io_job_info_2("", buffer, &(info[i]), 0);       
+
+       /* clear memory */
+       safe_free(queue);
+       safe_free(info);
+
+       if (*needed > offered) {
+               *returned=0;
+               return ERROR_INSUFFICIENT_BUFFER;
+       }
+       else
+               return NT_STATUS_NO_PROBLEMO;
+}
+
+/****************************************************************************
+ Enumjobs.
+****************************************************************************/
+uint32 _spoolss_enumjobs( POLICY_HND *handle, uint32 firstjob, uint32 numofjobs, uint32 level,                   
+                         NEW_BUFFER *buffer, uint32 offered,
+                         uint32 *needed, uint32 *returned)
+{      
+       int snum;
+       print_queue_struct *queue=NULL;
+       print_status_struct prt_status;
+
+       DEBUG(4,("_spoolss_enumjobs\n"));
+
+       ZERO_STRUCT(prt_status);
+
+       *needed=0;
+       *returned=0;
+
+       if (!get_printer_snum(handle, &snum))
+       {
+               return NT_STATUS_INVALID_HANDLE;
+       }
+
+       *returned = get_printqueue(snum, NULL, &queue, &prt_status);
+       DEBUGADD(4,("count:[%d], status:[%d], [%s]\n", *returned, prt_status.status, prt_status.message));
+
+       switch (level) {
+       case 1:
+               return enumjobs_level1(queue, snum, buffer, offered, needed, returned);
+               break;
+       case 2:
+               return enumjobs_level2(queue, snum, buffer, offered, needed, returned);
+               break;                          
+       default:
+               return NT_STATUS_INVALID_LEVEL;
+               break;
+       }
+}
+
+
+
+/****************************************************************************
+****************************************************************************/
+uint32 _spoolss_schedulejob( const POLICY_HND *handle, uint32 jobid)
+{
+       return 0x0;
+}
+
+/****************************************************************************
+****************************************************************************/
 uint32 _spoolss_setjob( const POLICY_HND *handle,
                                uint32 jobid,
                                uint32 level,
@@ -2705,86 +2902,166 @@ uint32 _spoolss_setjob( const POLICY_HND *handle,
 }
 
 /****************************************************************************
+ Enumerates all printer drivers at level 1.
 ****************************************************************************/
-uint32 _spoolss_enumprinterdrivers( const UNISTR2 *name,
-                               const UNISTR2 *environment,
-                               uint32 level,
-                               DRIVER_INFO *ctr,
-                               uint32 *offered,
-                               uint32 *numofdrivers)
+static uint32 enumprinterdrivers_level1(fstring *list, fstring servername, fstring architecture, NEW_BUFFER *buffer, uint32 offered, uint32 *needed, uint32 *returned)
 {
-       NT_PRINTER_DRIVER_INFO_LEVEL driver;
-       int count;
        int i;
-       fstring *list;
-       fstring servername;
-       fstring architecture;
+       NT_PRINTER_DRIVER_INFO_LEVEL driver;
+       DRIVER_INFO_1 *driver_info_1=NULL;
+       driver_info_1=(DRIVER_INFO_1 *)malloc(*returned * sizeof(DRIVER_INFO_1));
 
-       DEBUG(4,("spoolss_enumdrivers\n"));
-       fstrcpy(servername, global_myname);
+       for (i=0; i<*returned; i++) {
+               get_a_printer_driver(&driver, 3, list[i], architecture);
+               fill_printer_driver_info_1(&(driver_info_1[i]), driver, servername, architecture );
+               free_a_printer_driver(driver, 3);
+       }
+       
+       /* check the required size. */
+       for (i=0; i<*returned; i++)
+       {
+               DEBUGADD(6,("adding driver [%d]'s size\n",i));
+               *needed += spoolss_size_printer_driver_info_1(&(driver_info_1[i]));
+       }
 
-       unistr2_to_ascii(architecture, environment, sizeof(architecture));
-       count=get_ntdrivers(&list, architecture);
+       if (!alloc_buffer_size(buffer, *needed))
+               return ERROR_INSUFFICIENT_BUFFER;
 
-       DEBUGADD(4,("we have: [%d] drivers on archi [%s]\n",count, architecture));
-       for (i=0; i<count; i++)
+       /* fill the buffer with the form structures */
+       for (i=0; i<*returned; i++)
        {
-               DEBUGADD(5,("driver [%s]\n",list[i]));
+               DEBUGADD(6,("adding form [%d] to buffer\n",i));
+               new_smb_io_printer_driver_info_1("", buffer, &(driver_info_1[i]), 0);
+       }
+
+       safe_free(list);
+
+       if (*needed > offered)
+               return ERROR_INSUFFICIENT_BUFFER;
+       else
+               return NT_STATUS_NO_PROBLEMO;
+}
+
+/****************************************************************************
+ Enumerates all printer drivers at level 2.
+****************************************************************************/
+static uint32 enumprinterdrivers_level2(fstring *list, fstring servername, fstring architecture, NEW_BUFFER *buffer, uint32 offered, uint32 *needed, uint32 *returned)
+{
+       int i;
+       NT_PRINTER_DRIVER_INFO_LEVEL driver;
+       DRIVER_INFO_2 *driver_info_2=NULL;
+       driver_info_2=(DRIVER_INFO_2 *)malloc(*returned * sizeof(DRIVER_INFO_2));
+
+       for (i=0; i<*returned; i++) {
+               get_a_printer_driver(&driver, 3, list[i], architecture);
+               fill_printer_driver_info_2(&(driver_info_2[i]), driver, servername, architecture );
+               free_a_printer_driver(driver, 3);
        }
        
-       (*numofdrivers)=count;
+       /* check the required size. */
+       for (i=0; i<*returned; i++)
+       {
+               DEBUGADD(6,("adding driver [%d]'s size\n",i));
+               *needed += spoolss_size_printer_driver_info_2(&(driver_info_2[i]));
+       }
+
+       if (!alloc_buffer_size(buffer, *needed))
+               return ERROR_INSUFFICIENT_BUFFER;
+
+       /* fill the buffer with the form structures */
+       for (i=0; i<*returned; i++)
+       {
+               DEBUGADD(6,("adding form [%d] to buffer\n",i));
+               new_smb_io_printer_driver_info_2("", buffer, &(driver_info_2[i]), 0);
+       }
+
+       safe_free(list);
+
+       if (*needed > offered)
+               return ERROR_INSUFFICIENT_BUFFER;
+       else
+               return NT_STATUS_NO_PROBLEMO;
+}
+
+/****************************************************************************
+ Enumerates all printer drivers at level 3.
+****************************************************************************/
+static uint32 enumprinterdrivers_level3(fstring *list, fstring servername, fstring architecture, NEW_BUFFER *buffer, uint32 offered, uint32 *needed, uint32 *returned)
+{
+       int i;
+       NT_PRINTER_DRIVER_INFO_LEVEL driver;
+       DRIVER_INFO_3 *driver_info_3=NULL;
+       driver_info_3=(DRIVER_INFO_3 *)malloc((*returned)*sizeof(DRIVER_INFO_3));
+
+       for (i=0; i<*returned; i++) {
+               get_a_printer_driver(&driver, 3, list[i], architecture);
+               fill_printer_driver_info_3(&(driver_info_3[i]), driver, servername, architecture );
+               free_a_printer_driver(driver, 3);
+       }
        
-       switch (level)
+       /* check the required size. */
+       for (i=0; i<*returned; i++)
        {
-               case 1:
-               {
-                       DRIVER_INFO_1 *driver_info_1=NULL;
-                       driver_info_1=(DRIVER_INFO_1 *)malloc(count*sizeof(DRIVER_INFO_1));
+               DEBUGADD(6,("adding driver [%d]'s size\n",i));
+               *needed += spoolss_size_printer_driver_info_3(&(driver_info_3[i]));
+       }
 
-                       for (i=0; i<count; i++)
-                       {
-                               get_a_printer_driver(&driver, 3, list[i], architecture);
-                               fill_printer_driver_info_1(&(driver_info_1[i]), driver, servername, architecture );
-                               free_a_printer_driver(driver, 3);
-                       }
-                       ctr->driver.info1=driver_info_1;
-                       break;
-               }
-               case 2:
-               {
-                       DRIVER_INFO_2 *driver_info_2=NULL;
-                       driver_info_2=(DRIVER_INFO_2 *)malloc(count*sizeof(DRIVER_INFO_2));
-
-                       for (i=0; i<count; i++)
-                       {
-                               get_a_printer_driver(&driver, 3, list[i], architecture);
-                               fill_printer_driver_info_2(&(driver_info_2[i]), driver, servername, architecture );
-                               free_a_printer_driver(driver, 3);
-                       }
-                       ctr->driver.info2=driver_info_2;
-                       break;
-               }
-               case 3:
-               {
-                       DRIVER_INFO_3 *driver_info_3=NULL;
-                       driver_info_3=(DRIVER_INFO_3 *)malloc(count*sizeof(DRIVER_INFO_3));
-
-                       for (i=0; i<count; i++)
-                       {
-                               get_a_printer_driver(&driver, 3, list[i], architecture);
-                               fill_printer_driver_info_3(&(driver_info_3[i]), driver, servername, architecture );
-                               free_a_printer_driver(driver, 3);
-                       }
-                       ctr->driver.info3=driver_info_3;
-                       break;
-               }
-               default:
-               {
-                       return NT_STATUS_INVALID_INFO_CLASS;
-               }
+       if (!alloc_buffer_size(buffer, *needed))
+               return ERROR_INSUFFICIENT_BUFFER;
+
+       /* fill the buffer with the form structures */
+       for (i=0; i<*returned; i++)
+       {
+               DEBUGADD(6,("adding form [%d] to buffer\n",i));
+               new_smb_io_printer_driver_info_3("", buffer, &(driver_info_3[i]), 0);
        }
-       return 0x0;
 
+       safe_free(list);
+
+       if (*needed > offered)
+               return ERROR_INSUFFICIENT_BUFFER;
+       else
+               return NT_STATUS_NO_PROBLEMO;
+}
+
+/****************************************************************************
+ Enumerates all printer drivers.
+****************************************************************************/
+uint32 _spoolss_enumprinterdrivers( UNISTR2 *name, UNISTR2 *environment, uint32 level,
+                                   NEW_BUFFER *buffer, uint32 offered,
+                                   uint32 *needed, uint32 *returned)
+{
+       int i;
+       fstring *list;
+       fstring servername;
+       fstring architecture;
+
+       DEBUG(4,("_spoolss_enumprinterdrivers\n"));
+       fstrcpy(servername, global_myname);
+       *needed=0;
+       *returned=0;
+
+       unistr2_to_ascii(architecture, environment, sizeof(architecture)-1);
+       *returned=get_ntdrivers(&list, architecture);
+
+       DEBUGADD(4,("we have: [%d] drivers in environment [%s]\n", *returned, architecture));
+       for (i=0; i<*returned; i++)
+               DEBUGADD(5,("driver: [%s]\n", list[i]));
+       
+       switch (level) {
+       case 1:
+               return enumprinterdrivers_level1(list, servername, architecture, buffer, offered, needed, returned);
+               break;
+       case 2:
+               return enumprinterdrivers_level2(list, servername, architecture, buffer, offered, needed, returned);
+               break;
+       case 3:
+               return enumprinterdrivers_level3(list, servername, architecture, buffer, offered, needed, returned);
+               break;
+       default:
+               return NT_STATUS_INVALID_INFO_CLASS;
+               break;
+       }
 }
 
 /****************************************************************************
@@ -2801,26 +3078,6 @@ static void fill_form_1(FORM_1 *form, nt_forms_struct *list, int position)
        form->bottom=list->bottom;      
 }
        
-/****************************************************************************
-****************************************************************************/
-static BOOL alloc_buffer_size(NEW_BUFFER *buffer, uint32 buffer_size)
-{
-       prs_struct *ps;
-       uint32 extra_space;
-       
-       ps=&(buffer->prs);
-       
-       /* damn, I'm doing the reverse operation of prs_grow() :) */
-       extra_space = buffer_size - prs_data_size(ps);
-       
-       if (!prs_grow(ps, extra_space))
-               return False;
-
-       buffer->string_at_end=buffer_size;
-
-       return True;
-}
-
 /****************************************************************************
 ****************************************************************************/
 uint32 _new_spoolss_enumforms( const POLICY_HND *handle, uint32 level, 
@@ -2832,7 +3089,6 @@ uint32 _new_spoolss_enumforms( const POLICY_HND *handle, uint32 level,
        int buffer_size=0;
        int i;
 
-
        DEBUG(4,("_new_spoolss_enumforms\n"));
        DEBUGADD(5,("Offered buffer size [%d]\n", offered));
        DEBUGADD(5,("Info level [%d]\n",          level));
@@ -2886,43 +3142,9 @@ uint32 _new_spoolss_enumforms( const POLICY_HND *handle, uint32 level,
 
 /****************************************************************************
 ****************************************************************************/
-uint32 _spoolss_enumforms( const POLICY_HND *handle,
-                               uint32 level,
-                               FORM_1 **forms_1,
-                               uint32 *offered,
-                               uint32 *numofforms)
+static void fill_port_1(PORT_INFO_1 *port, char *name)
 {
-       int count;
-       int i;
-       nt_forms_struct *list=NULL;
-       (*forms_1)=NULL;
-
-       DEBUG(4,("spoolss_enumforms\n"));
-       
-       count = get_ntforms(&list);
-       (*numofforms) = count;
-
-       DEBUGADD(5,("Offered buffer size [%d]\n", *offered));
-       DEBUGADD(5,("Number of forms [%d]\n",     *numofforms));
-       DEBUGADD(5,("Info level [%d]\n",          level));
-               
-       switch (level)
-       {
-               case 1:
-               {
-                       (*forms_1)=(FORM_1 *)malloc(count*sizeof(FORM_1));
-                       for (i=0; i<count; i++)
-                       {
-                               DEBUGADD(6,("Filling form number [%d]\n",i));
-                               fill_form_1(&((*forms_1)[i]), &(list[i]), i);
-                       }
-                       safe_free(list);
-                       return 0x0;
-               }
-       }
-
-       safe_free(list);
-       return NT_STATUS_INVALID_INFO_CLASS;
+       init_unistr(&(port->port_name), name);
 }
 
 /****************************************************************************
@@ -2938,45 +3160,135 @@ static void fill_port_2(PORT_INFO_2 *port, char *name)
 }
 
 /****************************************************************************
+ enumports level 1.
 ****************************************************************************/
-uint32 _spoolss_enumports( const UNISTR2 *name,
-                               uint32 level,
-                               PORT_INFO_CTR *ctr,
-                               uint32 *offered,
-                               uint32 *numofports)
+static uint32 enumports_level_1(NEW_BUFFER *buffer, uint32 offered, uint32 *needed, uint32 *returned)
 {
        int n_services=lp_numservices();
        int snum;
+       int i=0;
+       
+       PORT_INFO_1 *ports=NULL;
 
-       DEBUG(4,("spoolss_enumports\n"));
+       for (snum=0; snum<n_services; snum++)
+               if ( lp_browseable(snum) && lp_snum_ok(snum) && lp_print_ok(snum) )
+                       (*returned)++;
+
+       ports=(PORT_INFO_1 *)malloc( (*returned+1) * sizeof(PORT_INFO_1) );
        
-       (*numofports) = 0;
+       for (snum=0; snum<n_services; snum++)
+       {
+               if ( lp_browseable(snum) && lp_snum_ok(snum) && lp_print_ok(snum) ) {
+                       DEBUGADD(6,("Filling port number [%d]\n", i));
+                       fill_port_1(&(ports[i]), lp_servicename(snum));
+                       i++;
+               }
+       }
 
-       switch (level)
+       /* check the required size. */
+       for (i=0; i<*returned; i++)
        {
-               case 2:
-               {
-                       PORT_INFO_2 *ports_2=NULL;
-                       ports_2=(PORT_INFO_2 *)malloc(n_services*sizeof(PORT_INFO_2));
-                       for (snum=0; snum<n_services; snum++)
-                       {
-                               if ( lp_browseable(snum) &&
-                                    lp_snum_ok(snum) && 
-                                    lp_print_ok(snum) )
-                               {
-                                       DEBUGADD(6,("Filling port no [%d]\n",
-                                                     (*numofports)));
-                                       fill_port_2(&(ports_2[(*numofports)]),
-                                                   lp_servicename(snum));
-                                       (*numofports)++;
-                               }
-                       }
-                       ctr->port.info_2=ports_2;
-                       return 0x0;
-               }
+               DEBUGADD(6,("adding port [%d]'s size\n", i));
+               *needed += spoolss_size_port_info_1(&(ports[i]));
+       }
+               
+       if (!alloc_buffer_size(buffer, *needed))
+               return ERROR_INSUFFICIENT_BUFFER;
+
+       /* fill the buffer with the ports structures */
+       for (i=0; i<*returned; i++)
+       {
+               DEBUGADD(6,("adding port [%d] to buffer\n", i));
+               new_smb_io_port_1("", buffer, &(ports[i]), 0);
+       }
+
+       safe_free(ports);
+
+       if (*needed > offered) {
+               *returned=0;
+               return ERROR_INSUFFICIENT_BUFFER;
+       }
+       else
+               return NT_STATUS_NO_PROBLEMO;
+}
+
+
+/****************************************************************************
+ enumports level 2.
+****************************************************************************/
+static uint32 enumports_level_2(NEW_BUFFER *buffer, uint32 offered, uint32 *needed, uint32 *returned)
+{
+       int n_services=lp_numservices();
+       int snum;
+       int i=0;
+       
+       PORT_INFO_2 *ports=NULL;
+
+       for (snum=0; snum<n_services; snum++)
+               if ( lp_browseable(snum) && lp_snum_ok(snum) && lp_print_ok(snum) )
+                       (*returned)++;
+
+       ports=(PORT_INFO_2 *)malloc( (*returned+1) * sizeof(PORT_INFO_2) );
+       
+       for (snum=0; snum<n_services; snum++)
+       {
+               if ( lp_browseable(snum) && lp_snum_ok(snum) && lp_print_ok(snum) ) {
+                       DEBUGADD(6,("Filling port number [%d]\n", i));
+                       fill_port_2(&(ports[i]), lp_servicename(snum));
+                       i++;
+               }
+       }
+
+       /* check the required size. */
+       for (i=0; i<*returned; i++)
+       {
+               DEBUGADD(6,("adding port [%d]'s size\n", i));
+               *needed += spoolss_size_port_info_2(&(ports[i]));
        }
+               
+       if (!alloc_buffer_size(buffer, *needed))
+               return ERROR_INSUFFICIENT_BUFFER;
+
+       /* fill the buffer with the ports structures */
+       for (i=0; i<*returned; i++)
+       {
+               DEBUGADD(6,("adding port [%d] to buffer\n", i));
+               new_smb_io_port_2("", buffer, &(ports[i]), 0);
+       }
+
+       safe_free(ports);
 
-       return NT_STATUS_INVALID_INFO_CLASS;
+       if (*needed > offered) {
+               *returned=0;
+               return ERROR_INSUFFICIENT_BUFFER;
+       }
+       else
+               return NT_STATUS_NO_PROBLEMO;
+}
+
+/****************************************************************************
+ enumports.
+****************************************************************************/
+uint32 _spoolss_enumports( UNISTR2 *name, uint32 level, 
+                          NEW_BUFFER *buffer, uint32 offered, 
+                          uint32 *needed, uint32 *returned)
+{
+       DEBUG(4,("spoolss_enumports\n"));
+       
+       *returned=0;
+       *needed=0;
+       
+       switch (level) {
+       case 1:
+               return enumports_level_1(buffer, offered, needed, returned);
+               break;
+       case 2:
+               return enumports_level_2(buffer, offered, needed, returned);
+               break;
+       default:
+               return NT_STATUS_INVALID_INFO_CLASS;
+               break;
+       }
 }
 
 /****************************************************************************
@@ -3293,13 +3605,39 @@ uint32 _spoolss_setform( const POLICY_HND *handle,
 }
 
 /****************************************************************************
+ enumprintprocessors level 1.
 ****************************************************************************/
-uint32 _spoolss_enumprintprocessors(const UNISTR2 *name,
-                               const UNISTR2 *environment,
-                               uint32 level,
-                               PRINTPROCESSOR_1 **info_1,
-                               uint32 *offered,
-                               uint32 *numofprintprocessors)
+static uint32 enumprintprocessors_level_1(NEW_BUFFER *buffer, uint32 offered, uint32 *needed, uint32 *returned)
+{
+       PRINTPROCESSOR_1 *info_1=NULL;
+       
+       info_1 = (PRINTPROCESSOR_1 *)malloc(sizeof(PRINTPROCESSOR_1));
+       (*returned) = 0x1;
+       
+       init_unistr(&(info_1->name), "winprint");
+
+       *needed += spoolss_size_printprocessor_info_1(info_1);
+
+       if (!alloc_buffer_size(buffer, *needed))
+               return ERROR_INSUFFICIENT_BUFFER;
+
+       smb_io_printprocessor_info_1("", buffer, info_1, 0);
+
+       safe_free(info_1);
+
+       if (*needed > offered) {
+               *returned=0;
+               return ERROR_INSUFFICIENT_BUFFER;
+       }
+       else
+               return NT_STATUS_NO_PROBLEMO;
+}
+
+/****************************************************************************
+****************************************************************************/
+uint32 _spoolss_enumprintprocessors(UNISTR2 *name, UNISTR2 *environment, uint32 level,
+                                   NEW_BUFFER *buffer, uint32 offered, 
+                                   uint32 *needed, uint32 *returned)
 {
        DEBUG(5,("spoolss_enumprintprocessors\n"));
 
@@ -3310,26 +3648,85 @@ uint32 _spoolss_enumprintprocessors(const UNISTR2 *name,
         * and I can use my nice printer checker.
         */
        
-       (*numofprintprocessors) = 0x1;
-       (*info_1) = (PRINTPROCESSOR_1 *)malloc(sizeof(PRINTPROCESSOR_1));
+       *returned=0;
+       *needed=0;
        
-       if ((*info_1) == NULL)
-       {
-               return NT_STATUS_NO_MEMORY;
+       switch (level) {
+       case 1:
+               return enumprintprocessors_level_1(buffer, offered, needed, returned);
+               break;
+       default:
+               return NT_STATUS_INVALID_INFO_CLASS;
+               break;
        }
 
-       init_unistr(&((*info_1)->name), "winprint");
+}
 
-       return 0x0;
+/****************************************************************************
+ enumprintmonitors level 1.
+****************************************************************************/
+static uint32 enumprintmonitors_level_1(NEW_BUFFER *buffer, uint32 offered, uint32 *needed, uint32 *returned)
+{
+       PRINTMONITOR_1 *info_1=NULL;
+       
+       info_1 = (PRINTMONITOR_1 *)malloc(sizeof(PRINTMONITOR_1));
+       (*returned) = 0x1;
+       
+       init_unistr(&(info_1->name), "Local Port");
+
+       *needed += spoolss_size_printmonitor_info_1(info_1);
+
+       if (!alloc_buffer_size(buffer, *needed))
+               return ERROR_INSUFFICIENT_BUFFER;
+
+       smb_io_printmonitor_info_1("", buffer, info_1, 0);
+
+       safe_free(info_1);
+
+       if (*needed > offered) {
+               *returned=0;
+               return ERROR_INSUFFICIENT_BUFFER;
+       }
+       else
+               return NT_STATUS_NO_PROBLEMO;
 }
 
 /****************************************************************************
+ enumprintmonitors level 2.
 ****************************************************************************/
-uint32 _spoolss_enumprintmonitors( const UNISTR2 *name,
-                               uint32 level,
-                               PRINTMONITOR_1 **info_1,
-                               uint32 *offered,
-                               uint32 *numofprintmonitors)
+static uint32 enumprintmonitors_level_2(NEW_BUFFER *buffer, uint32 offered, uint32 *needed, uint32 *returned)
+{
+       PRINTMONITOR_2 *info_2=NULL;
+       
+       info_2 = (PRINTMONITOR_2 *)malloc(sizeof(PRINTMONITOR_2));
+       (*returned) = 0x1;
+       
+       init_unistr(&(info_2->name), "Local Port");
+       init_unistr(&(info_2->environment), "Windows NT X86");
+       init_unistr(&(info_2->dll_name), "localmon.dll");
+
+       *needed += spoolss_size_printmonitor_info_2(info_2);
+
+       if (!alloc_buffer_size(buffer, *needed))
+               return ERROR_INSUFFICIENT_BUFFER;
+
+       smb_io_printmonitor_info_2("", buffer, info_2, 0);
+
+       safe_free(info_2);
+
+       if (*needed > offered) {
+               *returned=0;
+               return ERROR_INSUFFICIENT_BUFFER;
+       }
+       else
+               return NT_STATUS_NO_PROBLEMO;
+}
+
+/****************************************************************************
+****************************************************************************/
+uint32 _spoolss_enumprintmonitors(UNISTR2 *name,uint32 level,
+                                   NEW_BUFFER *buffer, uint32 offered, 
+                                   uint32 *needed, uint32 *returned)
 {
        DEBUG(5,("spoolss_enumprintmonitors\n"));
 
@@ -3340,16 +3737,20 @@ uint32 _spoolss_enumprintmonitors( const UNISTR2 *name,
         * and I can use my nice printer checker.
         */
        
-       (*numofprintmonitors) = 0x1;
-       (*info_1) = (PRINTMONITOR_1 *)malloc(sizeof(PRINTMONITOR_1));
-       if ((*info_1) == NULL)
-       {
-               return NT_STATUS_NO_MEMORY;
-       }
+       *returned=0;
+       *needed=0;
        
-       init_unistr(&((*info_1)->name), "Local Port");
-
-       return 0x0;
+       switch (level) {
+       case 1:
+               return enumprintmonitors_level_1(buffer, offered, needed, returned);
+               break;          
+       case 2:
+               return enumprintmonitors_level_2(buffer, offered, needed, returned);
+               break;
+       default:
+               return NT_STATUS_INVALID_INFO_CLASS;
+               break;
+       }
 }
 
 /****************************************************************************