1 /*
2  * CDDL HEADER START
3  *
4  * The contents of this file are subject to the terms of the
5  * Common Development and Distribution License (the "License").
6  * You may not use this file except in compliance with the License.
7  *
8  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
9  * or http://www.opensolaris.org/os/licensing.
10  * See the License for the specific language governing permissions
11  * and limitations under the License.
12  *
13  * When distributing Covered Code, include this CDDL HEADER in each
14  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
15  * If applicable, add the following below this CDDL HEADER, with the
16  * fields enclosed by brackets "[]" replaced with your own identifying
17  * information: Portions Copyright [yyyy] [name of copyright owner]
18  *
19  * CDDL HEADER END
20  */
21 /*
22  * Copyright 2009 Sun Microsystems, Inc.  All rights reserved.
23  * Use is subject to license terms.
24  */
25 
26 /*
27  * SMB print interface.
28  */
29 
30 #include <smbsrv/smb_kproto.h>
31 
32 
33 /*
34  * smb_com_open_print_file
35  *
36  * This message is sent to create a new printer file which will be deleted
37  * once it has been closed and printed.
38  *
39  * Client Request                     Description
40  * ================================== =================================
41  *
42  * UCHAR WordCount;                   Count of parameter words = 2
43  * USHORT SetupLength;                Length of printer setup data
44  * USHORT Mode;                       0 = Text mode (DOS expands TABs)
45  *                                     1 = Graphics mode
46  * USHORT ByteCount;                  Count of data bytes;  min = 2
47  * UCHAR BufferFormat;                0x04
48  * STRING IdentifierString[];         Identifier string
49  *
50  * Tid in the SMB header must refer to a printer resource type.
51  *
52  * SetupLength is the number of bytes in the first part of the resulting
53  * print spool file which contains printer-specific control strings.
54  *
55  * Mode can have the following values:
56  *
57  *      0     Text mode.  The server may optionally
58  *            expand tabs to a series of spaces.
59  *      1     Graphics mode.  No conversion of data
60  *            should be done by the server.
61  *
62  * IdentifierString can be used by the server to provide some sort of per-
63  * client identifying component to the print file.
64  *
65  * Server Response                    Description
66  * ================================== =================================
67  *
68  * UCHAR WordCount;                   Count of parameter words = 1
69  * USHORT Fid;                        File handle
70  * USHORT ByteCount;                  Count of data bytes = 0
71  *
72  * Fid is the returned handle which may be used by subsequent write and
73  * close operations.  When the file is finally closed, it will be sent to
74  * the spooler and printed.
75  *
76  * 4.5.1.1   Errors
77  *
78  * ERRDOS/ERRnoaccess
79  * ERRDOS/ERRnofids
80  * ERRSRV/ERRinvdevice
81  * ERRSRV/ERRbaduid
82  * ERRSRV/ERRqfull
83  * ERRSRV/ERRqtoobig
84  */
85 smb_sdrc_t
86 smb_pre_open_print_file(smb_request_t *sr)
87 {
88 	DTRACE_SMB_1(op__OpenPrintFile__start, smb_request_t *, sr);
89 	return (SDRC_SUCCESS);
90 }
91 
92 void
93 smb_post_open_print_file(smb_request_t *sr)
94 {
95 	DTRACE_SMB_1(op__OpenPrintFile__done, smb_request_t *, sr);
96 }
97 
98 smb_sdrc_t /*ARGSUSED*/
99 smb_com_open_print_file(smb_request_t *sr)
100 {
101 	return (SDRC_NOT_IMPLEMENTED);
102 }
103 
104 
105 /*
106  * smb_com_close_print_file
107  *
108  *
109  * This message invalidates the specified file handle and queues the file
110  * for printing.
111  *
112  *   Client Request                     Description
113  *   ================================== =================================
114  *
115  *   UCHAR WordCount;                   Count of parameter words = 1
116  *   USHORT Fid;                        File handle
117  *   USHORT ByteCount;                  Count of data bytes = 0
118  *
119  * Fid refers to a file previously created with SMB_COM_OPEN_PRINT_FILE.
120  * On successful completion of this request, the file is queued for
121  * printing by the server.
122  *
123  *   Server Response                    Description
124  *   ================================== =================================
125  *
126  *   UCHAR WordCount;                   Count of parameter words = 0
127  *   USHORT ByteCount;                  Count of data bytes = 0
128  *
129  * Servers which negotiate dialects of LANMAN1.0 and newer allow all the
130  * other types of Fid closing requests to invalidate the Fid and begin
131  * spooling.
132  */
133 smb_sdrc_t
134 smb_pre_close_print_file(smb_request_t *sr)
135 {
136 	DTRACE_SMB_1(op__ClosePrintFile__start, smb_request_t *, sr);
137 	return (SDRC_SUCCESS);
138 }
139 
140 void
141 smb_post_close_print_file(smb_request_t *sr)
142 {
143 	DTRACE_SMB_1(op__ClosePrintFile__done, smb_request_t *, sr);
144 }
145 
146 smb_sdrc_t /*ARGSUSED*/
147 smb_com_close_print_file(smb_request_t *sr)
148 {
149 	return (SDRC_NOT_IMPLEMENTED);
150 }
151 
152 
153 /*
154  * smb_com_get_print_queue
155  *
156  * This message obtains a list of the elements currently in the print queue
157  * on the server.
158  *
159  *   Client Request                     Description
160  *   ================================== =================================
161  *
162  *   UCHAR WordCount;                   Count of parameter words = 2
163  *   USHORT MaxCount;                   Max number of entries to return
164  *   USHORT StartIndex;                 First queue entry to return
165  *   USHORT ByteCount;                  Count of data bytes = 0
166  *
167  * StartIndex specifies the first entry in the queue to return.
168  *
169  * MaxCount specifies the maximum number of entries to return, this may be
170  * a positive or negative number.  A positive number requests a forward
171  * search, a negative number indicates a backward search.
172  *
173  *   Server Response                    Description
174  *   ================================== =================================
175  *
176  *   UCHAR WordCount;                   Count of parameter words = 2
177  *   USHORT Count;                      Number of entries returned
178  *   USHORT RestartIndex;               Index of entry after last
179  *                                       returned
180  *   USHORT ByteCount;                  Count of data bytes;  min = 3
181  *   UCHAR BufferFormat;                0x01 -- Data block
182  *   USHORT DataLength;                 Length of data
183  *   UCHAR Data[];                      Queue elements
184  *
185  * Count indicates how many entries were actually returned.  RestartIndex
186  * is the index of the entry following the last entry returned; it may be
187  * used as the StartIndex in a subsequent request to resume the queue
188  * listing.
189  *
190  * The format of each returned queue element is:
191  *
192  *   Queue Element Member             Description
193  *   ================================ ===================================
194  *
195  *   SMB_DATE FileDate;               Date file was queued
196  *   SMB_TIME FileTime;               Time file was queued
197  *   UCHAR Status;                    Entry status.  One of:
198  *                                     01 = held or stopped
199  *                                     02 = printing
200  *                                     03 = awaiting print
201  *                                     04 = in intercept
202  *                                     05 = file had error
203  *                                     06 = printer error
204  *                                     07-FF = reserved
205  *   USHORT SpoolFileNumber;          Assigned by the spooler
206  *   ULONG SpoolFileSize;             Number of bytes in spool file
207  *   UCHAR Reserved;
208  *   UCHAR SpoolFileName[16];         Client which created the spool file
209  *
210  * SMB_COM_GET_PRINT_QUEUE will return less than the requested number of
211  * elements only when the top or end of the queue is encountered.
212  *
213  * Support for this SMB is server optional.  In particular, no current
214  * Microsoft client software issues this request.
215  *
216  * 4.5.2.1   Errors
217  *
218  * ERRHRD/ERRnotready
219  * ERRHRD/ERRerror
220  * ERRSRV/ERRbaduid
221  */
222 smb_sdrc_t
223 smb_pre_get_print_queue(smb_request_t *sr)
224 {
225 	DTRACE_SMB_1(op__GetPrintQueue__start, smb_request_t *, sr);
226 	return (SDRC_SUCCESS);
227 }
228 
229 void
230 smb_post_get_print_queue(smb_request_t *sr)
231 {
232 	DTRACE_SMB_1(op__GetPrintQueue__done, smb_request_t *, sr);
233 }
234 
235 smb_sdrc_t
236 smb_com_get_print_queue(smb_request_t *sr)
237 {
238 	unsigned short max_count, start_ix;
239 
240 	if (smbsr_decode_vwv(sr, "ww", &max_count, &start_ix) != 0)
241 		return (SDRC_ERROR);
242 
243 	if (smbsr_encode_result(sr, 2, 3, "bwwwbw", 2, 0, 0, 3, 1, 0))
244 		return (SDRC_ERROR);
245 
246 	return (SDRC_SUCCESS);
247 }
248 
249 
250 /*
251  * smb_com_write_print_file
252  *
253  * This message is sent to write bytes into a print spool file.
254  *
255  * Client Request                     Description
256  * ================================== =================================
257  *
258  * UCHAR WordCount;                   Count of parameter words = 1
259  * USHORT Fid;                        File handle
260  * USHORT ByteCount;                  Count of data bytes;  min = 4
261  * UCHAR BufferFormat;                0x01 -- Data block
262  * USHORT DataLength;                 Length of data
263  * UCHAR Data[];                      Data
264  *
265  * Fid indicates the print spool file to be written, it must refer to a
266  * print spool file.
267  *
268  * ByteCount specifies the number of bytes to be written, and must be less
269  * than MaxBufferSize for the Tid specified.
270  *
271  * Data contains the bytes to append to the print spool file.  The first
272  * SetupLength bytes in the resulting print spool file contain printer
273  * setup data.  SetupLength is specified in the SMB_COM_OPEN_PRINT_FILE SMB
274  * request.
275  *
276  * Server Response                    Description
277  * ================================== =================================
278  *
279  * UCHAR WordCount;                   Count of parameter words = 0
280  * USHORT ByteCount;                  Count of data bytes = 0
281  *
282  * Servers which negotiate a protocol dialect of LANMAN1.0 or later also
283  * support the application of normal write requests to print spool files.
284  *
285  */
286 smb_sdrc_t
287 smb_pre_write_print_file(smb_request_t *sr)
288 {
289 	DTRACE_SMB_1(op__WritePrintFile__start, smb_request_t *, sr);
290 	return (SDRC_SUCCESS);
291 }
292 
293 void
294 smb_post_write_print_file(smb_request_t *sr)
295 {
296 	DTRACE_SMB_1(op__WritePrintFile__done, smb_request_t *, sr);
297 }
298 
299 smb_sdrc_t /*ARGSUSED*/
300 smb_com_write_print_file(smb_request_t *sr)
301 {
302 	return (SDRC_NOT_IMPLEMENTED);
303 }
304