port latest changes from SAMBA_3_0 tree
[obnox/samba/samba-obnox.git] / source3 / rpc_client / cli_ds.c
index f0edeca00032cde87f78c9c886f17907263de42c..a7a093328c972ed6febbcd5e3c9fb15dd625cb3f 100644 (file)
 
 /* implementations of client side DsXXX() functions */
 
+/********************************************************************
+ Get information about the server and directory services
+********************************************************************/
+
 NTSTATUS cli_ds_getprimarydominfo(struct cli_state *cli, TALLOC_CTX *mem_ctx, 
                                  uint16 level, DS_DOMINFO_CTR *ctr)
 {
@@ -40,7 +44,7 @@ NTSTATUS cli_ds_getprimarydominfo(struct cli_state *cli, TALLOC_CTX *mem_ctx,
        
        q.level = level;
        
-       if (!ds_io_q_getprimdominfo("", &q, &qbuf, 0
+       if (!ds_io_q_getprimdominfo("", &qbuf, 0, &q
            || !rpc_api_pipe_req(cli, DS_GETPRIMDOMINFO, &qbuf, &rbuf)) {
                result = NT_STATUS_UNSUCCESSFUL;
                goto done;
@@ -48,7 +52,7 @@ NTSTATUS cli_ds_getprimarydominfo(struct cli_state *cli, TALLOC_CTX *mem_ctx,
 
        /* Unmarshall response */
 
-       if (!ds_io_r_getprimdominfo("", &r, &rbuf, 0)) {
+       if (!ds_io_r_getprimdominfo("", &rbuf, 0, &r)) {
                result = NT_STATUS_UNSUCCESSFUL;
                goto done;
        }
@@ -71,3 +75,63 @@ done:
 
        return result;
 }
+
+/********************************************************************
+ Enumerate trusted domains in an AD forest
+********************************************************************/
+
+NTSTATUS cli_ds_enum_domain_trusts(struct cli_state *cli, TALLOC_CTX *mem_ctx, 
+                                 const char *server, uint32 flags, 
+                                 DS_DOMAIN_TRUSTS **trusts, uint32 *num_domains)
+{
+       prs_struct qbuf, rbuf;
+       DS_Q_ENUM_DOM_TRUSTS q;
+       DS_R_ENUM_DOM_TRUSTS r;
+       NTSTATUS result;
+
+       ZERO_STRUCT(q);
+       ZERO_STRUCT(r);
+
+       /* Initialise parse structures */
+
+       prs_init(&qbuf, MAX_PDU_FRAG_LEN, mem_ctx, MARSHALL);
+       prs_init(&rbuf, 0, mem_ctx, UNMARSHALL);
+
+       init_q_ds_enum_domain_trusts( &q, server, flags );
+               
+       if (!ds_io_q_enum_domain_trusts("", &qbuf, 0, &q) 
+           || !rpc_api_pipe_req(cli, DS_ENUM_DOM_TRUSTS, &qbuf, &rbuf)) {
+               result = NT_STATUS_UNSUCCESSFUL;
+               goto done;
+       }
+
+       /* Unmarshall response */
+
+       if (!ds_io_r_enum_domain_trusts("", &rbuf, 0, &r)) {
+               result = NT_STATUS_UNSUCCESSFUL;
+               goto done;
+       }
+       
+       result = r.status;
+       
+       if ( NT_STATUS_IS_OK(result) ) {
+               int i;
+       
+               *num_domains = r.num_domains;
+               *trusts = (DS_DOMAIN_TRUSTS*)smb_xmalloc(r.num_domains*sizeof(DS_DOMAIN_TRUSTS));
+               
+               memcpy( *trusts, r.domains.trusts, r.num_domains*sizeof(DS_DOMAIN_TRUSTS) );
+               for ( i=0; i<r.num_domains; i++ ) {
+                       copy_unistr2( &(*trusts)[i].netbios_domain, &r.domains.trusts[i].netbios_domain );
+                       copy_unistr2( &(*trusts)[i].dns_domain,     &r.domains.trusts[i].dns_domain );
+               }
+       }
+       
+done:
+       prs_mem_free(&qbuf);
+       prs_mem_free(&rbuf);
+
+       return result;
+}
+
+