Exemplo n.º 1
0
WERROR _dfs_GetInfo(pipes_struct *p, NETDFS_Q_DFS_GETINFO *q_u, 
                     NETDFS_R_DFS_GETINFO *r_u)
{
	UNISTR2* uni_path = &q_u->path;
	uint32 level = q_u->level;
	int consumedcnt = sizeof(pstring);
	pstring path;
	BOOL ret = False;
	BOOL self_ref = False;
	struct junction_map jn;

	unistr2_to_ascii(path, uni_path, sizeof(path)-1);
	if(!create_junction(path, &jn))
		return WERR_DFS_NO_SUCH_SERVER;
  
	/* The following call can change the cwd. */
	if(!NT_STATUS_IS_OK(get_referred_path(p->mem_ctx, path, &jn, &consumedcnt, &self_ref)) || consumedcnt < strlen(path)) {
		vfs_ChDir(p->conn,p->conn->connectpath);
		return WERR_DFS_NO_SUCH_VOL;
	}

	vfs_ChDir(p->conn,p->conn->connectpath);
	r_u->info.switch_value = level;
	r_u->info.ptr0 = 1;
	r_u->status = WERR_OK;

	switch (level) {
		case 1: ret = init_reply_dfs_info_1(&jn, &r_u->info.u.info1); break;
		case 2: ret = init_reply_dfs_info_2(&jn, &r_u->info.u.info2); break;
		case 3: ret = init_reply_dfs_info_3(p->mem_ctx, &jn, &r_u->info.u.info3); break;
		case 100: ret = init_reply_dfs_info_100(&jn, &r_u->info.u.info100); break;
		default:
			r_u->info.ptr0 = 1;
			r_u->info.switch_value = 0;
			r_u->status = WERR_OK;
			ret = True;
			break;
	}

	if (!ret) 
		r_u->status = WERR_INVALID_PARAM;
  
	return r_u->status;
}
Exemplo n.º 2
0
static WERROR init_reply_dfs_ctr(TALLOC_CTX *ctx, uint32 level, 
                                   DFS_INFO_CTR* ctr, struct junction_map* jn,
                                   int num_jn)
{
  /* do the levels */
  switch(level)
    {
    case 1:
      {
	DFS_INFO_1* dfs1;
	dfs1 = (DFS_INFO_1*) talloc(ctx, num_jn * sizeof(DFS_INFO_1));
	if (!dfs1)
		return WERR_NOMEM;
	init_reply_dfs_info_1(jn, dfs1, num_jn);
	ctr->dfs.info1 = dfs1;
	break;
      }
    case 2:
      {
	DFS_INFO_2* dfs2;
	dfs2 = (DFS_INFO_2*) talloc(ctx, num_jn * sizeof(DFS_INFO_2));
	if (!dfs2)
		return WERR_NOMEM;
	init_reply_dfs_info_2(jn, dfs2, num_jn);
	ctr->dfs.info2 = dfs2;
	break;
      }
    case 3:
      {
	DFS_INFO_3* dfs3;
	dfs3 = (DFS_INFO_3*) talloc(ctx, num_jn * sizeof(DFS_INFO_3));
	if (!dfs3)
		return WERR_NOMEM;
	init_reply_dfs_info_3(ctx, jn, dfs3, num_jn);
	ctr->dfs.info3 = dfs3;
	break;
      }
	default:
		return WERR_INVALID_PARAM;
    }
  return WERR_OK;
}
Exemplo n.º 3
0
WERROR _dfs_Enum(pipes_struct *p, NETDFS_Q_DFS_ENUM *q_u, NETDFS_R_DFS_ENUM *r_u)
{
	uint32 level = q_u->level;
	struct junction_map jn[MAX_MSDFS_JUNCTIONS];
	int num_jn = 0;
	int i;

	num_jn = enum_msdfs_links(p->mem_ctx, jn, ARRAY_SIZE(jn));
	vfs_ChDir(p->conn,p->conn->connectpath);
    
	DEBUG(5,("_dfs_Enum: %d junctions found in Dfs, doing level %d\n", num_jn, level));

	r_u->ptr0_info = q_u->ptr0_info;
	r_u->ptr0_total = q_u->ptr0_total;
	r_u->total = num_jn;

	r_u->info = q_u->info;

	/* Create the return array */
	switch (level) {
	case 1:
		r_u->info.e.u.info1.count = num_jn;
		if (num_jn) {
			if ((r_u->info.e.u.info1.s = TALLOC_ARRAY(p->mem_ctx, NETDFS_DFS_INFO1, num_jn)) == NULL) {
				return WERR_NOMEM;
			}
			r_u->info.e.u.info1.ptr0_s = 1;
			r_u->info.e.u.info1.size_s = num_jn;
		}
		break;
	case 2:
		r_u->info.e.u.info2.count = num_jn;
		if (num_jn) {
			if ((r_u->info.e.u.info2.s = TALLOC_ARRAY(p->mem_ctx, NETDFS_DFS_INFO2, num_jn)) == NULL) {
				return WERR_NOMEM;
			}
			r_u->info.e.u.info2.ptr0_s = 1;
			r_u->info.e.u.info2.size_s = num_jn;
		}
		break;
	case 3:
		r_u->info.e.u.info3.count = num_jn;
		if (num_jn) {
			if ((r_u->info.e.u.info3.s = TALLOC_ARRAY(p->mem_ctx, NETDFS_DFS_INFO3, num_jn)) == NULL) {
				return WERR_NOMEM;
			}
			r_u->info.e.u.info3.ptr0_s = 1;
			r_u->info.e.u.info3.size_s = num_jn;
		}
		break;
	default:
		return WERR_INVALID_PARAM;
	}

	for (i = 0; i < num_jn; i++) {
		switch (level) {
		case 1: 
			init_reply_dfs_info_1(&jn[i], &r_u->info.e.u.info1.s[i]);
			break;
		case 2:
			init_reply_dfs_info_2(&jn[i], &r_u->info.e.u.info2.s[i]);
			break;
		case 3:
			init_reply_dfs_info_3(p->mem_ctx, &jn[i], &r_u->info.e.u.info3.s[i]);
			break;
		default:
			return WERR_INVALID_PARAM;
		}
	}
  
	r_u->status = WERR_OK;

	return r_u->status;
}