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