s3-spoolss: cleanup _spoolss_EnumPrinterDrivers().
[kai/samba.git] / source3 / rpc_server / srv_dfs_nt.c
index 1ce81a76f9d5d2b4cacf99afd4b4cc6cfa8ed563..dfa33c25a910040cd19ed4c85329d08a14eabb97 100644 (file)
@@ -22,6 +22,7 @@
 /* This is the implementation of the dfs pipe. */
 
 #include "includes.h"
+#include "../librpc/gen_ndr/srv_dfs.h"
 
 #undef DBGC_CLASS
 #define DBGC_CLASS DBGC_MSDFS
@@ -34,7 +35,7 @@ void _dfs_GetManagerVersion(pipes_struct *p, struct dfs_GetManagerVersion *r)
        if (lp_host_msdfs()) {
                *r->out.version = DFS_MANAGER_VERSION_NT4;
        } else {
-               *r->out.version = 0;
+               *r->out.version = (enum dfs_ManagerVersion)0;
        }
 }
 
@@ -42,14 +43,13 @@ WERROR _dfs_Add(pipes_struct *p, struct dfs_Add *r)
 {
        struct junction_map *jn = NULL;
        struct referral *old_referral_list = NULL;
-       BOOL self_ref = False;
+       bool self_ref = False;
        int consumedcnt = 0;
-       BOOL exists = False;
        char *altpath = NULL;
        NTSTATUS status;
        TALLOC_CTX *ctx = talloc_tos();
 
-       if (p->pipe_user.ut.uid != 0) {
+       if (p->server_info->utok.uid != sec_initial_uid()) {
                DEBUG(10,("_dfs_add: uid != 0. Access denied.\n"));
                return WERR_ACCESS_DENIED;
        }
@@ -76,12 +76,9 @@ WERROR _dfs_Add(pipes_struct *p, struct dfs_Add *r)
                return ntstatus_to_werror(status);
        }
 
-       exists = True;
        jn->referral_count += 1;
        old_referral_list = jn->referral_list;
 
-       vfs_ChDir(p->conn,p->conn->connectpath);
-
        if (jn->referral_count < 1) {
                return WERR_NOMEM;
        }
@@ -101,11 +98,9 @@ WERROR _dfs_Add(pipes_struct *p, struct dfs_Add *r)
        jn->referral_list[jn->referral_count-1].ttl = REFERRAL_TTL;
        jn->referral_list[jn->referral_count-1].alternate_path = altpath;
 
-       if(!create_msdfs_link(jn, exists)) {
-               vfs_ChDir(p->conn,p->conn->connectpath);
+       if(!create_msdfs_link(jn)) {
                return WERR_DFS_CANT_CREATE_JUNCT;
        }
-       vfs_ChDir(p->conn,p->conn->connectpath);
 
        return WERR_OK;
 }
@@ -113,13 +108,13 @@ WERROR _dfs_Add(pipes_struct *p, struct dfs_Add *r)
 WERROR _dfs_Remove(pipes_struct *p, struct dfs_Remove *r)
 {
        struct junction_map *jn = NULL;
-       BOOL self_ref = False;
+       bool self_ref = False;
        int consumedcnt = 0;
-       BOOL found = False;
+       bool found = False;
        TALLOC_CTX *ctx = talloc_tos();
        char *altpath = NULL;
 
-       if (p->pipe_user.ut.uid != 0) {
+       if (p->server_info->utok.uid != sec_initial_uid()) {
                DEBUG(10,("_dfs_remove: uid != 0. Access denied.\n"));
                return WERR_ACCESS_DENIED;
        }
@@ -133,10 +128,10 @@ WERROR _dfs_Remove(pipes_struct *p, struct dfs_Remove *r)
                altpath = talloc_asprintf(ctx, "%s\\%s",
                        r->in.servername,
                        r->in.sharename);
-               strlower_m(altpath);
                if (!altpath) {
                        return WERR_NOMEM;
                }
+               strlower_m(altpath);
                DEBUG(5,("init_reply_dfs_remove: Request to remove %s -> %s\\%s.\n",
                        r->in.dfs_entry_path, r->in.servername, r->in.sharename));
        }
@@ -149,10 +144,8 @@ WERROR _dfs_Remove(pipes_struct *p, struct dfs_Remove *r)
        /* if no server-share pair given, remove the msdfs link completely */
        if(!r->in.servername && !r->in.sharename) {
                if(!remove_msdfs_link(jn)) {
-                       vfs_ChDir(p->conn,p->conn->connectpath);
                        return WERR_DFS_NO_SUCH_VOL;
                }
-               vfs_ChDir(p->conn,p->conn->connectpath);
        } else {
                int i=0;
                /* compare each referral in the list with the one to remove */
@@ -180,22 +173,19 @@ WERROR _dfs_Remove(pipes_struct *p, struct dfs_Remove *r)
                /* Only one referral, remove it */
                if(jn->referral_count == 1) {
                        if(!remove_msdfs_link(jn)) {
-                               vfs_ChDir(p->conn,p->conn->connectpath);
                                return WERR_DFS_NO_SUCH_VOL;
                        }
                } else {
-                       if(!create_msdfs_link(jn, True)) {
-                               vfs_ChDir(p->conn,p->conn->connectpath);
+                       if(!create_msdfs_link(jn)) {
                                return WERR_DFS_CANT_CREATE_JUNCT;
                        }
                }
-               vfs_ChDir(p->conn,p->conn->connectpath);
        }
 
        return WERR_OK;
 }
 
-static BOOL init_reply_dfs_info_1(TALLOC_CTX *mem_ctx, struct junction_map* j,struct dfs_Info1* dfs1)
+static bool init_reply_dfs_info_1(TALLOC_CTX *mem_ctx, struct junction_map* j,struct dfs_Info1* dfs1)
 {
        dfs1->path = talloc_asprintf(mem_ctx,
                                "\\\\%s\\%s\\%s", global_myname(),
@@ -207,7 +197,7 @@ static BOOL init_reply_dfs_info_1(TALLOC_CTX *mem_ctx, struct junction_map* j,st
        return True;
 }
 
-static BOOL init_reply_dfs_info_2(TALLOC_CTX *mem_ctx, struct junction_map* j, struct dfs_Info2* dfs2)
+static bool init_reply_dfs_info_2(TALLOC_CTX *mem_ctx, struct junction_map* j, struct dfs_Info2* dfs2)
 {
        dfs2->path = talloc_asprintf(mem_ctx,
                        "\\\\%s\\%s\\%s", global_myname(), j->service_name, j->volume_name);
@@ -219,7 +209,7 @@ static BOOL init_reply_dfs_info_2(TALLOC_CTX *mem_ctx, struct junction_map* j, s
        return True;
 }
 
-static BOOL init_reply_dfs_info_3(TALLOC_CTX *mem_ctx, struct junction_map* j, struct dfs_Info3* dfs3)
+static bool init_reply_dfs_info_3(TALLOC_CTX *mem_ctx, struct junction_map* j, struct dfs_Info3* dfs3)
 {
        int ii;
        if (j->volume_name[0] == '\0')
@@ -271,7 +261,7 @@ static BOOL init_reply_dfs_info_3(TALLOC_CTX *mem_ctx, struct junction_map* j, s
        return True;
 }
 
-static BOOL init_reply_dfs_info_100(TALLOC_CTX *mem_ctx, struct junction_map* j, struct dfs_Info100* dfs100)
+static bool init_reply_dfs_info_100(TALLOC_CTX *mem_ctx, struct junction_map* j, struct dfs_Info100* dfs100)
 {
        dfs100->comment = talloc_strdup(mem_ctx, j->comment);
        return True;
@@ -289,9 +279,9 @@ WERROR _dfs_Enum(pipes_struct *p, struct dfs_Enum *r)
                num_jn = 0;
                jn = NULL;
        }
-       vfs_ChDir(p->conn,p->conn->connectpath);
 
-       DEBUG(5,("_dfs_Enum: %d junctions found in Dfs, doing level %d\n", num_jn, r->in.level));
+       DEBUG(5,("_dfs_Enum: %u junctions found in Dfs, doing level %d\n",
+                               (unsigned int)num_jn, r->in.level));
 
        *r->out.total = num_jn;
 
@@ -354,9 +344,9 @@ WERROR _dfs_GetInfo(pipes_struct *p, struct dfs_GetInfo *r)
 {
        int consumedcnt = strlen(r->in.dfs_entry_path);
        struct junction_map *jn = NULL;
-       BOOL self_ref = False;
+       bool self_ref = False;
        TALLOC_CTX *ctx = talloc_tos();
-       BOOL ret;
+       bool ret;
 
        jn = TALLOC_ZERO_P(ctx, struct junction_map);
        if (!jn) {
@@ -371,17 +361,38 @@ WERROR _dfs_GetInfo(pipes_struct *p, struct dfs_GetInfo *r)
        if(!NT_STATUS_IS_OK(get_referred_path(ctx, r->in.dfs_entry_path,
                                        jn, &consumedcnt, &self_ref)) ||
                        consumedcnt < strlen(r->in.dfs_entry_path)) {
-               vfs_ChDir(p->conn,p->conn->connectpath);
                return WERR_DFS_NO_SUCH_VOL;
        }
 
-       vfs_ChDir(p->conn,p->conn->connectpath);
-
        switch (r->in.level) {
-               case 1: ret = init_reply_dfs_info_1(ctx, jn, r->out.info->info1); break;
-               case 2: ret = init_reply_dfs_info_2(ctx, jn, r->out.info->info2); break;
-               case 3: ret = init_reply_dfs_info_3(ctx, jn, r->out.info->info3); break;
-               case 100: ret = init_reply_dfs_info_100(ctx, jn, r->out.info->info100); break;
+               case 1:
+                       r->out.info->info1 = TALLOC_ZERO_P(ctx,struct dfs_Info1);
+                       if (!r->out.info->info1) {
+                               return WERR_NOMEM;
+                       }
+                       ret = init_reply_dfs_info_1(ctx, jn, r->out.info->info1);
+                       break;
+               case 2:
+                       r->out.info->info2 = TALLOC_ZERO_P(ctx,struct dfs_Info2);
+                       if (!r->out.info->info2) {
+                               return WERR_NOMEM;
+                       }
+                       ret = init_reply_dfs_info_2(ctx, jn, r->out.info->info2);
+                       break;
+               case 3:
+                       r->out.info->info3 = TALLOC_ZERO_P(ctx,struct dfs_Info3);
+                       if (!r->out.info->info3) {
+                               return WERR_NOMEM;
+                       }
+                       ret = init_reply_dfs_info_3(ctx, jn, r->out.info->info3);
+                       break;
+               case 100:
+                       r->out.info->info100 = TALLOC_ZERO_P(ctx,struct dfs_Info100);
+                       if (!r->out.info->info100) {
+                               return WERR_NOMEM;
+                       }
+                       ret = init_reply_dfs_info_100(ctx, jn, r->out.info->info100);
+                       break;
                default:
                        r->out.info->info1 = NULL;
                        return WERR_INVALID_PARAM;