summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGünther Deschner <gd@samba.org>2008-03-19 01:25:59 +0100
committerGünther Deschner <gd@samba.org>2008-03-19 02:18:46 +0100
commit63a6acdfa84253ce602b2a6050093752d69f4771 (patch)
tree0f00ac3ffdb39d71a0b4ee456eb38d46b8399229
parente8bd75ec73a804375753be9eb15d7fc5d9bc18c7 (diff)
downloadsamba-63a6acdfa84253ce602b2a6050093752d69f4771.tar.gz
samba-63a6acdfa84253ce602b2a6050093752d69f4771.tar.bz2
samba-63a6acdfa84253ce602b2a6050093752d69f4771.zip
Use pidl for _srvsvc_NetFileEnum.
Guenther (This used to be commit 6c6700ed7148b73b2ce52fc00020c7e253a577d3)
-rw-r--r--source3/rpc_server/srv_srvsvc_nt.c169
1 files changed, 71 insertions, 98 deletions
diff --git a/source3/rpc_server/srv_srvsvc_nt.c b/source3/rpc_server/srv_srvsvc_nt.c
index 56d3159949..053f57ec36 100644
--- a/source3/rpc_server/srv_srvsvc_nt.c
+++ b/source3/rpc_server/srv_srvsvc_nt.c
@@ -34,8 +34,7 @@ extern const struct generic_mapping file_generic_mapping;
struct file_enum_count {
TALLOC_CTX *ctx;
const char *username;
- int count;
- FILE_INFO_3 *info;
+ struct srvsvc_NetFileCtr3 *ctr3;
};
struct sess_file_count {
@@ -52,8 +51,8 @@ static int pipe_enum_fn( struct db_record *rec, void *p)
{
struct pipe_open_rec prec;
struct file_enum_count *fenum = (struct file_enum_count *)p;
- FILE_INFO_3 *f;
- int i = fenum->count;
+ struct srvsvc_NetFileInfo3 *f;
+ int i = fenum->ctr3->count;
char *fullpath = NULL;
const char *username;
@@ -78,21 +77,22 @@ static int pipe_enum_fn( struct db_record *rec, void *p)
return 1;
}
- f = TALLOC_REALLOC_ARRAY( fenum->ctx, fenum->info, FILE_INFO_3, i+1 );
+ f = TALLOC_REALLOC_ARRAY(fenum->ctx, fenum->ctr3->array,
+ struct srvsvc_NetFileInfo3, i+1);
if ( !f ) {
DEBUG(0,("conn_enum_fn: realloc failed for %d items\n", i+1));
return 1;
}
- fenum->info = f;
+ fenum->ctr3->array = f;
- init_srv_file_info3(
- &fenum->info[i],
- (uint32)((procid_to_pid(&prec.pid)<<16) & prec.pnum),
- (FILE_READ_DATA|FILE_WRITE_DATA),
- 0, username, fullpath);
+ init_srvsvc_NetFileInfo3(&fenum->ctr3->array[i],
+ (uint32_t)((procid_to_pid(&prec.pid)<<16) & prec.pnum),
+ (FILE_READ_DATA|FILE_WRITE_DATA),
+ 0,
+ fullpath,
+ username);
- TALLOC_FREE(fullpath);
- fenum->count++;
+ fenum->ctr3->count++;
return 0;
}
@@ -100,16 +100,16 @@ static int pipe_enum_fn( struct db_record *rec, void *p)
/*******************************************************************
********************************************************************/
-static WERROR net_enum_pipes( TALLOC_CTX *ctx, const char *username,
- FILE_INFO_3 **info,
- uint32 *count, uint32 resume )
+static WERROR net_enum_pipes(TALLOC_CTX *ctx,
+ const char *username,
+ struct srvsvc_NetFileCtr3 **ctr3,
+ uint32_t resume )
{
struct file_enum_count fenum;
fenum.ctx = ctx;
fenum.username = username;
- fenum.count = *count;
- fenum.info = *info;
+ fenum.ctr3 = *ctr3;
if (connections_traverse(pipe_enum_fn, &fenum) == -1) {
DEBUG(0,("net_enum_pipes: traverse of connections.tdb "
@@ -117,8 +117,7 @@ static WERROR net_enum_pipes( TALLOC_CTX *ctx, const char *username,
return WERR_NOMEM;
}
- *info = fenum.info;
- *count = fenum.count;
+ *ctr3 = fenum.ctr3;
return WERR_OK;
}
@@ -133,8 +132,8 @@ static void enum_file_fn( const struct share_mode_entry *e,
struct file_enum_count *fenum =
(struct file_enum_count *)private_data;
- FILE_INFO_3 *f;
- int i = fenum->count;
+ struct srvsvc_NetFileInfo3 *f;
+ int i = fenum->ctr3->count;
files_struct fsp;
struct byte_range_lock *brl;
int num_locks = 0;
@@ -155,12 +154,13 @@ static void enum_file_fn( const struct share_mode_entry *e,
return;
}
- f = TALLOC_REALLOC_ARRAY( fenum->ctx, fenum->info, FILE_INFO_3, i+1 );
+ f = TALLOC_REALLOC_ARRAY(fenum->ctx, fenum->ctr3->array,
+ struct srvsvc_NetFileInfo3, i+1);
if ( !f ) {
DEBUG(0,("conn_enum_fn: realloc failed for %d items\n", i+1));
return;
}
- fenum->info = f;
+ fenum->ctr3->array = f;
/* need to count the number of locks on a file */
@@ -186,36 +186,33 @@ static void enum_file_fn( const struct share_mode_entry *e,
/* mask out create (what ever that is) */
permissions = e->share_access & (FILE_READ_DATA|FILE_WRITE_DATA);
- /* now fill in the FILE_INFO_3 struct */
- init_srv_file_info3( &fenum->info[i],
- e->share_file_id,
- permissions,
- num_locks,
- username,
- fullpath );
-
- TALLOC_FREE(fullpath);
- fenum->count++;
+ /* now fill in the srvsvc_NetFileInfo3 struct */
+ init_srvsvc_NetFileInfo3(&fenum->ctr3->array[i],
+ e->share_file_id,
+ permissions,
+ num_locks,
+ username,
+ fullpath);
+ fenum->ctr3->count++;
}
/*******************************************************************
********************************************************************/
-static WERROR net_enum_files( TALLOC_CTX *ctx, const char *username,
- FILE_INFO_3 **info,
- uint32 *count, uint32 resume )
+static WERROR net_enum_files(TALLOC_CTX *ctx,
+ const char *username,
+ struct srvsvc_NetFileCtr3 **ctr3,
+ uint32_t resume)
{
struct file_enum_count f_enum_cnt;
f_enum_cnt.ctx = ctx;
f_enum_cnt.username = username;
- f_enum_cnt.count = *count;
- f_enum_cnt.info = *info;
+ f_enum_cnt.ctr3 = *ctr3;
share_mode_forall( enum_file_fn, (void *)&f_enum_cnt );
- *info = f_enum_cnt.info;
- *count = f_enum_cnt.count;
+ *ctr3 = f_enum_cnt.ctr3;
return WERR_OK;
}
@@ -1057,70 +1054,52 @@ static void init_srv_r_net_conn_enum(SRV_R_NET_CONN_ENUM *r_n,
}
/*******************************************************************
- makes a SRV_R_NET_FILE_ENUM structure.
-********************************************************************/
+ _srvsvc_NetFileEnum
+*******************************************************************/
-static WERROR net_file_enum_3( const char *username, SRV_R_NET_FILE_ENUM *r,
- uint32 resume_hnd )
+WERROR _srvsvc_NetFileEnum(pipes_struct *p,
+ struct srvsvc_NetFileEnum *r)
{
- TALLOC_CTX *ctx = talloc_tos();
- SRV_FILE_INFO_CTR *ctr = &r->ctr;
+ TALLOC_CTX *ctx = NULL;
+ struct srvsvc_NetFileCtr3 *ctr3;
+ uint32_t resume_hnd = 0;
+ WERROR werr;
+
+ switch (r->in.info_ctr->level) {
+ case 3:
+ break;
+ default:
+ return WERR_UNKNOWN_LEVEL;
+ }
+
+ ctx = talloc_tos();
+ ctr3 = r->in.info_ctr->ctr.ctr3;
+ if (!ctr3) {
+ goto done;
+ }
/* TODO -- Windows enumerates
(b) active pipes
(c) open directories and files */
- r->status = net_enum_files( ctx, username, &ctr->file.info3,
- &ctr->num_entries, resume_hnd );
- if ( !W_ERROR_IS_OK(r->status))
+ werr = net_enum_files(ctx, r->in.user, &ctr3, resume_hnd);
+ if (!W_ERROR_IS_OK(werr)) {
goto done;
+ }
- r->status = net_enum_pipes( ctx, username, &ctr->file.info3,
- &ctr->num_entries, resume_hnd );
- if ( !W_ERROR_IS_OK(r->status))
+ werr = net_enum_pipes(ctx, r->in.user, &ctr3, resume_hnd);
+ if (!W_ERROR_IS_OK(werr)) {
goto done;
+ }
- r->level = ctr->level = 3;
- r->total_entries = ctr->num_entries;
- /* ctr->num_entries = r->total_entries - resume_hnd; */
- ctr->num_entries2 = ctr->num_entries;
- ctr->ptr_file_info = 1;
-
- r->status = WERR_OK;
-
-done:
- if ( ctr->num_entries > 0 )
- ctr->ptr_entries = 1;
-
- init_enum_hnd(&r->enum_hnd, 0);
-
- return r->status;
-}
-
-/*******************************************************************
-*******************************************************************/
-
-WERROR _srv_net_file_enum(pipes_struct *p, SRV_Q_NET_FILE_ENUM *q_u, SRV_R_NET_FILE_ENUM *r_u)
-{
- const char *username = NULL;
-
- switch ( q_u->level ) {
- case 3:
- if (q_u->username) {
- username = rpcstr_pull_unistr2_talloc(
- p->mem_ctx, q_u->username);
- if (!username) {
- return WERR_NOMEM;
- }
- }
+ *r->out.totalentries = ctr3->count;
+ r->out.info_ctr->ctr.ctr3->array = ctr3->array;
+ r->out.info_ctr->ctr.ctr3->count = ctr3->count;
- return net_file_enum_3(username, r_u,
- get_enum_hnd(&q_u->enum_hnd));
- default:
- return WERR_UNKNOWN_LEVEL;
- }
+ werr = WERR_OK;
- return WERR_OK;
+ done:
+ return werr;
}
/*******************************************************************
@@ -2505,12 +2484,6 @@ WERROR _srvsvc_NetConnEnum(pipes_struct *p, struct srvsvc_NetConnEnum *r)
return WERR_NOT_SUPPORTED;
}
-WERROR _srvsvc_NetFileEnum(pipes_struct *p, struct srvsvc_NetFileEnum *r)
-{
- p->rng_fault_state = True;
- return WERR_NOT_SUPPORTED;
-}
-
WERROR _srvsvc_NetFileGetInfo(pipes_struct *p, struct srvsvc_NetFileGetInfo *r)
{
p->rng_fault_state = True;