#include "librpc/rpc/dcesrv_core.h"
#include "librpc/gen_ndr/ndr_srvsvc.h"
#include "librpc/gen_ndr/ndr_srvsvc_scompat.h"
+#include "librpc/gen_ndr/ndr_open_files.h"
#include "../libcli/security/security.h"
#include "../librpc/gen_ndr/ndr_security.h"
#include "../librpc/gen_ndr/open_files.h"
const struct share_mode_entry *e,
void *private_data)
{
- char msg[MSG_SMB_SHARE_MODE_ENTRY_SIZE];
struct enum_file_close_state *state =
(struct enum_file_close_state *)private_data;
uint32_t fid = (((uint32_t)(procid_to_pid(&e->pid))<<16) | e->share_file_id);
+ struct oplock_break_message msg = {
+ .id = id,
+ .share_file_id = e->share_file_id,
+ };
+ enum ndr_err_code ndr_err;
+ uint8_t msgbuf[33];
+ DATA_BLOB blob = {.data = msgbuf, .length = sizeof(msgbuf)};
+ NTSTATUS status;
if (fid != state->r->in.fid) {
return 0; /* Not this file. */
DBG_DEBUG("request to close file %s, %s\n", d->servicepath,
share_mode_str(talloc_tos(), 0, &id, e));
- share_mode_entry_to_message(msg, &id, e);
+ ndr_err = ndr_push_struct_into_fixed_blob(
+ &blob,
+ &msg,
+ (ndr_push_flags_fn_t)ndr_push_oplock_break_message);
+ if (!NDR_ERR_CODE_IS_SUCCESS(ndr_err)) {
+ DBG_WARNING("ndr_push_oplock_break_message failed: %s\n",
+ ndr_errstr(ndr_err));
+ status = ndr_map_error2ntstatus(ndr_err);
+ } else {
+ status = messaging_send(state->msg_ctx,
+ e->pid,
+ MSG_SMB_CLOSE_FILE,
+ &blob);
+ }
- state->r->out.result = ntstatus_to_werror(
- messaging_send_buf(state->msg_ctx,
- e->pid, MSG_SMB_CLOSE_FILE,
- (uint8_t *)msg, sizeof(msg)));
+ if (!NT_STATUS_IS_OK(status)) {
+ state->r->out.result = ntstatus_to_werror(status);
+ }
return 0;
}
#include "transfer_file.h"
#include "auth.h"
#include "messages.h"
-#include "../librpc/gen_ndr/open_files.h"
+#include "librpc/gen_ndr/ndr_open_files.h"
#include "lib/util/tevent_ntstatus.h"
#include "source3/smbd/dir.h"
struct server_id server_id,
DATA_BLOB *data)
{
+ struct oplock_break_message msg;
+ enum ndr_err_code ndr_err;
files_struct *fsp = NULL;
- struct file_id id;
- struct share_mode_entry e;
struct smbd_server_connection *sconn =
talloc_get_type_abort(private_data,
struct smbd_server_connection);
- message_to_share_mode_entry(&id, &e, (char *)data->data);
-
- if(DEBUGLVL(10)) {
- char *sm_str = share_mode_str(NULL, 0, &id, &e);
- if (!sm_str) {
- smb_panic("talloc failed");
- }
- DEBUG(10,("msg_close_file: got request to close share mode "
- "entry %s\n", sm_str));
- TALLOC_FREE(sm_str);
+ ndr_err = ndr_pull_struct_blob_all_noalloc(
+ data,
+ &msg,
+ (ndr_pull_flags_fn_t)ndr_pull_oplock_break_message);
+ if (!NDR_ERR_CODE_IS_SUCCESS(ndr_err)) {
+ DBG_DEBUG("ndr_pull_oplock_break_message failed: %s\n",
+ ndr_errstr(ndr_err));
+ return;
}
- fsp = file_find_dif(sconn, id, e.share_file_id);
+ fsp = file_find_dif(sconn, msg.id, msg.share_file_id);
if (!fsp) {
DEBUG(10,("msg_close_file: failed to find file.\n"));
return;