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; }
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; }
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; }