WERROR _dfs_enum(pipes_struct *p, DFS_Q_DFS_ENUM *q_u, DFS_R_DFS_ENUM *r_u) { uint32 level = q_u->level; struct junction_map jn[MAX_MSDFS_JUNCTIONS]; int num_jn = 0; num_jn = enum_msdfs_links(jn); DEBUG(5,("make_reply_dfs_enum: %d junctions found in Dfs, doing level %d\n", num_jn, level)); r_u->ptr_buffer = level; r_u->level = r_u->level2 = level; r_u->ptr_num_entries = r_u->ptr_num_entries2 = 1; r_u->num_entries = r_u->num_entries2 = num_jn; r_u->reshnd.ptr_hnd = 1; r_u->reshnd.handle = num_jn; r_u->ctr = (DFS_INFO_CTR*)talloc(p->mem_ctx, sizeof(DFS_INFO_CTR)); if (!r_u->ctr) return WERR_NOMEM; ZERO_STRUCTP(r_u->ctr); r_u->ctr->switch_value = level; r_u->ctr->num_entries = num_jn; r_u->ctr->ptr_dfs_ctr = 1; r_u->status = init_reply_dfs_ctr(p->mem_ctx, level, r_u->ctr, jn, num_jn); return r_u->status; }
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; }