security descs in spoolss. needs parse_sec.c nttrans.c broken.
authorLuke Leighton <lkcl@samba.org>
Sat, 27 May 2000 01:26:34 +0000 (01:26 +0000)
committerLuke Leighton <lkcl@samba.org>
Sat, 27 May 2000 01:26:34 +0000 (01:26 +0000)
(This used to be commit f9f2a04fdb7b2af1cfe5bf26ec6f0d955ea948b9)

source3/include/nt_printing.h
source3/include/proto.h
source3/include/rpc_secdes.h
source3/include/rpc_spoolss.h
source3/include/smb.h
source3/printing/nt_printing.c
source3/rpc_parse/parse_sec.c
source3/rpc_parse/parse_spoolss.c
source3/rpc_server/srv_spoolss_nt.c

index 9f89ed0568e54d826eafd5d6bdd971443ab58f37..8c63ba0da15ddf44962a4005a004c97d94611f6e 100644 (file)
@@ -244,7 +244,7 @@ typedef struct nt_printer_info_level_2
        fstring datatype;
        fstring parameters;
        NT_PRINTER_PARAM *specific;
-       /* SEC_DESC_BUF *secdesc; */
+       SEC_DESC_BUF secdesc;
        /* not used but ... and how ??? */
        uint32 changeid;
        uint32 c_setprinter;
index a8608c47b58bf3d54eafe3fa9a0ab165f3ff2b20..320e0f1c5faefcf0a84219d33d193d84c46cb77b 100644 (file)
@@ -194,10 +194,252 @@ void CatchChildLeaveStatus(void);
 
 int vslprintf(char *str, int n, char *format, va_list ap);
 
+/*The following definitions come from  libsmb/cliconnect.c  */
+
+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_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);
+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);
+BOOL attempt_netbios_session_request(struct cli_state *cli, char *srchost, char *desthost,
+                                     struct in_addr *pdest_ip);
+
+/*The following definitions come from  libsmb/clientgen.c  */
+
+int cli_set_port(struct cli_state *cli, int port);
+BOOL cli_receive_smb(struct cli_state *cli);
+BOOL cli_send_smb(struct cli_state *cli);
+void cli_setup_packet(struct cli_state *cli);
+struct cli_state *cli_initialise(struct cli_state *cli);
+void cli_shutdown(struct cli_state *cli);
+void cli_sockopt(struct cli_state *cli, char *options);
+uint16 cli_setpid(struct cli_state *cli, uint16 pid);
+
+/*The following definitions come from  libsmb/clierror.c  */
+
+char *cli_errstr(struct cli_state *cli);
+int cli_error(struct cli_state *cli, uint8 *eclass, uint32 *num, uint32 *nt_rpc_error);
+
+/*The following definitions come from  libsmb/clifile.c  */
+
+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);
+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_chkpath(struct cli_state *cli, char *path);
+BOOL cli_dskattr(struct cli_state *cli, int *bsize, int *total, int *avail);
+
+/*The following definitions come from  libsmb/clilist.c  */
+
+int cli_list(struct cli_state *cli,const char *Mask,uint16 attribute, 
+            void (*fn)(file_info *, const char *));
+int cli_list_old(struct cli_state *cli,const char *Mask,uint16 attribute, 
+                void (*fn)(file_info *, const char *));
+
+/*The following definitions come from  libsmb/climessage.c  */
+
+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);
+
+/*The following definitions come from  libsmb/cliprint.c  */
+
+int cli_print_queue(struct cli_state *cli, 
+                   void (*fn)(struct print_job_info *));
+int cli_printjob_del(struct cli_state *cli, int job);
+
+/*The following definitions come from  libsmb/clirap.c  */
+
+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);
+int 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_oem_change_password(struct cli_state *cli, const char *user, const char *new_password,
+                             const char *old_password);
+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);
+
+/*The following definitions come from  libsmb/clireadwrite.c  */
+
+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);
+
+/*The following definitions come from  libsmb/clitrans.c  */
+
+BOOL cli_send_trans(struct cli_state *cli, int trans, 
+                   char *name, int pipe_name_len, 
+                   int fid, int flags,
+                   uint16 *setup, int lsetup, int msetup,
+                   char *param, int lparam, int mparam,
+                   char *data, int ldata, int mdata);
+BOOL cli_receive_trans(struct cli_state *cli,int trans,
+                              char **param, int *param_len,
+                              char **data, int *data_len);
+
+/*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);
+char *dns_to_netbios_name(char *dns_name);
+int name_mangle( char *In, char *Out, char name_type );
+int name_extract(char *buf,int ofs,char *name);
+int name_len(char *s1);
+
+/*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);
+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  */
 
 
@@ -292,41 +534,60 @@ struct passwd *Get_Pwnam(char *user,BOOL allow_change);
 BOOL user_in_list(char *user,char *list);
 struct passwd *smb_getpwnam(char *user, BOOL allow_change);
 
+/*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);
-BOOL in_group(gid_t group, gid_t current_gid, int ngroups, gid_t *groups);
+BOOL in_group(gid_t group, gid_t current_gid, int ngroups, gid_t * groups);
 char *Atoic(char *p, int *n, char *c);
 char *get_numlist(char *p, uint32 **num, int *count);
-BOOL file_exist(char *fname,SMB_STRUCT_STAT *sbuf);
+BOOL file_exist(char *fname, SMB_STRUCT_STAT * sbuf);
 int file_rename(char *from, char *to);
 time_t file_modtime(char *fname);
-BOOL directory_exist(char *dname,SMB_STRUCT_STAT *st);
+BOOL directory_exist(char *dname, SMB_STRUCT_STAT * st);
 SMB_OFF_T get_file_size(char *file_name);
 char *attrib_string(uint16 mode);
 void show_msg(char *buf);
-void smb_setlen(char *buf,int len);
-int set_message(char *buf,int num_words,int num_bytes,BOOL zero);
+void smb_setlen(char *buf, int len);
+int set_message(char *buf, int num_words, int num_bytes, BOOL zero);
 void dos_clean_name(char *s);
 void unix_clean_name(char *s);
-BOOL reduce_name(char *s,char *dir,BOOL widelinks);
-void make_dir_struct(char *buf,char *mask,char *fname,SMB_OFF_T size,int mode,time_t date);
+BOOL reduce_name(char *s, char *dir, BOOL widelinks);
+void make_dir_struct(char *buf, char *mask, char *fname, SMB_OFF_T size,
+                    int mode, time_t date);
 void close_low_fds(void);
 int set_blocking(int fd, BOOL set);
-SMB_OFF_T transfer_file(int infd,int outfd,SMB_OFF_T n,char *header,int headlen,int align);
+SMB_OFF_T transfer_file(int infd, int outfd, SMB_OFF_T n, char *header,
+                       int headlen, int align);
 void msleep(int t);
 void become_daemon(void);
 BOOL yesno(char *p);
 int set_filelen(int fd, SMB_OFF_T len);
-void *Realloc(void *p,size_t size);
+void *Realloc(void *p, size_t size);
 void safe_free(void *p);
 BOOL get_myname(char *my_name);
-int interpret_protocol(char *str,int def);
+int interpret_protocol(char *str, int def);
 BOOL is_ipaddress(const char *str);
 uint32 interpret_addr(char *str);
 struct in_addr *interpret_addr2(char *str);
 BOOL zero_ip(struct in_addr ip);
-BOOL same_net(struct in_addr ip1,struct in_addr ip2,struct in_addr mask);
+BOOL same_net(struct in_addr ip1, struct in_addr ip2, struct in_addr mask);
 struct hostent *Get_Hostbyname(const char *name);
 BOOL process_exists(pid_t pid);
 char *uidtoname(uid_t uid);
@@ -334,48 +595,31 @@ char *gidtoname(gid_t gid);
 uid_t nametouid(const char *name);
 gid_t nametogid(const char *name);
 void smb_panic(char *why);
-char *readdirname(DIR *p);
-BOOL is_in_path(char *name, name_compare_entry *namelist);
-void set_namearray(name_compare_entry **ppname_array, char *namelist);
-void free_namearray(name_compare_entry *name_array);
+char *readdirname(DIR * p);
+BOOL is_in_path(char *name, name_compare_entry * namelist);
+void set_namearray(name_compare_entry ** ppname_array, char *namelist);
+void free_namearray(name_compare_entry * name_array);
 BOOL fcntl_lock(int fd, int op, SMB_OFF_T offset, SMB_OFF_T count, int type);
 BOOL is_myname(char *s);
 void set_remote_arch(enum remote_arch_types type);
 enum remote_arch_types get_remote_arch(void);
-void out_ascii(FILE *f, unsigned char *buf,int len);
-void out_data(FILE *f,char *buf1,int len, int per_line);
-void print_asc(int level, unsigned char *buf,int len);
-void dump_data(int level,char *buf1,int len);
+void out_ascii(FILE * f, unsigned char *buf, int len);
+void out_data(FILE * f, char *buf1, int len, int per_line);
+void print_asc(int level, unsigned char *buf, int len);
+void dump_data(int level, char *buf1, int len);
 char *tab_depth(int depth);
 int str_checksum(const char *s);
 void zero_free(void *p, size_t size);
 int set_maxfiles(int requested_max);
 BOOL reg_split_key(char *full_keyname, uint32 *reg_type, char *key_name);
 char *smbd_mktemp(char *template);
-void *memdup(void *p, size_t size);
-char *myhostname(void);
-char *lock_path(char *name);
-char *parent_dirname(const char *path);
-BOOL ms_has_wild(char *s);
-BOOL mask_match(char *string, char *pattern, BOOL is_case_sensitive);
-int _Insure_trap_error(int a1, int a2, int a3, int a4, int a5, int a6);
-
-/*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);
+void *memdup(void *p, size_t size);
+char *myhostname(void);
+char *lock_path(char *name);
+char *parent_dirname(const char *path);
+BOOL ms_has_wild(char *s);
+BOOL mask_match(char *string, char *pattern, BOOL is_case_sensitive);
+int _Insure_trap_error(int a1, int a2, int a3, int a4, int a5, int a6);
 
 /*The following definitions come from  lib/util_file.c  */
 
@@ -428,21 +672,24 @@ size_t sid_size(DOM_SID *sid);
 
 BOOL is_a_socket(int fd);
 void set_socket_options(int fd, char *options);
-ssize_t read_udp_socket(int fd,char *buf,size_t len);
-ssize_t read_with_timeout(int fd,char *buf,size_t mincnt,size_t maxcnt,unsigned int time_out);
+ssize_t read_udp_socket(int fd, char *buf, size_t len);
+ssize_t read_with_timeout(int fd, char *buf, size_t mincnt, size_t maxcnt,
+                         unsigned int time_out);
 BOOL send_keepalive(int client);
-ssize_t read_data(int fd,char *buffer,size_t N);
-ssize_t write_data(int fd,char *buffer,size_t N);
-ssize_t write_socket_data(int fd,char *buffer,size_t N);
-ssize_t write_socket(int fd,char *buf,size_t len);
-ssize_t read_smb_length(int fd,char *inbuf,unsigned int timeout);
-BOOL receive_smb(int fd,char *buffer, unsigned int timeout);
-BOOL client_receive_smb(int fd,char *buffer, unsigned int timeout);
+ssize_t read_data(int fd, char *buffer, size_t N);
+ssize_t write_data(int fd, char *buffer, size_t N);
+ssize_t write_socket_data(int fd, char *buffer, size_t N);
+ssize_t write_socket(int fd, char *buf, size_t len);
+ssize_t read_smb_length(int fd, char *inbuf, unsigned int timeout);
+BOOL receive_smb(int fd, char *buffer, unsigned int timeout);
+BOOL client_receive_smb(int fd, char *buffer, unsigned int timeout);
 BOOL send_null_session_msg(int fd);
-BOOL send_smb(int fd,char *buffer);
-BOOL send_one_packet(char *buf,int len,struct in_addr ip,int port,int type);
-int open_socket_in(int type, int port, int dlevel,uint32 socket_addr, BOOL rebind);
-int open_socket_out(int type, struct in_addr *addr, int port ,int timeout);
+BOOL send_smb(int fd, char *buffer);
+BOOL send_one_packet(char *buf, int len, struct in_addr ip, int port,
+                    int type);
+int open_socket_in(int type, int port, int dlevel, uint32 socket_addr,
+                  BOOL rebind);
+int open_socket_out(int type, struct in_addr *addr, int port, int timeout);
 void reset_globals_after_fork(void);
 void client_setfd(int fd);
 char *client_name(void);
@@ -450,8 +697,7 @@ char *client_addr(void);
 char *get_socket_name(int fd);
 char *get_socket_addr(int fd);
 int open_pipe_sock(char *path);
-int create_pipe_socket(char *dir, int dir_perms,
-                               char *path, int path_perms);
+int create_pipe_socket(char *dir, int dir_perms, char *path, int path_perms);
 
 /*The following definitions come from  lib/util_str.c  */
 
@@ -564,255 +810,13 @@ BOOL in_list_w(smb_ucs2_t *s,smb_ucs2_t *list,BOOL casesensitive);
 BOOL string_init_w(smb_ucs2_t **dest,const smb_ucs2_t *src);
 void string_free_w(smb_ucs2_t **s);
 BOOL string_set_w(smb_ucs2_t **dest,const smb_ucs2_t *src);
-void string_sub_w(smb_ucs2_t *s,const smb_ucs2_t *pattern,const smb_ucs2_t *insert, size_t len);
-void fstring_sub_w(smb_ucs2_t *s,const smb_ucs2_t *pattern,const smb_ucs2_t *insert);
-void pstring_sub_w(smb_ucs2_t *s,const smb_ucs2_t *pattern,smb_ucs2_t *insert);
-void all_string_sub_w(smb_ucs2_t *s,const smb_ucs2_t *pattern,const smb_ucs2_t *insert, size_t len);
-void split_at_last_component_w(smb_ucs2_t *path, smb_ucs2_t *front, smb_ucs2_t sep, smb_ucs2_t *back);
-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/cliconnect.c  */
-
-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_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);
-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);
-BOOL attempt_netbios_session_request(struct cli_state *cli, char *srchost, char *desthost,
-                                     struct in_addr *pdest_ip);
-
-/*The following definitions come from  libsmb/clientgen.c  */
-
-int cli_set_port(struct cli_state *cli, int port);
-BOOL cli_receive_smb(struct cli_state *cli);
-BOOL cli_send_smb(struct cli_state *cli);
-void cli_setup_packet(struct cli_state *cli);
-struct cli_state *cli_initialise(struct cli_state *cli);
-void cli_shutdown(struct cli_state *cli);
-void cli_sockopt(struct cli_state *cli, char *options);
-uint16 cli_setpid(struct cli_state *cli, uint16 pid);
-
-/*The following definitions come from  libsmb/clierror.c  */
-
-char *cli_errstr(struct cli_state *cli);
-int cli_error(struct cli_state *cli, uint8 *eclass, uint32 *num, uint32 *nt_rpc_error);
-
-/*The following definitions come from  libsmb/clifile.c  */
-
-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);
-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_chkpath(struct cli_state *cli, char *path);
-BOOL cli_dskattr(struct cli_state *cli, int *bsize, int *total, int *avail);
-
-/*The following definitions come from  libsmb/clilist.c  */
-
-int cli_list(struct cli_state *cli,const char *Mask,uint16 attribute, 
-            void (*fn)(file_info *, const char *));
-int cli_list_old(struct cli_state *cli,const char *Mask,uint16 attribute, 
-                void (*fn)(file_info *, const char *));
-
-/*The following definitions come from  libsmb/climessage.c  */
-
-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);
-
-/*The following definitions come from  libsmb/cliprint.c  */
-
-int cli_print_queue(struct cli_state *cli, 
-                   void (*fn)(struct print_job_info *));
-int cli_printjob_del(struct cli_state *cli, int job);
-
-/*The following definitions come from  libsmb/clirap.c  */
-
-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);
-int 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_oem_change_password(struct cli_state *cli, const char *user, const char *new_password,
-                             const char *old_password);
-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);
-
-/*The following definitions come from  libsmb/clireadwrite.c  */
-
-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);
-
-/*The following definitions come from  libsmb/clitrans.c  */
-
-BOOL cli_send_trans(struct cli_state *cli, int trans, 
-                   char *name, int pipe_name_len, 
-                   int fid, int flags,
-                   uint16 *setup, int lsetup, int msetup,
-                   char *param, int lparam, int mparam,
-                   char *data, int ldata, int mdata);
-BOOL cli_receive_trans(struct cli_state *cli,int trans,
-                              char **param, int *param_len,
-                              char **data, int *data_len);
-
-/*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);
-char *dns_to_netbios_name(char *dns_name);
-int name_mangle( char *In, char *Out, char name_type );
-int name_extract(char *buf,int ofs,char *name);
-int name_len(char *s1);
-
-/*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);
-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);
+void string_sub_w(smb_ucs2_t *s,const smb_ucs2_t *pattern,const smb_ucs2_t *insert, size_t len);
+void fstring_sub_w(smb_ucs2_t *s,const smb_ucs2_t *pattern,const smb_ucs2_t *insert);
+void pstring_sub_w(smb_ucs2_t *s,const smb_ucs2_t *pattern,smb_ucs2_t *insert);
+void all_string_sub_w(smb_ucs2_t *s,const smb_ucs2_t *pattern,const smb_ucs2_t *insert, size_t len);
+void split_at_last_component_w(smb_ucs2_t *path, smb_ucs2_t *front, smb_ucs2_t sep, smb_ucs2_t *back);
+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  locking/brlock.c  */
 
@@ -900,9 +904,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  */
-
-
 /*The following definitions come from  nmbd/nmbd_become_dmb.c  */
 
 void add_domain_names(time_t t);
@@ -933,6 +934,9 @@ 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  */
+
+
 /*The following definitions come from  nmbd/nmbd_elections.c  */
 
 void check_master_browser_exists(time_t t);
@@ -1630,11 +1634,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/printfsp.c  */
 
 #if OLD_NTDOMAIN
@@ -1665,6 +1664,11 @@ BOOL print_queue_pause(int snum);
 BOOL print_queue_resume(int snum);
 BOOL print_queue_purge(int snum);
 
+/*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);
@@ -1832,6 +1836,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,
@@ -2447,26 +2554,22 @@ BOOL samr_io_r_enum_domains(char *desc, SAMR_R_ENUM_DOMAINS * r_u,
 
 /*The following definitions come from  rpc_parse/parse_sec.c  */
 
-void init_sec_access(SEC_ACCESS *t, uint32 mask);
+BOOL make_sec_access(SEC_ACCESS * t, uint32 mask);
 BOOL sec_io_access(char *desc, SEC_ACCESS *t, prs_struct *ps, int depth);
-void init_sec_ace(SEC_ACE *t, DOM_SID *sid, uint8 type, SEC_ACCESS mask, uint8 flag);
-BOOL sec_io_ace(char *desc, SEC_ACE *psa, prs_struct *ps, int depth);
-SEC_ACL *make_sec_acl(uint16 revision, int num_aces, SEC_ACE *ace_list);
+BOOL make_sec_ace(SEC_ACE * t, const DOM_SID *sid, uint8 type,
+                 SEC_ACCESS mask, uint8 flag);
+BOOL make_sec_acl(SEC_ACL * t, uint16 revision, int num_aces, SEC_ACE * ace);
 SEC_ACL *dup_sec_acl( SEC_ACL *src);
-void free_sec_acl(SEC_ACL **ppsa);
-BOOL sec_io_acl(char *desc, SEC_ACL **ppsa, prs_struct *ps, int depth);
-SEC_DESC *make_sec_desc(uint16 revision, uint16 type,
-                       DOM_SID *owner_sid, DOM_SID *grp_sid,
-                       SEC_ACL *sacl, SEC_ACL *dacl, size_t *sec_desc_size);
-SEC_DESC *dup_sec_desc( SEC_DESC *src);
-void free_sec_desc(SEC_DESC **ppsd);
-SEC_DESC *make_standard_sec_desc(DOM_SID *owner_sid, DOM_SID *grp_sid,
-                                SEC_ACL *dacl, size_t *sec_desc_size);
-BOOL sec_io_desc(char *desc, SEC_DESC **ppsd, prs_struct *ps, int depth);
-SEC_DESC_BUF *make_sec_desc_buf(int len, SEC_DESC *sec_desc);
-SEC_DESC_BUF *dup_sec_desc_buf(SEC_DESC_BUF *src);
-void free_sec_desc_buf(SEC_DESC_BUF **ppsdb);
-BOOL sec_io_desc_buf(char *desc, SEC_DESC_BUF **ppsdb, prs_struct *ps, int depth);
+void free_sec_acl(SEC_ACL * t);
+int make_sec_desc(SEC_DESC * t, uint16 revision, uint16 type,
+                 DOM_SID *owner_sid, DOM_SID *grp_sid,
+                 SEC_ACL * sacl, SEC_ACL * dacl);
+void free_sec_desc(SEC_DESC * t);
+BOOL sec_io_desc(char *desc, SEC_DESC * t, prs_struct *ps, int depth);
+BOOL make_sec_desc_buf(SEC_DESC_BUF * buf, int len, SEC_DESC * data);
+void free_sec_desc_buf(SEC_DESC_BUF * buf);
+BOOL sec_io_desc_buf(char *desc, SEC_DESC_BUF * sec, prs_struct *ps,
+                    int depth);
 
 /*The following definitions come from  rpc_parse/parse_spoolss.c  */
 
@@ -2505,6 +2608,7 @@ BOOL spoolss_io_r_rfnpcnex(char *desc, SPOOL_R_RFNPCNEX *r_u, prs_struct *ps, in
 BOOL new_smb_io_printer_info_0(char *desc, NEW_BUFFER *buffer, PRINTER_INFO_0 *info, 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_info_3(char *desc, NEW_BUFFER *buffer, PRINTER_INFO_3 *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);
@@ -2525,6 +2629,7 @@ BOOL smb_io_printmonitor_info_2(char *desc, NEW_BUFFER *buffer, PRINTMONITOR_2 *
 uint32 spoolss_size_printer_info_0(PRINTER_INFO_0 *info);
 uint32 spoolss_size_printer_info_1(PRINTER_INFO_1 *info);
 uint32 spoolss_size_printer_info_2(PRINTER_INFO_2 *info);
+uint32 spoolss_size_printer_info_3(PRINTER_INFO_3 *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);
@@ -2578,6 +2683,7 @@ BOOL new_spoolss_io_r_enumforms(char *desc, SPOOL_R_ENUMFORMS *r_u, prs_struct *
 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_1(char *desc, SPOOL_PRINTER_INFO_LEVEL_1 *il, prs_struct *ps, int depth);
+BOOL spool_io_printer_info_level_3(char *desc, SPOOL_PRINTER_INFO_LEVEL_3 *il, prs_struct *ps, int depth);
 BOOL spool_io_printer_info_level_2(char *desc, SPOOL_PRINTER_INFO_LEVEL_2 *il, prs_struct *ps, int depth);
 BOOL spool_io_printer_info_level(char *desc, SPOOL_PRINTER_INFO_LEVEL *il, prs_struct *ps, int depth);
 BOOL spoolss_io_q_addprinterex(char *desc, SPOOL_Q_ADDPRINTEREX *q_u, prs_struct *ps, int depth);
@@ -2618,6 +2724,7 @@ BOOL spoolss_io_r_setform(char *desc, SPOOL_R_SETFORM *r_u, prs_struct *ps, int
 BOOL spoolss_io_r_getjob(char *desc, SPOOL_R_GETJOB *r_u, prs_struct *ps, int depth);
 BOOL spoolss_io_q_getjob(char *desc, SPOOL_Q_GETJOB *q_u, prs_struct *ps, int depth);
 void free_devmode(DEVICEMODE *devmode);
+void free_printer_info_3(PRINTER_INFO_3 *printer);
 void free_printer_info_2(PRINTER_INFO_2 *printer);
 void free_print2_array(uint32 num_entries, PRINTER_INFO_2 **entries);
 void free_print1_array(uint32 num_entries, PRINTER_INFO_1 **entries);
@@ -2932,109 +3039,6 @@ uint32 lookup_user_rid(char *user_name, uint32 *rid);
 BOOL api_wkssvc_rpc(pipes_struct *p, prs_struct *data);
 #endif
 
-/*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  */
 
 #if OLD_NTDOMAIN
@@ -3353,73 +3357,114 @@ void smbd_process(void);
 /*The following definitions come from  smbd/reply.c  */
 
 #if OLD_NTDOMAIN
-int reply_special(char *inbuf,char *outbuf);
-int reply_tcon(connection_struct *conn,
-              char *inbuf,char *outbuf, int dum_size, int dum_buffsize);
-int reply_tcon_and_X(connection_struct *conn, char *inbuf,char *outbuf,int length,int bufsize);
-int reply_unknown(char *inbuf,char *outbuf);
-int reply_ioctl(connection_struct *conn,
-               char *inbuf,char *outbuf, int dum_size, int dum_buffsize);
-int reply_sesssetup_and_X(connection_struct *conn, char *inbuf,char *outbuf,int length,int bufsize);
-int reply_chkpth(connection_struct *conn, char *inbuf,char *outbuf, int dum_size, int dum_buffsize);
-int reply_getatr(connection_struct *conn, char *inbuf,char *outbuf, int dum_size, int dum_buffsize);
-int reply_setatr(connection_struct *conn, char *inbuf,char *outbuf, int dum_size, int dum_buffsize);
-int reply_dskattr(connection_struct *conn, char *inbuf,char *outbuf, int dum_size, int dum_buffsize);
-int reply_search(connection_struct *conn, char *inbuf,char *outbuf, int dum_size, int dum_buffsize);
-int reply_fclose(connection_struct *conn, char *inbuf,char *outbuf, int dum_size, int dum_buffsize);
-int reply_open(connection_struct *conn, char *inbuf,char *outbuf, int dum_size, int dum_buffsize);
-int reply_open_and_X(connection_struct *conn, char *inbuf,char *outbuf,int length,int bufsize);
-int reply_ulogoffX(connection_struct *conn, char *inbuf,char *outbuf,int length,int bufsize);
-int reply_mknew(connection_struct *conn, char *inbuf,char *outbuf, int dum_size, int dum_buffsize);
-int reply_ctemp(connection_struct *conn, char *inbuf,char *outbuf, int dum_size, int dum_buffsize);
-int reply_unlink(connection_struct *conn, char *inbuf,char *outbuf, int dum_size, int dum_buffsize);
-int reply_readbraw(connection_struct *conn, char *inbuf, char *outbuf, int dum_size, int dum_buffsize);
-int reply_lockread(connection_struct *conn, char *inbuf,char *outbuf, int length, int dum_buffsiz);
-int reply_read(connection_struct *conn, char *inbuf,char *outbuf, int size, int dum_buffsize);
-int reply_read_and_X(connection_struct *conn, char *inbuf,char *outbuf,int length,int bufsize);
-int reply_writebraw(connection_struct *conn, char *inbuf,char *outbuf, int size, int dum_buffsize);
-int reply_writeunlock(connection_struct *conn, char *inbuf,char *outbuf, int size, int dum_buffsize);
-int reply_write(connection_struct *conn, char *inbuf,char *outbuf,int size,int dum_buffsize);
-int reply_write_and_X(connection_struct *conn, char *inbuf,char *outbuf,int length,int bufsize);
-int reply_lseek(connection_struct *conn, char *inbuf,char *outbuf, int size, int dum_buffsize);
-int reply_flush(connection_struct *conn, char *inbuf,char *outbuf, int size, int dum_buffsize);
-int reply_exit(connection_struct *conn, 
-              char *inbuf,char *outbuf, int dum_size, int dum_buffsize);
-int reply_close(connection_struct *conn, char *inbuf,char *outbuf, int size,
-                int dum_buffsize);
-int reply_writeclose(connection_struct *conn,
-                    char *inbuf,char *outbuf, int size, int dum_buffsize);
-int reply_lock(connection_struct *conn,
-              char *inbuf,char *outbuf, int length, int dum_buffsize);
-int reply_unlock(connection_struct *conn, char *inbuf,char *outbuf, int size, int dum_buffsize);
-int reply_tdis(connection_struct *conn, 
-              char *inbuf,char *outbuf, int dum_size, int dum_buffsize);
-int reply_echo(connection_struct *conn,
-              char *inbuf,char *outbuf, int dum_size, int dum_buffsize);
-int reply_printopen(connection_struct *conn, 
-                   char *inbuf,char *outbuf, int dum_size, int dum_buffsize);
-int reply_printclose(connection_struct *conn,
-                    char *inbuf,char *outbuf, int dum_size, int dum_buffsize);
-int reply_printqueue(connection_struct *conn,
-                    char *inbuf,char *outbuf, int dum_size, int dum_buffsize);
-int reply_printwrite(connection_struct *conn, char *inbuf,char *outbuf, int dum_size, int dum_buffsize);
-int reply_mkdir(connection_struct *conn, char *inbuf,char *outbuf, int dum_size, int dum_buffsize);
-BOOL rmdir_internals(connection_struct *conn, char *directory);
-int reply_rmdir(connection_struct *conn, char *inbuf,char *outbuf, int dum_size, int dum_buffsize);
-int rename_internals(connection_struct *conn, 
-                    char *inbuf, char *outbuf, char *name, 
+int reply_special(char *inbuf, char *outbuf);
+int reply_tcon(connection_struct * conn,
+              char *inbuf, char *outbuf, int dum_size, int dum_buffsize);
+int reply_tcon_and_X(connection_struct * conn, char *inbuf, char *outbuf,
+                    int length, int bufsize);
+int reply_unknown(char *inbuf, char *outbuf);
+int reply_ioctl(connection_struct * conn,
+               char *inbuf, char *outbuf, int dum_size, int dum_buffsize);
+int reply_sesssetup_and_X(connection_struct * conn, char *inbuf, char *outbuf,
+                         int length, int bufsize);
+int reply_chkpth(connection_struct * conn, char *inbuf, char *outbuf,
+                int dum_size, int dum_buffsize);
+int reply_getatr(connection_struct * conn, char *inbuf, char *outbuf,
+                int dum_size, int dum_buffsize);
+int reply_setatr(connection_struct * conn, char *inbuf, char *outbuf,
+                int dum_size, int dum_buffsize);
+int reply_dskattr(connection_struct * conn, char *inbuf, char *outbuf,
+                 int dum_size, int dum_buffsize);
+int reply_search(connection_struct * conn, char *inbuf, char *outbuf,
+                int dum_size, int dum_buffsize);
+int reply_fclose(connection_struct * conn, char *inbuf, char *outbuf,
+                int dum_size, int dum_buffsize);
+int reply_open(connection_struct * conn, char *inbuf, char *outbuf,
+              int dum_size, int dum_buffsize);
+int reply_open_and_X(connection_struct * conn, char *inbuf, char *outbuf,
+                    int length, int bufsize);
+int reply_ulogoffX(connection_struct * conn, char *inbuf, char *outbuf,
+                  int length, int bufsize);
+int reply_mknew(connection_struct * conn, char *inbuf, char *outbuf,
+               int dum_size, int dum_buffsize);
+int reply_ctemp(connection_struct * conn, char *inbuf, char *outbuf,
+               int dum_size, int dum_buffsize);
+int reply_unlink(connection_struct * conn, char *inbuf, char *outbuf,
+                int dum_size, int dum_buffsize);
+int reply_readbraw(connection_struct * conn, char *inbuf, char *outbuf,
+                  int dum_size, int dum_buffsize);
+int reply_lockread(connection_struct * conn, char *inbuf, char *outbuf,
+                  int length, int dum_buffsiz);
+int reply_read(connection_struct * conn, char *inbuf, char *outbuf, int size,
+              int dum_buffsize);
+int reply_read_and_X(connection_struct * conn, char *inbuf, char *outbuf,
+                    int length, int bufsize);
+int reply_writebraw(connection_struct * conn, char *inbuf, char *outbuf,
+                   int size, int dum_buffsize);
+int reply_writeunlock(connection_struct * conn, char *inbuf, char *outbuf,
+                     int size, int dum_buffsize);
+int reply_write(connection_struct * conn, char *inbuf, char *outbuf, int size,
+               int dum_buffsize);
+int reply_write_and_X(connection_struct * conn, char *inbuf, char *outbuf,
+                     int length, int bufsize);
+int reply_lseek(connection_struct * conn, char *inbuf, char *outbuf, int size,
+               int dum_buffsize);
+int reply_flush(connection_struct * conn, char *inbuf, char *outbuf, int size,
+               int dum_buffsize);
+int reply_exit(connection_struct * conn,
+              char *inbuf, char *outbuf, int dum_size, int dum_buffsize);
+int reply_close(connection_struct * conn, char *inbuf, char *outbuf, int size,
+               int dum_buffsize);
+int reply_writeclose(connection_struct * conn,
+                    char *inbuf, char *outbuf, int size, int dum_buffsize);
+int reply_lock(connection_struct * conn,
+              char *inbuf, char *outbuf, int length, int dum_buffsize);
+int reply_unlock(connection_struct * conn, char *inbuf, char *outbuf,
+                int size, int dum_buffsize);
+int reply_tdis(connection_struct * conn,
+              char *inbuf, char *outbuf, int dum_size, int dum_buffsize);
+int reply_echo(connection_struct * conn,
+              char *inbuf, char *outbuf, int dum_size, int dum_buffsize);
+int reply_printopen(connection_struct * conn,
+                   char *inbuf, char *outbuf, int dum_size, int dum_buffsize);
+int reply_printclose(connection_struct * conn,
+                    char *inbuf, char *outbuf, int dum_size,
+                    int dum_buffsize);
+int reply_printqueue(connection_struct * conn,
+                    char *inbuf, char *outbuf, int dum_size,
+                    int dum_buffsize);
+int reply_printwrite(connection_struct * conn, char *inbuf, char *outbuf,
+                    int dum_size, int dum_buffsize);
+int reply_mkdir(connection_struct * conn, char *inbuf, char *outbuf,
+               int dum_size, int dum_buffsize);
+BOOL rmdir_internals(connection_struct * conn, char *directory);
+int reply_rmdir(connection_struct * conn, char *inbuf, char *outbuf,
+               int dum_size, int dum_buffsize);
+int rename_internals(connection_struct * conn,
+                    char *inbuf, char *outbuf, char *name,
                     char *newname, BOOL replace_if_exists);
-int reply_mv(connection_struct *conn, char *inbuf,char *outbuf, int dum_size, int dum_buffsize);
-int reply_copy(connection_struct *conn, char *inbuf,char *outbuf, int dum_size, int dum_buffsize);
-int reply_setdir(connection_struct *conn, char *inbuf,char *outbuf, int dum_size, int dum_buffsize);
-SMB_BIG_UINT get_lock_count( char *data, int data_offset, BOOL large_file_format);
-SMB_BIG_UINT get_lock_offset( char *data, int data_offset, BOOL large_file_format, BOOL *err);
-int reply_lockingX(connection_struct *conn, char *inbuf,char *outbuf,int length,int bufsize);
-int reply_readbmpx(connection_struct *conn, char *inbuf,char *outbuf,int length,int bufsize);
-int reply_writebmpx(connection_struct *conn, char *inbuf,char *outbuf, int size, int dum_buffsize);
-int reply_writebs(connection_struct *conn, char *inbuf,char *outbuf, int dum_size, int dum_buffsize);
-int reply_setattrE(connection_struct *conn, char *inbuf,char *outbuf, int size, int dum_buffsize);
-int reply_getattrE(connection_struct *conn, char *inbuf,char *outbuf, int size, int dum_buffsize);
+int reply_mv(connection_struct * conn, char *inbuf, char *outbuf,
+            int dum_size, int dum_buffsize);
+int reply_copy(connection_struct * conn, char *inbuf, char *outbuf,
+              int dum_size, int dum_buffsize);
+int reply_setdir(connection_struct * conn, char *inbuf, char *outbuf,
+                int dum_size, int dum_buffsize);
+SMB_BIG_UINT get_lock_count(char *data, int data_offset,
+                           BOOL large_file_format);
+SMB_BIG_UINT get_lock_offset(char *data, int data_offset,
+                            BOOL large_file_format, BOOL *err);
+int reply_lockingX(connection_struct * conn, char *inbuf, char *outbuf,
+                  int length, int bufsize);
+int reply_readbmpx(connection_struct * conn, char *inbuf, char *outbuf,
+                  int length, int bufsize);
+int reply_writebmpx(connection_struct * conn, char *inbuf, char *outbuf,
+                   int size, int dum_buffsize);
+int reply_writebs(connection_struct * conn, char *inbuf, char *outbuf,
+                 int dum_size, int dum_buffsize);
+int reply_setattrE(connection_struct * conn, char *inbuf, char *outbuf,
+                  int size, int dum_buffsize);
+int reply_getattrE(connection_struct * conn, char *inbuf, char *outbuf,
+                  int size, int dum_buffsize);
 #endif
 
 /*The following definitions come from  smbd/server.c  */
@@ -3483,6 +3528,19 @@ void become_root(BOOL save_dir) ;
 void unbecome_root(BOOL restore_dir);
 #endif
 
+/*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,
@@ -3512,19 +3570,6 @@ int vfswrap_utime(char *path, struct utimbuf *times);
 int vfswrap_ftruncate(int fd, SMB_OFF_T offset);
 BOOL vfswrap_lock(int fd, int op, SMB_OFF_T offset, SMB_OFF_T count, int type);
 
-/*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 05fca9990368c4ed8ee94e481fdac551ec4b4af3..9d5462275882db073304826fa5af73d66a59e72c 100644 (file)
@@ -2,9 +2,8 @@
    Unix SMB/Netbios implementation.
    Version 1.9.
    SMB parameters and setup
-   Copyright (C) Andrew Tridgell 1992-1997
-   Copyright (C) Luke Kenneth Casson Leighton 1996-1997
-   Copyright (C) Paul Ashton 1997
+   Copyright (C) Andrew Tridgell              1992-2000
+   Copyright (C) Luke Kenneth Casson Leighton 1996-2000
    
    This program is free software; you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
@@ -114,6 +113,7 @@ typedef struct security_acl_info
 
 } SEC_ACL;
 
+
 /* SEC_DESC */
 typedef struct security_descriptor_info
 {
index 504bc11ff05aaa1a7f3d36b2c4e69c1e46981bf5..67005b9d1b3a70d315e3c4751721f7b10ac96799 100755 (executable)
 #define PRINTER_ACCESS_USE             0x00000008
 #define JOB_ACCESS_ADMINISTER          0x00000010
 
+#define PRINTER_MANAGE_DOCUMENTS       0x10000000 /* i think dis right ... */
+
 #define STANDARD_RIGHTS_READ           0x00020000
 #define STANDARD_RIGHTS_WRITE          STANDARD_RIGHTS_READ
 #define STANDARD_RIGHTS_EXECUTE                STANDARD_RIGHTS_READ
@@ -779,7 +781,7 @@ typedef struct printer_info_2
        UNISTR printprocessor;
        UNISTR datatype;
        UNISTR parameters;
-       /*SECURITY_DESCRIPTOR securitydescriptor; */
+       SEC_DESC *secdesc;
        uint32 attributes;
        uint32 priority;
        uint32 defaultpriority;
@@ -791,6 +793,13 @@ typedef struct printer_info_2
 }
 PRINTER_INFO_2;
 
+typedef struct printer_info_3
+{
+       uint32 flags;
+       SEC_DESC sec;
+}
+PRINTER_INFO_3;
+
 typedef struct spool_q_enumprinters
 {
        uint32 flags;
@@ -807,6 +816,7 @@ typedef struct printer_info_ctr_info
        PRINTER_INFO_0 *printers_0;
        PRINTER_INFO_1 *printers_1;
        PRINTER_INFO_2 *printers_2;
+       PRINTER_INFO_3 *printers_3;
 }
 PRINTER_INFO_CTR;
 
@@ -1237,12 +1247,19 @@ typedef struct spool_printer_info_level_2
 }
 SPOOL_PRINTER_INFO_LEVEL_2;
 
+typedef struct spool_printer_info_level_3
+{
+       uint32 secdesc_ptr;
+}
+SPOOL_PRINTER_INFO_LEVEL_3;
+
 typedef struct spool_printer_info_level
 {
        uint32 level;
        uint32 info_ptr;
        SPOOL_PRINTER_INFO_LEVEL_1 *info_1;
        SPOOL_PRINTER_INFO_LEVEL_2 *info_2;
+       SPOOL_PRINTER_INFO_LEVEL_3 *info_3;
 }
 SPOOL_PRINTER_INFO_LEVEL;
 
@@ -1350,16 +1367,9 @@ typedef struct spool_q_setprinter
        POLICY_HND handle;
        uint32 level;
        SPOOL_PRINTER_INFO_LEVEL info;
+       SEC_DESC_BUF secdesc_ctr;
        DEVMODE_CTR devmode_ctr;
 
-       /* lkclXXXX jean-francois, see SEC_DESC_BUF code */
-       struct
-       {
-               uint32 size_of_buffer;
-               uint32 data;
-       }
-       security;
-
        uint32 command;
 
 }
index e6fee32b80a4f11a47358d7194c68f6d6527ef51..993d7626efce0da01d291f30b81ae0a7d1479f74 100644 (file)
@@ -1683,8 +1683,9 @@ struct ntdom_info
        int max_xmit_frag;
 };
 
-#include "nt_printing.h"
 #include "rpc_creds.h"
+#include "rpc_secdes.h"
+#include "nt_printing.h"
 #include "ntdomain.h"
 
 #include "client.h"
index f0f151aea503679c74f7069f9e14da4ba0902df3..5742b8cbec294c29815dd35e04220b5cdb50ba80 100644 (file)
@@ -41,9 +41,8 @@ int nt_printing_init(void)
 
        if (tdb && local_pid == sys_getpid()) return True;
        tdb = tdb_open(lock_path("ntdrivers.tdb"), 0, 0, O_RDWR|O_CREAT, 0600);
-       if (!tdb) {
                DEBUG(0,("Failed to open nt drivers database\n"));
-       }
+
        local_pid = sys_getpid();
 
        /* handle a Samba upgrade */
@@ -757,6 +756,7 @@ static void free_nt_printer_info_level_2(NT_PRINTER_INFO_LEVEL_2 **info_ptr)
        DEBUG(106,("free_nt_printer_info_level_2: deleting info\n"));
 
        free_nt_devicemode(&info->devmode);
+       free_sec_desc_buf(&info->secdesc);
 
        for(param_ptr = info->specific; param_ptr; ) {
                NT_PRINTER_PARAM *tofree = param_ptr;
index 5d4b56d745e6d9a1680efe98e24171d47d4df0d5..57fd04e05db3bf820a8da5da7afadf2ded4f9eea 100644 (file)
@@ -2,10 +2,10 @@
  *  Unix SMB/Netbios implementation.
  *  Version 1.9.
  *  RPC Pipe client / server routines
- *  Copyright (C) Andrew Tridgell              1992-1998,
- *  Copyright (C) Jeremy R. Allison            1995-1998
- *  Copyright (C) Luke Kenneth Casson Leighton 1996-1998,
- *  Copyright (C) Paul Ashton                  1997-1998.
+ *  Copyright (C) Andrew Tridgell              1992-1999,
+ *  Copyright (C) Jeremy R. Allison            1995-1999
+ *  Copyright (C) Luke Kenneth Casson Leighton 1996-1999,
+ *  Copyright (C) Paul Ashton                  1997-1999.
  *  
  *  This program is free software; you can redistribute it and/or modify
  *  it under the terms of the GNU General Public License as published by
 
 
 #include "includes.h"
+#include "rpc_parse.h"
 
 extern int DEBUGLEVEL;
 
-#define SD_HEADER_SIZE 0x14
 
 /*******************************************************************
  Sets up a SEC_ACCESS structure.
 ********************************************************************/
 
-void init_sec_access(SEC_ACCESS *t, uint32 mask)
+BOOL make_sec_access(SEC_ACCESS * t, uint32 mask)
 {
+       ZERO_STRUCTP(t);
        t->mask = mask;
+       return True;
 }
 
 /*******************************************************************
@@ -50,11 +52,9 @@ BOOL sec_io_access(char *desc, SEC_ACCESS *t, prs_struct *ps, int depth)
        prs_debug(ps, depth, desc, "sec_io_access");
        depth++;
 
-       if(!prs_align(ps))
-               return False;
-       
-       if(!prs_uint32("mask", ps, depth, &(t->mask)))
-               return False;
+       prs_align(ps);
+
+       prs_uint32("mask", ps, depth, &(t->mask));
 
        return True;
 }
@@ -64,555 +64,540 @@ BOOL sec_io_access(char *desc, SEC_ACCESS *t, prs_struct *ps, int depth)
  Sets up a SEC_ACE structure.
 ********************************************************************/
 
-void init_sec_ace(SEC_ACE *t, DOM_SID *sid, uint8 type, SEC_ACCESS mask, uint8 flag)
+static size_t sec_ace_get_size(const SEC_ACE *ace)
+{
+       if (ace == NULL)
+               return 0;
+       return sid_size(&ace->sid) + 8;
+}
+
+BOOL make_sec_ace(SEC_ACE * t, const DOM_SID *sid, uint8 type,
+                 SEC_ACCESS mask, uint8 flag)
 {
+       ZERO_STRUCTP(t);
+
        t->type = type;
        t->flags = flag;
-       t->size = sid_size(sid) + 8;
        t->info = mask;
-
-       ZERO_STRUCTP(&t->sid);
        sid_copy(&t->sid, sid);
+
+       t->size = sec_ace_get_size(t);
+
+       return True;
 }
 
 /*******************************************************************
  Reads or writes a SEC_ACE structure.
 ********************************************************************/
 
-BOOL sec_io_ace(char *desc, SEC_ACE *psa, prs_struct *ps, int depth)
+static BOOL sec_io_ace(char *desc, SEC_ACE * t, prs_struct *ps, int depth)
 {
        uint32 old_offset;
        uint32 offset_ace_size;
-
-       if (psa == NULL)
+       if (t == NULL)
                return False;
 
        prs_debug(ps, depth, desc, "sec_io_ace");
        depth++;
 
-       if(!prs_align(ps))
-               return False;
-       
-       old_offset = prs_offset(ps);
-
-       if(!prs_uint8("type ", ps, depth, &psa->type))
-               return False;
-
-       if(!prs_uint8("flags", ps, depth, &psa->flags))
-               return False;
-
-       if(!prs_uint16_pre("size ", ps, depth, &psa->size, &offset_ace_size))
-               return False;
+       prs_align(ps);
 
-       if(!sec_io_access("info ", &psa->info, ps, depth))
-               return False;
+       old_offset = prs_offset(ps);
 
-       if(!prs_align(ps))
-               return False;
+       prs_uint8("type ", ps, depth, &(t->type));
+       prs_uint8("flags", ps, depth, &(t->flags));
+       prs_uint16_pre("size ", ps, depth, &(t->size), &offset_ace_size);
 
-       if(!smb_io_dom_sid("sid  ", &psa->sid , ps, depth))
-               return False;
+       sec_io_access("info ", &t->info, ps, depth);
+       prs_align(ps);
+       smb_io_dom_sid("sid  ", &t->sid, ps, depth);
+       prs_align(ps);
 
-       if(!prs_uint16_post("size ", ps, depth, &psa->size, offset_ace_size, old_offset))
-               return False;
+       prs_uint16_post("size ", ps, depth, &t->size, offset_ace_size,
+                       old_offset);
 
        return True;
 }
 
 /*******************************************************************
- Create a SEC_ACL structure.  
+ Create a SEC_ACL structure.
 ********************************************************************/
-
-SEC_ACL *make_sec_acl(uint16 revision, int num_aces, SEC_ACE *ace_list)
+BOOL make_sec_acl(SEC_ACL * t, uint16 revision, int num_aces, SEC_ACE * ace)
 {
-       SEC_ACL *dst;
        int i;
 
-       if((dst = (SEC_ACL *)malloc(sizeof(SEC_ACL))) == NULL)
-               return NULL;
+       ZERO_STRUCTP(t);
 
-       ZERO_STRUCTP(dst);
+       t->revision = revision;
+       t->num_aces = num_aces;
+       t->size = 8;
+       t->ace = ace;
 
-       dst->revision = revision;
-       dst->num_aces = num_aces;
-       dst->size = 8;
-
-       if((dst->ace = (SEC_ACE *)malloc( sizeof(SEC_ACE) * num_aces )) == NULL) {
-               free_sec_acl(&dst);
-               return NULL;
+       for (i = 0; i < num_aces; i++)
+       {
+               t->size += sec_ace_get_size(&ace[i]);
        }
 
-       for (i = 0; i < num_aces; i++) {
-               dst->ace[i] = ace_list[i]; /* Structure copy. */
-               dst->size += ace_list[i].size;
-       }
-
-       return dst;
+       return True;
 }
 
 /*******************************************************************
- Duplicate a SEC_ACL structure.  
+ Duplicate a SEC_ACL structure.
 ********************************************************************/
-
 SEC_ACL *dup_sec_acl( SEC_ACL *src)
 {
        if(src == NULL)
                return NULL;
 
-       return make_sec_acl( src->revision, src->num_aces, src->ace);
+       return NULL;
 }
 
 /*******************************************************************
- Delete a SEC_ACL structure.  
+frees a structure.  
 ********************************************************************/
-
-void free_sec_acl(SEC_ACL **ppsa)
+void free_sec_acl(SEC_ACL * t)
 {
-       SEC_ACL *psa;
-
-       if(ppsa == NULL || *ppsa == NULL)
+       if (t == NULL)
                return;
-
-       psa = *ppsa;
-       if (psa->ace != NULL)
-               free(psa->ace);
-
-       free(psa);
-       *ppsa = NULL;
+       if (t->ace != NULL)
+       {
+               free(t->ace);
+               t->ace = NULL;
+       }
+       t->num_aces = 0;
 }
 
 /*******************************************************************
- Reads or writes a SEC_ACL structure.  
+ Reads or writes a structure.  
 
  First of the xx_io_xx functions that allocates its data structures
  for you as it reads them.
 ********************************************************************/
 
-BOOL sec_io_acl(char *desc, SEC_ACL **ppsa, prs_struct *ps, int depth)
+static BOOL sec_io_acl(char *desc, SEC_ACL * t, prs_struct *ps, int depth)
 {
-       int i;
+       uint32 i;
        uint32 old_offset;
        uint32 offset_acl_size;
-       SEC_ACL *psa;
 
-       if (ppsa == NULL)
+       if (t == NULL)
                return False;
 
-       psa = *ppsa;
-
-       if(UNMARSHALLING(ps) && psa == NULL) {
-               /*
-                * This is a read and we must allocate the stuct to read into.
-                */
-               if((psa = (SEC_ACL *)malloc(sizeof(SEC_ACL))) == NULL)
-                       return False;
-               ZERO_STRUCTP(psa);
-               *ppsa = psa;
-       }
-
        prs_debug(ps, depth, desc, "sec_io_acl");
        depth++;
 
-       if(!prs_align(ps))
-               return False;
-       
+       prs_align(ps);
+
        old_offset = prs_offset(ps);
 
-       if(!prs_uint16("revision", ps, depth, &psa->revision))
-               return False;
+       prs_uint16("revision", ps, depth, &(t->revision));
+       prs_uint16_pre("size     ", ps, depth, &(t->size), &offset_acl_size);
+       prs_uint32("num_aces ", ps, depth, &(t->num_aces));
 
-       if(!prs_uint16_pre("size     ", ps, depth, &psa->size, &offset_acl_size))
-               return False;
+       if (ps->io && t->num_aces != 0)
+       {
+               /* reading */
+               t->ace = (SEC_ACE *) malloc(sizeof(t->ace[0]) * t->num_aces);
+               ZERO_STRUCTP(t->ace);
+       }
 
-       if(!prs_uint32("num_aces ", ps, depth, &psa->num_aces))
+       if (t->ace == NULL && t->num_aces != 0)
+       {
+               DEBUG(0, ("INVALID ACL\n"));
+               prs_set_offset(ps, 0xfffffffe);
                return False;
-
-       if (UNMARSHALLING(ps) && psa->num_aces != 0) {
-               /* reading */
-               if((psa->ace = malloc(sizeof(psa->ace[0]) * psa->num_aces)) == NULL)
-                       return False;
-               ZERO_STRUCTP(psa->ace);
        }
 
-       for (i = 0; i < psa->num_aces; i++) {
+       for (i = 0; i < MIN(t->num_aces, MAX_SEC_ACES); i++)
+       {
                fstring tmp;
-               slprintf(tmp, sizeof(tmp)-1, "ace_list[%02d]: ", i);
-               if(!sec_io_ace(tmp, &psa->ace[i], ps, depth))
+               slprintf(tmp, sizeof(tmp) - 1, "ace[%02d]: ", i);
+               if(!sec_io_ace(tmp, &t->ace[i], ps, depth))
                        return False;
        }
 
-       if(!prs_align(ps))
-               return False;
+       prs_align(ps);
 
-       if(!prs_uint16_post("size     ", ps, depth, &psa->size, offset_acl_size, old_offset))
-               return False;
+       prs_uint16_post("size     ", ps, depth, &t->size, offset_acl_size,
+                       old_offset);
 
        return True;
 }
 
+
 /*******************************************************************
  Creates a SEC_DESC structure
 ********************************************************************/
-
-SEC_DESC *make_sec_desc(uint16 revision, uint16 type,
-                       DOM_SID *owner_sid, DOM_SID *grp_sid,
-                       SEC_ACL *sacl, SEC_ACL *dacl, size_t *sec_desc_size)
+int make_sec_desc(SEC_DESC * t, uint16 revision, uint16 type,
+                 DOM_SID *owner_sid, DOM_SID *grp_sid,
+                 SEC_ACL * sacl, SEC_ACL * dacl)
 {
-       SEC_DESC *dst;
        uint32 offset;
 
-       *sec_desc_size = 0;
-
-       if(( dst = (SEC_DESC *)malloc(sizeof(SEC_DESC))) == NULL)
-               return NULL;
+       ZERO_STRUCTP(t);
 
-       ZERO_STRUCTP(dst);
-
-       dst->revision = revision;
-       dst->type     = type;
-
-       dst->off_owner_sid = 0;
-       dst->off_grp_sid   = 0;
-       dst->off_sacl      = 0;
-       dst->off_dacl      = 0;
-
-       if(owner_sid && ((dst->owner_sid = sid_dup(owner_sid)) == NULL))
-               goto error_exit;
+       t->revision = revision;
+       t->type = type;
 
-       if(grp_sid && ((dst->grp_sid = sid_dup(grp_sid)) == NULL))
-               goto error_exit;
+       t->off_owner_sid = 0;
+       t->off_grp_sid = 0;
+       t->off_sacl = 0;
+       t->off_dacl = 0;
 
-       if(sacl && ((dst->sacl = dup_sec_acl(sacl)) == NULL))
-               goto error_exit;
+       t->dacl = dacl;
+       t->sacl = sacl;
+       t->owner_sid = owner_sid;
+       t->grp_sid = grp_sid;
 
-       if(dacl && ((dst->dacl = dup_sec_acl(dacl)) == NULL))
-               goto error_exit;
-               
        offset = 0x0;
 
-       /*
-        * Work out the linearization sizes.
-        */
-
-       if (dst->owner_sid != NULL) {
-
+       if (dacl != NULL)
+       {
                if (offset == 0)
-                       offset = SD_HEADER_SIZE;
-
-               dst->off_owner_sid = offset;
-               offset += ((sid_size(dst->owner_sid) + 3) & ~3);
+               {
+                       offset = 0x14;
+               }
+               t->off_dacl = offset;
+               offset += dacl->size;
+               offset = ((offset + 3) & ~3);
        }
 
-       if (dst->grp_sid != NULL) {
-
+       if (sacl != NULL)
+       {
                if (offset == 0)
-                       offset = SD_HEADER_SIZE;
-
-               dst->off_grp_sid = offset;
-               offset += ((sid_size(dst->grp_sid) + 3) & ~3);
+               {
+                       offset = 0x14;
+               }
+               t->off_sacl = offset;
+               offset += sacl->size;
+               offset = ((offset + 3) & ~3);
        }
 
-       if (dst->sacl != NULL) {
-
+       if (owner_sid != NULL)
+       {
                if (offset == 0)
-                       offset = SD_HEADER_SIZE;
-
-               dst->off_sacl = offset;
-               offset += ((sacl->size + 3) & ~3);
+               {
+                       offset = 0x14;
+               }
+               t->off_owner_sid = offset;
+               offset += sid_size(owner_sid);
+               offset = ((offset + 3) & ~3);
        }
 
-       if (dst->dacl != NULL) {
-
+       if (grp_sid != NULL)
+       {
                if (offset == 0)
-                       offset = SD_HEADER_SIZE;
-
-               dst->off_dacl = offset;
-               offset += ((dacl->size + 3) & ~3);
+               {
+                       offset = 0x14;
+               }
+               t->off_grp_sid = offset;
+               offset += sid_size(grp_sid);
        }
 
-       *sec_desc_size = (size_t)((offset == 0) ? SD_HEADER_SIZE : offset);
-       return dst;
-
-error_exit:
-
-       *sec_desc_size = 0;
-       free_sec_desc(&dst);
-       return NULL;
+       return (offset == 0) ? 0x14 : offset;
 }
 
-/*******************************************************************
- Duplicate a SEC_DESC structure.  
-********************************************************************/
-
-SEC_DESC *dup_sec_desc( SEC_DESC *src)
-{
-       size_t dummy;
-
-       if(src == NULL)
-               return NULL;
-
-       return make_sec_desc( src->revision, src->type, 
-                               src->owner_sid, src->grp_sid, src->sacl,
-                               src->dacl, &dummy);
-}
 
 /*******************************************************************
- Deletes a SEC_DESC structure
+frees a structure
 ********************************************************************/
-
-void free_sec_desc(SEC_DESC **ppsd)
+void free_sec_desc(SEC_DESC * t)
 {
-       SEC_DESC *psd;
-
-       if(ppsd == NULL || *ppsd == NULL)
-               return;
+       if (t->dacl != NULL)
+       {
+               free_sec_acl(t->dacl);
+       }
 
-       psd = *ppsd;
+       if (t->sacl != NULL)
+       {
+               free_sec_acl(t->dacl);
 
-       free_sec_acl(&psd->dacl);
-       free_sec_acl(&psd->dacl);
-       free(psd->owner_sid);
-       free(psd->grp_sid);
-       free(psd);
-       *ppsd = NULL;
-}
+       }
 
-/*******************************************************************
- Creates a SEC_DESC structure with typical defaults.
-********************************************************************/
+       if (t->owner_sid != NULL)
+       {
+               free(t->owner_sid);
+               t->owner_sid = NULL;
+       }
 
-SEC_DESC *make_standard_sec_desc(DOM_SID *owner_sid, DOM_SID *grp_sid,
-                                SEC_ACL *dacl, size_t *sec_desc_size)
-{
-       return make_sec_desc(1, SEC_DESC_SELF_RELATIVE|SEC_DESC_DACL_PRESENT,
-                            owner_sid, grp_sid, NULL, dacl, sec_desc_size);
+       if (t->grp_sid != NULL)
+       {
+               free(t->grp_sid);
+               t->grp_sid = NULL;
+       }
 }
 
 
 /*******************************************************************
- Reads or writes a SEC_DESC structure.
- If reading and the *ppsd = NULL, allocates the structure.
+reads or writes a structure.
 ********************************************************************/
-
-BOOL sec_io_desc(char *desc, SEC_DESC **ppsd, prs_struct *ps, int depth)
+BOOL sec_io_desc(char *desc, SEC_DESC * t, prs_struct *ps, int depth)
 {
+#if 0
+       uint32 off_owner_sid;
+       uint32 off_grp_sid;
+       uint32 off_sacl;
+       uint32 off_dacl;
+#endif
        uint32 old_offset;
-       uint32 max_offset = 0; /* after we're done, move offset to end */
-       SEC_DESC *psd;
+       uint32 max_offset = 0;  /* after we're done, move offset to end */
 
-       if (ppsd == NULL)
+       if (t == NULL)
                return False;
 
-       psd = *ppsd;
-
-       if(UNMARSHALLING(ps) && psd == NULL) {
-               if((psd = (SEC_DESC *)malloc(sizeof(SEC_DESC))) == NULL)
-                       return False;
-               ZERO_STRUCTP(psd);
-               *ppsd = psd;
-       }
-
        prs_debug(ps, depth, desc, "sec_io_desc");
        depth++;
 
-       if(!prs_align(ps))
-               return False;
-       
+       prs_align(ps);
+
        /* start of security descriptor stored for back-calc offset purposes */
        old_offset = prs_offset(ps);
-
-       if(!prs_uint16("revision ", ps, depth, &psd->revision))
-               return False;
-
-       if(!prs_uint16("type     ", ps, depth, &psd->type))
-               return False;
-
-       if(!prs_uint32("off_owner_sid", ps, depth, &psd->off_owner_sid))
-               return False;
-
-       if(!prs_uint32("off_grp_sid  ", ps, depth, &psd->off_grp_sid))
-               return False;
-
-       if(!prs_uint32("off_sacl     ", ps, depth, &psd->off_sacl))
-               return False;
-
-       if(!prs_uint32("off_dacl     ", ps, depth, &psd->off_dacl))
-               return False;
-
+       max_offset = old_offset;
+
+       prs_uint16("revision ", ps, depth, &(t->revision));
+       prs_uint16("type     ", ps, depth, &(t->type));
+
+       prs_uint32("off_owner_sid", ps, depth, &(t->off_owner_sid));
+       prs_uint32("off_grp_sid  ", ps, depth, &(t->off_grp_sid));
+       prs_uint32("off_sacl     ", ps, depth, &(t->off_sacl));
+       prs_uint32("off_dacl     ", ps, depth, &(t->off_dacl));
+#if 0
+       prs_uint32_pre("off_owner_sid", ps, depth, &(t->off_owner_sid),
+                      &off_owner_sid);
+       prs_uint32_pre("off_grp_sid  ", ps, depth, &(t->off_grp_sid),
+                      &off_grp_sid);
+       prs_uint32_pre("off_sacl     ", ps, depth, &(t->off_sacl), &off_sacl);
+       prs_uint32_pre("off_dacl     ", ps, depth, &(t->off_dacl), &off_dacl);
+#endif
        max_offset = MAX(max_offset, prs_offset(ps));
 
-       if (psd->off_owner_sid != 0) {
-
-               if (UNMARSHALLING(ps)) {
-                       if(!prs_set_offset(ps, old_offset + psd->off_owner_sid))
-                               return False;
+       if (IS_BITS_SET_ALL(t->type, SEC_DESC_DACL_PRESENT))
+       {
+#if 0
+               prs_uint32_post("off_dacl    ", ps, depth, &(t->off_dacl),
+                               off_dacl, prs_offset(ps) - old_offset);
+#endif
+               if(!prs_set_offset(ps, old_offset + t->off_dacl))
+                       return False;
+               if (ps->io)
+               {
                        /* reading */
-                       if((psd->owner_sid = malloc(sizeof(*psd->owner_sid))) == NULL)
-                               return False;
-                       ZERO_STRUCTP(psd->owner_sid);
+                       t->dacl = (SEC_ACL *) malloc(sizeof(*t->dacl));
+                       ZERO_STRUCTP(t->dacl);
                }
 
-               if(!smb_io_dom_sid("owner_sid ", psd->owner_sid , ps, depth))
+               if (t->dacl == NULL)
+               {
+                       DEBUG(0, ("INVALID DACL\n"));
+                       prs_set_offset(ps, 0xfffffffe);
                        return False;
-               if(!prs_align(ps))
+               }
+
+               if(!sec_io_acl("dacl", t->dacl, ps, depth))
                        return False;
+               prs_align(ps);
        }
+#if 0
+       else
+       {
+               prs_uint32_post("off_dacl    ", ps, depth, &(t->off_dacl),
+                               off_dacl, 0);
+       }
+#endif
 
        max_offset = MAX(max_offset, prs_offset(ps));
 
-       if (psd->off_grp_sid != 0) {
-
-               if (UNMARSHALLING(ps)) {
+       if (IS_BITS_SET_ALL(t->type, SEC_DESC_SACL_PRESENT))
+       {
+#if 0
+               prs_uint32_post("off_sacl  ", ps, depth, &(t->off_sacl),
+                               off_sacl, prs_offset(ps) - old_offset);
+#endif
+               if(!prs_set_offset(ps, old_offset + t->off_sacl))
+                       return False;
+               if (ps->io)
+               {
                        /* reading */
-                       if(!prs_set_offset(ps, old_offset + psd->off_grp_sid))
-                               return False;
-                       if((psd->grp_sid = malloc(sizeof(*psd->grp_sid))) == NULL)
-                               return False;
-                       ZERO_STRUCTP(psd->grp_sid);
+                       t->sacl = (SEC_ACL *) malloc(sizeof(*t->sacl));
+                       ZERO_STRUCTP(t->sacl);
                }
 
-               if(!smb_io_dom_sid("grp_sid", psd->grp_sid, ps, depth))
+               if (t->sacl == NULL)
+               {
+                       DEBUG(0, ("INVALID SACL\n"));
+                       prs_set_offset(ps, 0xfffffffe);
                        return False;
-               if(!prs_align(ps))
+               }
+
+               if(!sec_io_acl("sacl", t->sacl, ps, depth))
                        return False;
+               prs_align(ps);
+       }
+#if 0
+       else
+       {
+               prs_uint32_post("off_sacl  ", ps, depth, &(t->off_sacl),
+                               off_sacl, 0);
        }
+#endif
 
        max_offset = MAX(max_offset, prs_offset(ps));
 
-       if (IS_BITS_SET_ALL(psd->type, SEC_DESC_SACL_PRESENT) && psd->off_sacl) {
-               if(!prs_set_offset(ps, old_offset + psd->off_sacl))
-                       return False;
-               if(!sec_io_acl("sacl", &psd->sacl, ps, depth))
-                       return False;
-               if(!prs_align(ps))
+#if 0
+       prs_uint32_post("off_owner_sid", ps, depth, &(t->off_owner_sid),
+                       off_owner_sid, prs_offset(ps) - old_offset);
+#endif
+       if (t->off_owner_sid != 0)
+       {
+               if (ps->io)
+               {
+                       if(!prs_set_offset(ps, old_offset + t->off_owner_sid))
+                               return False;
+               }
+               if (ps->io)
+               {
+                       /* reading */
+                       t->owner_sid =
+                               (DOM_SID *)malloc(sizeof(*t->owner_sid));
+                       ZERO_STRUCTP(t->owner_sid);
+               }
+
+               if (t->owner_sid == NULL)
+               {
+                       DEBUG(0, ("INVALID OWNER SID\n"));
+                       prs_set_offset(ps, 0xfffffffe);
                        return False;
+               }
+
+               smb_io_dom_sid("owner_sid ", t->owner_sid, ps, depth);
+               prs_align(ps);
        }
 
        max_offset = MAX(max_offset, prs_offset(ps));
 
-       if (IS_BITS_SET_ALL(psd->type, SEC_DESC_DACL_PRESENT) && psd->off_dacl != 0) {
-               if(!prs_set_offset(ps, old_offset + psd->off_dacl))
-                       return False;
-               if(!sec_io_acl("dacl", &psd->dacl, ps, depth))
-                       return False;
-               if(!prs_align(ps))
+#if 0
+       prs_uint32_post("off_grp_sid  ", ps, depth, &(t->off_grp_sid),
+                       off_grp_sid, prs_offset(ps) - old_offset);
+#endif
+       if (t->off_grp_sid != 0)
+       {
+               if (ps->io)
+               {
+                       if(!prs_set_offset(ps, old_offset + t->off_grp_sid))
+                               return False;
+               }
+               if (ps->io)
+               {
+                       /* reading */
+                       t->grp_sid = (DOM_SID *)malloc(sizeof(*t->grp_sid));
+                       ZERO_STRUCTP(t->grp_sid);
+               }
+
+               if (t->grp_sid == NULL)
+               {
+                       DEBUG(0, ("INVALID GROUP SID\n"));
+                       prs_set_offset(ps, 0xfffffffe);
                        return False;
+               }
+
+               smb_io_dom_sid("grp_sid", t->grp_sid, ps, depth);
+               prs_align(ps);
        }
 
        max_offset = MAX(max_offset, prs_offset(ps));
 
        if(!prs_set_offset(ps, max_offset))
                return False;
+
        return True;
 }
 
 /*******************************************************************
- Creates a SEC_DESC_BUF structure.
+creates a SEC_DESC_BUF structure.
 ********************************************************************/
-
-SEC_DESC_BUF *make_sec_desc_buf(int len, SEC_DESC *sec_desc)
+BOOL make_sec_desc_buf(SEC_DESC_BUF * buf, int len, SEC_DESC * data)
 {
-       SEC_DESC_BUF *dst;
-
-       if((dst = (SEC_DESC_BUF *)malloc(sizeof(SEC_DESC_BUF))) == NULL)
-               return NULL;
-
-       ZERO_STRUCTP(dst);
+       ZERO_STRUCTP(buf);
 
        /* max buffer size (allocated size) */
-       dst->max_len = len;
-       dst->len = len;
-
-       if(sec_desc && ((dst->sec = dup_sec_desc(sec_desc)) == NULL)) {
-               free_sec_desc_buf(&dst);
-               return NULL;
-       }
-
-       return dst;
-}
-
-/*******************************************************************
- Duplicates a SEC_DESC_BUF structure.
-********************************************************************/
-
-SEC_DESC_BUF *dup_sec_desc_buf(SEC_DESC_BUF *src)
-{
-       if(src == NULL)
-               return NULL;
+       buf->max_len = len;
+       buf->undoc = 0;
+       buf->len = data != NULL ? len : 0;
+       buf->sec = data;
 
-       return make_sec_desc_buf( src->len, src->sec);
+       return True;
 }
 
 /*******************************************************************
- Deletes a SEC_DESC_BUF structure.
+frees a SEC_DESC_BUF structure.
 ********************************************************************/
-
-void free_sec_desc_buf(SEC_DESC_BUF **ppsdb)
+void free_sec_desc_buf(SEC_DESC_BUF * buf)
 {
-       SEC_DESC_BUF *psdb;
-
-       if(ppsdb == NULL || *ppsdb == NULL)
+       if (buf == NULL)
                return;
-
-       psdb = *ppsdb;
-       free_sec_desc(&psdb->sec);
-       free(psdb);
-       *ppsdb = NULL;
+       if (buf->sec != NULL)
+       {
+               free_sec_desc(buf->sec);
+               free(buf->sec);
+               buf->sec = NULL;
+       }
 }
 
 
 /*******************************************************************
- Reads or writes a SEC_DESC_BUF structure.
+reads or writes a SEC_DESC_BUF structure.
 ********************************************************************/
-
-BOOL sec_io_desc_buf(char *desc, SEC_DESC_BUF **ppsdb, prs_struct *ps, int depth)
+BOOL sec_io_desc_buf(char *desc, SEC_DESC_BUF * sec, prs_struct *ps,
+                    int depth)
 {
        uint32 off_len;
        uint32 off_max_len;
        uint32 old_offset;
        uint32 size;
-       SEC_DESC_BUF *psdb;
 
-       if (ppsdb == NULL)
+       if (sec == NULL)
                return False;
 
-       psdb = *ppsdb;
-
-       if (UNMARSHALLING(ps) && psdb == NULL) {
-               if((psdb = (SEC_DESC_BUF *)malloc(sizeof(SEC_DESC_BUF))) == NULL)
-                       return False;
-               ZERO_STRUCTP(psdb);
-               *ppsdb = psdb;
-       }
-
        prs_debug(ps, depth, desc, "sec_io_desc_buf");
        depth++;
 
-       if(!prs_align(ps))
-               return False;
-       
-       if(!prs_uint32_pre("max_len", ps, depth, &psdb->max_len, &off_max_len))
-               return False;
-
-       if(!prs_uint32    ("undoc  ", ps, depth, &psdb->undoc))
-               return False;
+       prs_align(ps);
 
-       if(!prs_uint32_pre("len    ", ps, depth, &psdb->len, &off_len))
-               return False;
+       prs_uint32_pre("max_len", ps, depth, &(sec->max_len), &off_max_len);
+       prs_uint32("undoc  ", ps, depth, &(sec->undoc));
+       prs_uint32_pre("len    ", ps, depth, &(sec->len), &off_len);
 
        old_offset = prs_offset(ps);
 
-       /* reading, length is non-zero; writing, descriptor is non-NULL */
-       if ((psdb->len != 0 || MARSHALLING(ps)) && psdb->sec != NULL) {
-               if(!sec_io_desc("sec   ", &psdb->sec, ps, depth))
+       if (sec->len != 0 && ps->io)
+       {
+               /* reading */
+               sec->sec = (SEC_DESC *) malloc(sizeof(*sec->sec));
+               ZERO_STRUCTP(sec->sec);
+
+               if (sec->sec == NULL)
+               {
+                       DEBUG(0, ("INVALID SEC_DESC\n"));
+                       prs_set_offset(ps, 0xfffffffe);
                        return False;
+               }
        }
 
-       size = prs_offset(ps) - old_offset;
-       if(!prs_uint32_post("max_len", ps, depth, &psdb->max_len, off_max_len, size == 0 ? psdb->max_len : size))
-               return False;
+       /* reading, length is non-zero; writing, descriptor is non-NULL */
+       if ((sec->len != 0 || (!ps->io)) && sec->sec != NULL)
+       {
+               sec_io_desc("sec   ", sec->sec, ps, depth);
+       }
+
+       prs_align(ps);
+
+       size = prs_offset(ps) - old_offset - 8;
+       prs_uint32_post("max_len", ps, depth, &(sec->max_len), off_max_len,
+                       size == 0 ? sec->max_len : size + 8);
+       prs_uint32_post("len    ", ps, depth, &(sec->len), off_len,
+                       size == 0 ? 0 : size + 8);
 
-       if(!prs_uint32_post("len    ", ps, depth, &psdb->len, off_len, size))
+       if(!prs_set_offset(ps, old_offset + size + 8))
                return False;
 
        return True;
index 4a9c0d2645197a9174852641a0202a9c3f90f6c3..c33cf58762b166a2ecbc7e44d8db126524c3bb1d 100644 (file)
@@ -1295,6 +1295,14 @@ static uint32 size_of_relative_string(UNISTR *string)
        return size;
 }
 
+/*******************************************************************
+ * return the length of a uint32 + sec desc
+ ********************************************************************/
+static uint32 size_of_sec_desc(SEC_DESC *sec)
+{
+       return 4+1024;
+}
+
 /*******************************************************************
  * return the length of a uint32 (obvious, but the code is clean)
  ********************************************************************/
@@ -1483,6 +1491,63 @@ static BOOL new_smb_io_relarraystr(char *desc, NEW_BUFFER *buffer, int depth, ui
 }
 
 
+/*******************************************************************
+ Parse a DEVMODE structure and its relative pointer.
+********************************************************************/
+static BOOL new_smb_io_relsecdesc(char *desc, NEW_BUFFER *buffer, int depth,
+               SEC_DESC **secdesc)
+{
+       prs_struct *ps=&(buffer->prs);
+
+       prs_debug(ps, depth, desc, "new_smb_io_relsecdesc");
+       depth++;
+
+       if (MARSHALLING(ps))
+       {
+               uint32 struct_offset = prs_offset(ps);
+               uint32 relative_offset;
+               
+               if (*secdesc != NULL)
+               {
+                       buffer->string_at_end -= 256; /* HACK! */
+                       
+                       prs_set_offset(ps, buffer->string_at_end);
+                       
+                       /* write the secdesc */
+                       if (!sec_io_desc(desc, *secdesc, ps, depth))
+                               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 sd */
+               *secdesc = g_new(SEC_DESC, 1);
+               if (*secdesc == NULL)
+                       return False;
+               if (!sec_io_desc(desc, *secdesc, ps, depth))
+                       return False;
+
+               prs_set_offset(ps, old_offset);
+       }
+       return True;
+}
+
 /*******************************************************************
  Parse a DEVMODE structure and its relative pointer.
 ********************************************************************/
@@ -1663,9 +1728,6 @@ BOOL new_smb_io_printer_info_1(char *desc, NEW_BUFFER *buffer, PRINTER_INFO_1 *i
 ********************************************************************/  
 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;
-
        prs_struct *ps=&(buffer->prs);
 
        prs_debug(ps, depth, desc, "new_smb_io_printer_info_2");
@@ -1701,8 +1763,9 @@ BOOL new_smb_io_printer_info_2(char *desc, NEW_BUFFER *buffer, PRINTER_INFO_2 *i
        if (!new_smb_io_relstr("parameters", buffer, depth, &info->parameters))
                return False;
 
-       if (!prs_uint32("security descriptor", ps, depth, &pipo))
+       if (!new_smb_io_relsecdesc("secdesc", buffer, depth, &info->secdesc))
                return False;
+
        if (!prs_uint32("attributes", ps, depth, &info->attributes))
                return False;
        if (!prs_uint32("priority", ps, depth, &info->priority))
@@ -1723,6 +1786,26 @@ BOOL new_smb_io_printer_info_2(char *desc, NEW_BUFFER *buffer, PRINTER_INFO_2 *i
        return True;
 }
 
+/*******************************************************************
+ Parse a PRINTER_INFO_3 structure.
+********************************************************************/  
+BOOL new_smb_io_printer_info_3(char *desc, NEW_BUFFER *buffer, PRINTER_INFO_3 *info, int depth)
+{
+       prs_struct *ps=&(buffer->prs);
+
+       prs_debug(ps, depth, desc, "new_smb_io_printer_info_3");
+       depth++;        
+       
+       buffer->struct_start=prs_offset(ps);
+       
+       if (!prs_uint32("flags", ps, depth, &info->flags))
+               return False;
+       if (!sec_io_desc("sec_desc", &info->sec, ps, depth))
+               return False;
+
+       return True;
+}
+
 /*******************************************************************
  Parse a DRIVER_INFO_1 structure.
 ********************************************************************/
@@ -2281,7 +2364,7 @@ uint32 spoolss_size_printer_info_2(PRINTER_INFO_2 *info)
 {
        int size=0;
                
-       size+=4;      /* the security descriptor */
+       size += size_of_sec_desc( info->secdesc );
        
        size+=size_of_device_mode( info->devmode );
        
@@ -2309,6 +2392,18 @@ uint32 spoolss_size_printer_info_2(PRINTER_INFO_2 *info)
        return size;
 }
 
+/*******************************************************************
+return the size required by a struct in the stream
+********************************************************************/
+uint32 spoolss_size_printer_info_3(PRINTER_INFO_3 *info)
+{
+       /* well, we don't actually *know* the damn size of the
+        * security descriptor.  spoolss is a stupidly designed
+        * api.
+        */
+       return size_of_sec_desc( &info->sec );
+}
+
 /*******************************************************************
 return the size required by a struct in the stream
 ********************************************************************/
@@ -2829,9 +2924,7 @@ BOOL spoolss_io_q_setprinter(char *desc, SPOOL_Q_SETPRINTER *q_u, prs_struct *ps
        if (!spoolss_io_devmode_cont(desc, &q_u->devmode_ctr, ps, depth))
                return False;
        
-       if(!prs_uint32("security.size_of_buffer", ps, depth, &q_u->security.size_of_buffer))
-               return False;
-       if(!prs_uint32("security.data", ps, depth, &q_u->security.data))
+       if (!sec_io_desc_buf(desc, &q_u->secdesc_ctr, ps, depth))
                return False;
        
        if(!prs_uint32("command", ps, depth, &q_u->command))
@@ -3289,6 +3382,23 @@ BOOL spool_io_printer_info_level_1(char *desc, SPOOL_PRINTER_INFO_LEVEL_1 *il, p
        return True;
 }
 
+/*******************************************************************
+ Parse a SPOOL_PRINTER_INFO_LEVEL_3 structure.
+********************************************************************/  
+BOOL spool_io_printer_info_level_3(char *desc, SPOOL_PRINTER_INFO_LEVEL_3 *il, prs_struct *ps, int depth)
+{      
+       prs_debug(ps, depth, desc, "spool_io_printer_info_level_3");
+       depth++;
+               
+       if(!prs_align(ps))
+               return False;
+
+       if(!prs_uint32("secdesc_ptr", ps, depth, &il->secdesc_ptr))
+               return False;
+
+       return True;
+}
+
 /*******************************************************************
  Parse a SPOOL_PRINTER_INFO_LEVEL_2 structure.
 ********************************************************************/  
@@ -3406,23 +3516,36 @@ BOOL spool_io_printer_info_level(char *desc, SPOOL_PRINTER_INFO_LEVEL *il, prs_s
                 * and by setprinter when updating printer's info
                 */     
                case 1:
+               {
                        if (UNMARSHALLING(ps)) {
-                               il->info_1=(SPOOL_PRINTER_INFO_LEVEL_1 *)malloc(sizeof(SPOOL_PRINTER_INFO_LEVEL_1));
+                               il->info_1=g_new(SPOOL_PRINTER_INFO_LEVEL_1, 1);
                                if(il->info_1 == NULL)
                                        return False;
                        }
                        if (!spool_io_printer_info_level_1("", il->info_1, ps, depth))
                                return False;
                        break;          
+               }
                case 2:
                        if (UNMARSHALLING(ps)) {
-                               il->info_2=(SPOOL_PRINTER_INFO_LEVEL_2 *)malloc(sizeof(SPOOL_PRINTER_INFO_LEVEL_2));
+                               il->info_2=g_new(SPOOL_PRINTER_INFO_LEVEL_2, 1);
                                if(il->info_2 == NULL)
                                        return False;
                        }
                        if (!spool_io_printer_info_level_2("", il->info_2, ps, depth))
                                return False;
                        break;          
+               case 3:
+               {
+                       if (UNMARSHALLING(ps)) {
+                               il->info_3=g_new(SPOOL_PRINTER_INFO_LEVEL_3, 1);
+                               if(il->info_3 == NULL)
+                                       return False;
+                       }
+                       if (!spool_io_printer_info_level_3("", il->info_3, ps, depth))
+                               return False;
+                       break;          
+               }
        }
 
        return True;
@@ -4607,11 +4730,27 @@ void free_devmode(DEVICEMODE *devmode)
        }
 }
 
+void free_printer_info_3(PRINTER_INFO_3 *printer)
+{
+       if (printer!=NULL)
+       {
+               free_sec_desc(&printer->sec);
+               free(printer);
+       }
+}
+
 void free_printer_info_2(PRINTER_INFO_2 *printer)
 {
        if (printer!=NULL)
        {
                free_devmode(printer->devmode);
+               printer->devmode = NULL;
+               if (printer->secdesc != NULL)
+               {
+                       free_sec_desc(printer->secdesc);
+                       free(printer->secdesc);
+                       printer->secdesc = NULL;
+               }
                free(printer);
        }
 }
index 7c56a5f640421f271acacb5ce3d4f820774f7776..90a3a3e6324b579ecf994896f10715168316e60e 100644 (file)
@@ -587,8 +587,8 @@ static BOOL convert_printer_driver_info(const SPOOL_PRINTER_DRIVER_INFO_LEVEL *u
 
 static BOOL convert_devicemode(DEVICEMODE devmode, NT_DEVICEMODE *nt_devmode)
 {
-       unistr_to_dos(nt_devmode->devicename, (char *)devmode.devicename.buffer, 31);
-       unistr_to_dos(nt_devmode->formname, (char *)devmode.formname.buffer, 31);
+       unistr_to_ascii(nt_devmode->devicename, (char *)devmode.devicename.buffer, 31);
+       unistr_to_ascii(nt_devmode->formname, (char *)devmode.formname.buffer, 31);
 
        nt_devmode->specversion=devmode.specversion;
        nt_devmode->driverversion=devmode.driverversion;
@@ -1892,6 +1892,17 @@ static BOOL construct_printer_info_2(fstring servername, PRINTER_INFO_2 *printer
 
        printer->devmode=devmode;
        
+       if (ntprinter.info_2->secdesc.len != 0)
+       {
+               /* steal the printer info sec_desc structure.  [badly done]. */
+               printer->secdesc = ntprinter.info_2->secdesc.sec;
+               ZERO_STRUCT(ntprinter.info_2->secdesc);
+       }
+       else
+       {
+               printer->secdesc = NULL;
+       }
+
        safe_free(queue);
        free_a_printer(ntprinter, 2);
        return True;
@@ -1903,6 +1914,31 @@ static BOOL construct_printer_info_2(fstring servername, PRINTER_INFO_2 *printer
        return False;
 }
 
+/********************************************************************
+ * construct_printer_info_3
+ * fill a printer_info_3 struct
+ ********************************************************************/
+static BOOL construct_printer_info_3(fstring servername,
+                       PRINTER_INFO_3 *printer, int snum)
+{
+       NT_PRINTER_INFO_LEVEL ntprinter;
+
+       if (get_a_printer(&ntprinter, 2, lp_servicename(snum)) !=0 )
+               return False;
+               
+       printer->flags = 4; /* no idea, yet.  see MSDN. */
+       if (ntprinter.info_2->secdesc.len != 0)
+       {
+               /* steal the printer info sec_desc structure.  [badly done]. */
+               printer->sec = *ntprinter.info_2->secdesc.sec;
+               safe_free(ntprinter.info_2->secdesc.sec);
+               ZERO_STRUCT(ntprinter.info_2->secdesc);
+       }
+
+       free_a_printer(ntprinter, 2);
+       return True;
+}
+
 /********************************************************************
  Spoolss_enumprinters.
 ********************************************************************/
@@ -2337,6 +2373,41 @@ static uint32 getprinter_level_2(fstring servername, int snum, NEW_BUFFER *buffe
                return NT_STATUS_NO_PROBLEMO;   
 }
 
+/****************************************************************************
+****************************************************************************/
+static uint32 getprinter_level_3(fstring servername, int snum, NEW_BUFFER *buffer, uint32 offered, uint32 *needed)
+{
+       PRINTER_INFO_3 *printer=NULL;
+       fstring temp;
+
+       if((printer=(PRINTER_INFO_3*)malloc(sizeof(PRINTER_INFO_3)))==NULL)
+               return ERROR_NOT_ENOUGH_MEMORY;
+       
+       fstrcpy(temp, "\\\\");
+       fstrcat(temp, servername);
+       construct_printer_info_3(temp, printer, snum);
+       
+       /* check the required size. */  
+       *needed += spoolss_size_printer_info_3(printer);
+
+       if (!alloc_buffer_size(buffer, *needed)) {
+               safe_free(printer);
+               return ERROR_INSUFFICIENT_BUFFER;
+       }
+
+       /* fill the buffer with the structures */
+       new_smb_io_printer_info_3("", buffer, printer, 0);      
+       
+       /* clear memory */
+       free_sec_desc(&printer->sec);
+
+       if (*needed > offered) {
+               return ERROR_INSUFFICIENT_BUFFER;
+       }
+       else
+               return NT_STATUS_NO_PROBLEMO;   
+}
+
 /****************************************************************************
 ****************************************************************************/
 uint32 _spoolss_getprinter(POLICY_HND *handle, uint32 level,
@@ -2355,13 +2426,12 @@ uint32 _spoolss_getprinter(POLICY_HND *handle, uint32 level,
        switch (level) {
        case 0:
                return getprinter_level_0(servername, snum, buffer, offered, needed);
-               break;
        case 1:
                return getprinter_level_1(servername,snum, buffer, offered, needed);
-               break;
        case 2:         
                return getprinter_level_2(servername,snum, buffer, offered, needed);
-               break;
+       case 3:         
+               return getprinter_level_3(servername,snum, buffer, offered, needed);
        default:
                return ERROR_INVALID_LEVEL;
                break;