Line data Source code
1 : /*
2 : Unix SMB/CIFS implementation.
3 : client trans2 calls
4 : Copyright (C) James J Myers 2003 <myersjj@samba.org>
5 :
6 : This program is free software; you can redistribute it and/or modify
7 : it under the terms of the GNU General Public License as published by
8 : the Free Software Foundation; either version 3 of the License, or
9 : (at your option) any later version.
10 :
11 : This program is distributed in the hope that it will be useful,
12 : but WITHOUT ANY WARRANTY; without even the implied warranty of
13 : MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 : GNU General Public License for more details.
15 :
16 : You should have received a copy of the GNU General Public License
17 : along with this program. If not, see <http://www.gnu.org/licenses/>.
18 : */
19 :
20 : #include "includes.h"
21 : #include "libcli/raw/libcliraw.h"
22 : #include "libcli/libcli.h"
23 :
24 : /****************************************************************************
25 : send a qpathinfo call
26 : ****************************************************************************/
27 164 : NTSTATUS smbcli_qpathinfo(struct smbcli_tree *tree, const char *fname,
28 : time_t *c_time, time_t *a_time, time_t *m_time,
29 : size_t *size, uint16_t *mode)
30 : {
31 : union smb_fileinfo parms;
32 : TALLOC_CTX *mem_ctx;
33 : NTSTATUS status;
34 :
35 164 : mem_ctx = talloc_init("smbcli_qpathinfo");
36 164 : if (!mem_ctx) return NT_STATUS_NO_MEMORY;
37 :
38 164 : parms.standard.level = RAW_FILEINFO_STANDARD;
39 164 : parms.standard.in.file.path = fname;
40 :
41 164 : status = smb_raw_pathinfo(tree, mem_ctx, &parms);
42 164 : talloc_free(mem_ctx);
43 164 : if (!NT_STATUS_IS_OK(status))
44 32 : return status;
45 :
46 132 : if (c_time) {
47 132 : *c_time = parms.standard.out.create_time;
48 : }
49 132 : if (a_time) {
50 132 : *a_time = parms.standard.out.access_time;
51 : }
52 132 : if (m_time) {
53 132 : *m_time = parms.standard.out.write_time;
54 : }
55 132 : if (size) {
56 132 : *size = parms.standard.out.size;
57 : }
58 132 : if (mode) {
59 130 : *mode = parms.standard.out.attrib;
60 : }
61 :
62 132 : return status;
63 : }
64 :
65 : /****************************************************************************
66 : send a qpathinfo call with the SMB_QUERY_FILE_ALL_INFO info level
67 : ****************************************************************************/
68 6 : NTSTATUS smbcli_qpathinfo2(struct smbcli_tree *tree, const char *fname,
69 : time_t *c_time, time_t *a_time, time_t *m_time,
70 : time_t *w_time, size_t *size, uint16_t *mode,
71 : ino_t *ino)
72 : {
73 : union smb_fileinfo parms;
74 : TALLOC_CTX *mem_ctx;
75 : NTSTATUS status;
76 :
77 6 : mem_ctx = talloc_init("smbcli_qfilename");
78 6 : if (!mem_ctx) return NT_STATUS_NO_MEMORY;
79 :
80 6 : parms.all_info.level = RAW_FILEINFO_ALL_INFO;
81 6 : parms.all_info.in.file.path = fname;
82 :
83 6 : status = smb_raw_pathinfo(tree, mem_ctx, &parms);
84 6 : talloc_free(mem_ctx);
85 6 : if (!NT_STATUS_IS_OK(status))
86 0 : return status;
87 :
88 6 : if (c_time) {
89 6 : *c_time = nt_time_to_unix(parms.all_info.out.create_time);
90 : }
91 6 : if (a_time) {
92 6 : *a_time = nt_time_to_unix(parms.all_info.out.access_time);
93 : }
94 6 : if (m_time) {
95 6 : *m_time = nt_time_to_unix(parms.all_info.out.change_time);
96 : }
97 6 : if (w_time) {
98 6 : *w_time = nt_time_to_unix(parms.all_info.out.write_time);
99 : }
100 6 : if (size) {
101 6 : *size = parms.all_info.out.size;
102 : }
103 6 : if (mode) {
104 0 : *mode = parms.all_info.out.attrib;
105 : }
106 :
107 6 : return status;
108 : }
109 :
110 :
111 : /****************************************************************************
112 : send a qfileinfo QUERY_FILE_NAME_INFO call
113 : ****************************************************************************/
114 2 : NTSTATUS smbcli_qfilename(struct smbcli_tree *tree, int fnum, const char **name)
115 : {
116 : union smb_fileinfo parms;
117 : TALLOC_CTX *mem_ctx;
118 : NTSTATUS status;
119 :
120 2 : mem_ctx = talloc_init("smbcli_qfilename");
121 2 : if (!mem_ctx) return NT_STATUS_NO_MEMORY;
122 :
123 2 : parms.name_info.level = RAW_FILEINFO_NAME_INFO;
124 2 : parms.name_info.in.file.fnum = fnum;
125 :
126 2 : status = smb_raw_fileinfo(tree, mem_ctx, &parms);
127 2 : if (!NT_STATUS_IS_OK(status)) {
128 0 : talloc_free(mem_ctx);
129 0 : *name = NULL;
130 0 : return status;
131 : }
132 :
133 2 : *name = strdup(parms.name_info.out.fname.s);
134 :
135 2 : talloc_free(mem_ctx);
136 :
137 2 : return status;
138 : }
139 :
140 :
141 : /****************************************************************************
142 : send a qfileinfo call
143 : ****************************************************************************/
144 10 : NTSTATUS smbcli_qfileinfo(struct smbcli_tree *tree, int fnum,
145 : uint16_t *mode, size_t *size,
146 : time_t *c_time, time_t *a_time, time_t *m_time,
147 : time_t *w_time, ino_t *ino)
148 : {
149 : union smb_fileinfo parms;
150 : TALLOC_CTX *mem_ctx;
151 : NTSTATUS status;
152 :
153 10 : mem_ctx = talloc_init("smbcli_qfileinfo");
154 10 : if (!mem_ctx)
155 0 : return NT_STATUS_NO_MEMORY;
156 :
157 10 : parms.all_info.level = RAW_FILEINFO_ALL_INFO;
158 10 : parms.all_info.in.file.fnum = fnum;
159 :
160 10 : status = smb_raw_fileinfo(tree, mem_ctx, &parms);
161 10 : talloc_free(mem_ctx);
162 10 : if (!NT_STATUS_IS_OK(status)) {
163 2 : return status;
164 : }
165 :
166 8 : if (c_time) {
167 2 : *c_time = nt_time_to_unix(parms.all_info.out.create_time);
168 : }
169 8 : if (a_time) {
170 2 : *a_time = nt_time_to_unix(parms.all_info.out.access_time);
171 : }
172 8 : if (m_time) {
173 2 : *m_time = nt_time_to_unix(parms.all_info.out.change_time);
174 : }
175 8 : if (w_time) {
176 0 : *w_time = nt_time_to_unix(parms.all_info.out.write_time);
177 : }
178 8 : if (mode) {
179 6 : *mode = parms.all_info.out.attrib;
180 : }
181 8 : if (size) {
182 8 : *size = (size_t)parms.all_info.out.size;
183 : }
184 8 : if (ino) {
185 0 : *ino = 0;
186 : }
187 :
188 8 : return status;
189 : }
190 :
191 :
192 : /****************************************************************************
193 : send a qpathinfo SMB_QUERY_FILE_ALT_NAME_INFO call
194 : ****************************************************************************/
195 22 : NTSTATUS smbcli_qpathinfo_alt_name(struct smbcli_tree *tree, const char *fname,
196 : const char **alt_name)
197 : {
198 : union smb_fileinfo parms;
199 : TALLOC_CTX *mem_ctx;
200 : NTSTATUS status;
201 :
202 22 : parms.alt_name_info.level = RAW_FILEINFO_ALT_NAME_INFO;
203 22 : parms.alt_name_info.in.file.path = fname;
204 :
205 22 : mem_ctx = talloc_init("smbcli_qpathinfo_alt_name");
206 22 : if (!mem_ctx) return NT_STATUS_NO_MEMORY;
207 :
208 22 : status = smb_raw_pathinfo(tree, mem_ctx, &parms);
209 22 : if (!NT_STATUS_IS_OK(status)) {
210 0 : talloc_free(mem_ctx);
211 0 : *alt_name = NULL;
212 0 : return smbcli_nt_error(tree);
213 : }
214 :
215 22 : if (!parms.alt_name_info.out.fname.s) {
216 0 : *alt_name = strdup("");
217 : } else {
218 22 : *alt_name = strdup(parms.alt_name_info.out.fname.s);
219 : }
220 :
221 22 : talloc_free(mem_ctx);
222 :
223 22 : return NT_STATUS_OK;
224 : }
|