diff options
| author | Simo Sorce <idra@samba.org> | 2010-07-19 13:48:31 -0400 | 
|---|---|---|
| committer | Simo Sorce <idra@samba.org> | 2010-07-19 13:48:31 -0400 | 
| commit | f9f3358348229b14d368316e327cfd2a4cb48c7c (patch) | |
| tree | 9fb61c2ed61dd1ff93a64fc4498a4ec8d3a0607d /source3/rpc_server/srv_pipe_register.c | |
| parent | 7e4de49bfceed18c81abf93703a61d0a22617a24 (diff) | |
| parent | 630a2eb68af0d523a1bb4451bbaa75d2ba47d252 (diff) | |
| download | samba-f9f3358348229b14d368316e327cfd2a4cb48c7c.tar.gz samba-f9f3358348229b14d368316e327cfd2a4cb48c7c.tar.bz2 samba-f9f3358348229b14d368316e327cfd2a4cb48c7c.zip  | |
Merge branch 'master' of ssh://git.samba.org/data/git/samba
Diffstat (limited to 'source3/rpc_server/srv_pipe_register.c')
| -rw-r--r-- | source3/rpc_server/srv_pipe_register.c | 55 | 
1 files changed, 48 insertions, 7 deletions
diff --git a/source3/rpc_server/srv_pipe_register.c b/source3/rpc_server/srv_pipe_register.c index 757e4fbe72..3753596a2b 100644 --- a/source3/rpc_server/srv_pipe_register.c +++ b/source3/rpc_server/srv_pipe_register.c @@ -31,11 +31,26 @@ struct rpc_table {  	struct ndr_syntax_id rpc_interface;  	const struct api_struct *cmds;  	uint32_t n_cmds; +	bool (*shutdown_fn)(void *private_data); +	void *shutdown_data;  };  static struct rpc_table *rpc_lookup;  static uint32_t rpc_lookup_size; +static struct rpc_table *rpc_srv_get_pipe_by_id(const struct ndr_syntax_id *id) +{ +	uint32_t i; + +	for (i = 0; i < rpc_lookup_size; i++) { +		if (ndr_syntax_id_equal(&rpc_lookup[i].rpc_interface, id)) { +			return &rpc_lookup[i]; +		} +	} + +	return NULL; +} +  bool rpc_srv_pipe_exists_by_id(const struct ndr_syntax_id *id)  {  	uint32_t i; @@ -150,7 +165,8 @@ bool rpc_srv_get_pipe_interface_by_cli_name(const char *cli_name,  NTSTATUS rpc_srv_register(int version, const char *clnt, const char *srv,  			  const struct ndr_interface_table *iface, -			  const struct api_struct *cmds, int size) +			  const struct api_struct *cmds, int size, +			  const struct rpc_srv_callbacks *rpc_srv_cb)  {  	struct rpc_table *rpc_entry; @@ -166,12 +182,10 @@ NTSTATUS rpc_srv_register(int version, const char *clnt, const char *srv,  		return NT_STATUS_OBJECT_TYPE_MISMATCH;  	} -	/* TODO: -	 * -	 * we still need to make sure that don't register the same commands twice!!! -	 * -	 * --metze -	 */ +	/* Don't register the same command twice */ +	if (rpc_srv_pipe_exists_by_id(&iface->syntax_id)) { +		return NT_STATUS_OK; +	}  	/*  	 * We use a temporary variable because this call can fail and @@ -196,5 +210,32 @@ NTSTATUS rpc_srv_register(int version, const char *clnt, const char *srv,  	rpc_entry->cmds = cmds;  	rpc_entry->n_cmds = size; +	if (rpc_srv_cb != NULL) { +		rpc_entry->shutdown_fn = rpc_srv_cb->shutdown; +		rpc_entry->shutdown_data = rpc_srv_cb->private_data; + +		if (rpc_srv_cb->init != NULL && +		    !rpc_srv_cb->init(rpc_srv_cb->private_data)) { +			DEBUG(0, ("rpc_srv_register: Failed to call the %s " +				  "init function!\n", srv)); +			return NT_STATUS_UNSUCCESSFUL; +		} +	} + +	return NT_STATUS_OK; +} + +NTSTATUS rpc_srv_unregister(const struct ndr_interface_table *iface) +{ +	struct rpc_table *rpc_entry = rpc_srv_get_pipe_by_id(&iface->syntax_id); + +	if (rpc_entry != NULL && rpc_entry->shutdown_fn != NULL) { +		if (!rpc_entry->shutdown_fn(rpc_entry->shutdown_data)) { +			DEBUG(0, ("rpc_srv_unregister: Failed to call the %s " +				  "init function!\n", rpc_entry->pipe.srv)); +			return NT_STATUS_UNSUCCESSFUL; +		} +	} +  	return NT_STATUS_OK;  }  | 
