/* 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
if (lp_host_msdfs()) {
*r->out.version = DFS_MANAGER_VERSION_NT4;
} else {
- *r->out.version = 0;
+ *r->out.version = (enum dfs_ManagerVersion)0;
}
}
{
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;
}
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;
}
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;
}
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;
}
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));
}
/* 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 */
/* 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(),
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);
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')
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;
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;
{
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) {
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;