static void smb2_ipc_getinfo(struct tevent_req *req, struct smbd_smb2_getinfo_state *state, struct tevent_context *ev, uint8_t in_info_type, uint8_t in_file_info_class) { /* We want to reply to SMB2_GETINFO_FILE with a class of SMB2_FILE_STANDARD_INFO as otherwise a Win7 client issues this request twice (2xroundtrips) if we return NOT_SUPPORTED. NB. We do the same for SMB1 in call_trans2qpipeinfo() */ if (in_info_type == 0x01 && /* SMB2_GETINFO_FILE */ in_file_info_class == 0x05) { /* SMB2_FILE_STANDARD_INFO */ state->out_output_buffer = data_blob_talloc(state, NULL, 24); if (tevent_req_nomem(state->out_output_buffer.data, req)) { return; } memset(state->out_output_buffer.data,0,24); SOFF_T(state->out_output_buffer.data,0,4096LL); SIVAL(state->out_output_buffer.data,16,1); SIVAL(state->out_output_buffer.data,20,1); tevent_req_done(req); } else { tevent_req_nterror(req, NT_STATUS_NOT_SUPPORTED); } }
static BOOL cli_posix_lock_internal(struct cli_state *cli, int fnum, SMB_BIG_UINT offset, SMB_BIG_UINT len, BOOL wait_lock, enum brl_type lock_type) { unsigned int param_len = 4; unsigned int data_len = POSIX_LOCK_DATA_SIZE; uint16 setup = TRANSACT2_SETFILEINFO; char param[4]; unsigned char data[POSIX_LOCK_DATA_SIZE]; char *rparam=NULL, *rdata=NULL; int saved_timeout = cli->timeout; SSVAL(param,0,fnum); SSVAL(param,2,SMB_SET_POSIX_LOCK); switch (lock_type) { case READ_LOCK: SSVAL(data, POSIX_LOCK_TYPE_OFFSET, POSIX_LOCK_TYPE_READ); break; case WRITE_LOCK: SSVAL(data, POSIX_LOCK_TYPE_OFFSET, POSIX_LOCK_TYPE_WRITE); break; case UNLOCK_LOCK: SSVAL(data, POSIX_LOCK_TYPE_OFFSET, POSIX_LOCK_TYPE_UNLOCK); break; default: return False; } if (wait_lock) { SSVAL(data, POSIX_LOCK_FLAGS_OFFSET, POSIX_LOCK_FLAG_WAIT); cli->timeout = 0x7FFFFFFF; } else { SSVAL(data, POSIX_LOCK_FLAGS_OFFSET, POSIX_LOCK_FLAG_NOWAIT); } SIVAL(data, POSIX_LOCK_PID_OFFSET, cli->pid); SOFF_T(data, POSIX_LOCK_START_OFFSET, offset); SOFF_T(data, POSIX_LOCK_LEN_OFFSET, len); if (!cli_send_trans(cli, SMBtrans2, NULL, /* name */ -1, 0, /* fid, flags */ &setup, 1, 0, /* setup, length, max */ param, param_len, 2, /* param, length, max */ (char *)&data, data_len, cli->max_xmit /* data, length, max */ )) { cli->timeout = saved_timeout; return False; } if (!cli_receive_trans(cli, SMBtrans2, &rparam, ¶m_len, &rdata, &data_len)) { cli->timeout = saved_timeout; SAFE_FREE(rdata); SAFE_FREE(rparam); return False; } cli->timeout = saved_timeout; SAFE_FREE(rdata); SAFE_FREE(rparam); return True; }