nsswitch: explicitly mark nss_module_register() _PUBLIC_ on FreeBSD
[Samba.git] / source3 / smbd / smb1_utils.c
blob1776c50721c8779bf39ed66c906ec06e3237ee6a
1 /*
2 * Unix SMB/CIFS implementation.
3 * Util functions valid in the SMB1 server
5 * Copyright (C) Volker Lendecke 2019
6 * Copyright by the authors of the functions moved here eventually
8 * This program is free software; you can redistribute it and/or modify
9 * it under the terms of the GNU General Public License as published by
10 * the Free Software Foundation; either version 3 of the License, or
11 * (at your option) any later version.
13 * This program is distributed in the hope that it will be useful,
14 * but WITHOUT ANY WARRANTY; without even the implied warranty of
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 * GNU General Public License for more details.
18 * You should have received a copy of the GNU General Public License
19 * along with this program. If not, see <http://www.gnu.org/licenses/>.
22 #include "includes.h"
23 #include "smb1_utils.h"
24 #include "libcli/security/security.h"
25 #include "lib/util/sys_rw_data.h"
26 #include "smbd/fd_handle.h"
28 /****************************************************************************
29 Special FCB or DOS processing in the case of a sharing violation.
30 Try and find a duplicated file handle.
31 ****************************************************************************/
33 struct files_struct *fcb_or_dos_open(
34 struct smb_request *req,
35 const struct smb_filename *smb_fname,
36 uint32_t access_mask,
37 uint32_t create_options,
38 uint32_t private_flags)
40 struct connection_struct *conn = req->conn;
41 struct file_id id = vfs_file_id_from_sbuf(conn, &smb_fname->st);
42 struct files_struct *fsp = NULL, *new_fsp = NULL;
43 NTSTATUS status;
45 if ((private_flags &
46 (NTCREATEX_FLAG_DENY_DOS|
47 NTCREATEX_FLAG_DENY_FCB))
48 == 0) {
49 return NULL;
52 for(fsp = file_find_di_first(conn->sconn, id, true);
53 fsp != NULL;
54 fsp = file_find_di_next(fsp, true)) {
56 DBG_DEBUG("Checking file %s, fd = %d, vuid = %"PRIu64", "
57 "file_pid = %"PRIu16", "
58 "private_options = 0x%"PRIx32", "
59 "access_mask = 0x%"PRIx32"\n",
60 fsp_str_dbg(fsp),
61 fsp_get_pathref_fd(fsp),
62 fsp->vuid,
63 fsp->file_pid,
64 fh_get_private_options(fsp->fh),
65 fsp->access_mask);
67 if (fsp_get_pathref_fd(fsp) != -1 &&
68 fsp->vuid == req->vuid &&
69 fsp->file_pid == req->smbpid &&
70 (fh_get_private_options(fsp->fh) &
71 (NTCREATEX_FLAG_DENY_DOS |
72 NTCREATEX_FLAG_DENY_FCB)) &&
73 (fsp->access_mask & FILE_WRITE_DATA) &&
74 strequal(fsp->fsp_name->base_name, smb_fname->base_name) &&
75 strequal(fsp->fsp_name->stream_name,
76 smb_fname->stream_name)) {
77 DBG_DEBUG("file match\n");
78 break;
82 if (fsp == NULL) {
83 return NULL;
86 /* quite an insane set of semantics ... */
87 if (is_executable(smb_fname->base_name) &&
88 (fh_get_private_options(fsp->fh) & NTCREATEX_FLAG_DENY_DOS)) {
89 DBG_DEBUG("file fail due to is_executable.\n");
90 return NULL;
93 status = file_new(req, conn, &new_fsp);
94 if (!NT_STATUS_IS_OK(status)) {
95 DBG_DEBUG("file_new failed: %s\n", nt_errstr(status));
96 return NULL;
99 status = dup_file_fsp(
100 req,
101 fsp,
102 access_mask,
103 create_options,
104 new_fsp);
106 if (!NT_STATUS_IS_OK(status)) {
107 DBG_DEBUG("dup_file_fsp failed: %s\n", nt_errstr(status));
108 file_free(req, new_fsp);
109 return NULL;
112 return new_fsp;
115 /****************************************************************************
116 Send a keepalive packet (rfc1002).
117 ****************************************************************************/
119 bool send_keepalive(int client)
121 unsigned char buf[4];
123 buf[0] = NBSSkeepalive;
124 buf[1] = buf[2] = buf[3] = 0;
126 return(write_data(client,(char *)buf,4) == 4);