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 2006 Sun Microsystems, Inc. All rights reserved. 23 * Use is subject to license terms. 24 */ 25 26/* Copyright (c) 1984, 1986, 1987, 1988, 1989 AT&T */ 27/* All Rights Reserved */ 28 29 30#pragma ident "%Z%%M% %I% %E% SMI" 31 32# include <sys/types.h> 33# include <poll.h> 34# include <stdarg.h> 35# include <stropts.h> 36 37#if !defined(_LP_MSGS_H) 38# define _LP_MSGS_H 39 40/* 41 * THE DISPATCH TABLE DEPENDS ON EACH R_... MESSAGE FOLLOWING 42 * IMMEDIATELY AFTER ITS CORRESPONDING S_... COUNTERPART. 43 * I.E R_... MESSAGE FOR A S_... MESSAGE IS (S_... + 1) 44 */ 45# define R_BAD_MESSAGE 0 46/* # define S_NEW_QUEUE 1 DEFUNCT */ 47/* # define R_NEW_QUEUE 2 DEFUNCT */ 48# define S_ALLOC_FILES 3 49# define R_ALLOC_FILES 4 50# define S_PRINT_REQUEST 5 51# define R_PRINT_REQUEST 6 52# define S_START_CHANGE_REQUEST 7 53# define R_START_CHANGE_REQUEST 8 54# define S_END_CHANGE_REQUEST 9 55# define R_END_CHANGE_REQUEST 10 56# define S_CANCEL_REQUEST 11 57# define R_CANCEL_REQUEST 12 58/* # define S_INQUIRE_REQUEST 13 DEFUNCT */ 59/* # define R_INQUIRE_REQUEST 14 DEFUNCT */ 60# define S_LOAD_PRINTER 15 61# define R_LOAD_PRINTER 16 62# define S_UNLOAD_PRINTER 17 63# define R_UNLOAD_PRINTER 18 64# define S_INQUIRE_PRINTER_STATUS 19 65# define R_INQUIRE_PRINTER_STATUS 20 66# define S_LOAD_CLASS 21 67# define R_LOAD_CLASS 22 68# define S_UNLOAD_CLASS 23 69# define R_UNLOAD_CLASS 24 70# define S_INQUIRE_CLASS 25 71# define R_INQUIRE_CLASS 26 72# define S_MOUNT 27 73# define R_MOUNT 28 74# define S_UNMOUNT 29 75# define R_UNMOUNT 30 76# define S_MOVE_REQUEST 31 77# define R_MOVE_REQUEST 32 78# define S_MOVE_DEST 33 79# define R_MOVE_DEST 34 80# define S_ACCEPT_DEST 35 81# define R_ACCEPT_DEST 36 82# define S_REJECT_DEST 37 83# define R_REJECT_DEST 38 84# define S_ENABLE_DEST 39 85# define R_ENABLE_DEST 40 86# define S_DISABLE_DEST 41 87# define R_DISABLE_DEST 42 88# define S_LOAD_FILTER_TABLE 43 89# define R_LOAD_FILTER_TABLE 44 90# define S_UNLOAD_FILTER_TABLE 45 91# define R_UNLOAD_FILTER_TABLE 46 92# define S_LOAD_PRINTWHEEL 47 93# define R_LOAD_PRINTWHEEL 48 94# define S_UNLOAD_PRINTWHEEL 49 95# define R_UNLOAD_PRINTWHEEL 50 96# define S_LOAD_USER_FILE 51 97# define R_LOAD_USER_FILE 52 98# define S_UNLOAD_USER_FILE 53 99# define R_UNLOAD_USER_FILE 54 100# define S_LOAD_FORM 55 101# define R_LOAD_FORM 56 102# define S_UNLOAD_FORM 57 103# define R_UNLOAD_FORM 58 104/* # define S_GETSTATUS 59 DEFUNCT */ 105/* # define R_GETSTATUS 60 DEFUNCT */ 106# define S_QUIET_ALERT 61 107# define R_QUIET_ALERT 62 108# define S_SEND_FAULT 63 109# define R_SEND_FAULT 64 110# define S_SHUTDOWN 65 111# define R_SHUTDOWN 66 112# define S_GOODBYE 67 113# define S_CHILD_DONE 68 114 115/* 116** These are for use by the scheduler only 117*/ 118# define I_GET_TYPE 69 119# define I_QUEUE_CHK 70 120/* # define R_CONNECT 71 DEFUNCT */ 121 122/* # define S_GET_STATUS 72 DEFUNCT */ 123/* # define R_GET_STATUS 73 DEFUNCT */ 124# define S_INQUIRE_REQUEST_RANK 74 125# define R_INQUIRE_REQUEST_RANK 75 126# define S_CANCEL 76 127# define R_CANCEL 77 128/* # define S_NEW_CHILD 78 DEFUNCT */ 129/* # define R_NEW_CHILD 79 DEFUNCT */ 130/* # define S_SEND_JOB 80 DEFUNCT */ 131/* # define R_SEND_JOB 81 DEFUNCT */ 132/* # define S_JOB_COMPLETED 82 DEFUNCT */ 133/* # define R_JOB_COMPLETED 83 DEFUNCT */ 134/* # define S_INQUIRE_REMOTE_PRINTER 84 DEFUNCT */ 135/* # define R_INQUIRE_REMOTE_PRINTER 20 DEFUNCT */ 136/* # define S_CHILD_SYNC 85 DEFUNCT */ 137/* # define S_LOAD_SYSTEM 86 DEFUNCT */ 138/* # define R_LOAD_SYSTEM 87 DEFUNCT */ 139/* # define S_UNLOAD_SYSTEM 88 DEFUNCT */ 140/* # define R_UNLOAD_SYSTEM 89 DEFUNCT */ 141/* new messages */ 142# define S_CLEAR_FAULT 90 143# define R_CLEAR_FAULT 91 144# define S_MOUNT_TRAY 92 145# define R_MOUNT_TRAY 93 146# define S_UNMOUNT_TRAY 94 147# define R_UNMOUNT_TRAY 95 148# define S_MAX_TRAYS 96 149# define R_MAX_TRAYS 97 150# define S_PAPER_CHANGED 98 151# define R_PAPER_CHANGED 99 152# define S_PAPER_ALLOWED 100 153# define R_PAPER_ALLOWED 101 154# define S_PASS_PEER_CONNECTION 102 155# define R_PASS_PEER_CONNECTION 103 156/* 157** Last available message 158*/ 159# define LAST_MESSAGE 104 160 161/* 162** These are the possible status codes returned by the scheduler 163*/ 164# define MOK 0 165# define MOKMORE 1 166# define MOKREMOTE 2 167# define MMORERR 3 168# define MNODEST 4 169# define MERRDEST 5 170# define MDENYDEST 6 171# define MNOMEDIA 7 172# define MDENYMEDIA 8 173# define MNOFILTER 9 174# define MNOINFO 10 175# define MNOMEM 11 176# define MNOMOUNT 12 177# define MNOOPEN 13 178# define MNOPERM 14 179# define MNOSTART 15 180# define MUNKNOWN 16 181# define M2LATE 17 182# define MNOSPACE 18 183# define MBUSY 19 184# define MTRANSMITERR 20 185# define MNOMORE 21 186# define MGONEREMOTE 22 187# define MNOTRAY 23 188 189/* 190** Offsets and lengths of the various elements of the message header. 191** 192** Macro Data Type Size Comment 193** 194** HEAD_RESYNC 2 bytes (2) * 195** HEAD_AUTHCODE short + long (6) * 196** 197** HEAD_SIZE 4 bytes (4) \ 198** HEAD_TYPE 4 bytes (4) > message propper 199** HEAD_DATA n bytes (n) / 200** 201** TAIL_CHKSUM 4 bytes (4) * 202** TAIL_ENDSYNC 2 bytes (2) * 203** 204** Items marked with an asterisk are only used with the 3.2 205** Spooler protocol. 206*/ 207 208/* 209** 3.2 Protocol Header Information: 210** 2-byte message introduction 211** 6-byte client authorization data 212*/ 213#define HEAD_RESYNC (0) 214#define HEAD_RESYNC_LEN 2 215#define HEAD_AUTHCODE (HEAD_RESYNC + HEAD_RESYNC_LEN) 216#define HEAD_AUTHCODE_LEN (sizeof(short) + sizeof(long)) 217 218/* 219** 3.2 Protocol Message Information: 220** 4-byte message size 221** 4-byte message type 222** n-byte message data 223*/ 224#define HEAD_SIZE (HEAD_AUTHCODE + HEAD_AUTHCODE_LEN) 225#define HEAD_SIZE_LEN 4 226#define HEAD_TYPE (HEAD_SIZE + HEAD_SIZE_LEN) 227#define HEAD_TYPE_LEN 4 228#define HEAD_DATA (HEAD_TYPE + HEAD_TYPE_LEN) 229 230/* 231** 3.2 Protocol Size of non-data header information 232*/ 233#define HEAD_LEN HEAD_DATA 234 235/* 236** Equivalents for 4.0 protocol 237*/ 238#define MESG_SIZE (0) 239#define MESG_SIZE_LEN 4 240#define MESG_TYPE (MESG_SIZE + MESG_SIZE_LEN) 241#define MESG_TYPE_LEN 4 242#define MESG_DATA (MESG_TYPE + MESG_TYPE_LEN) 243 244#define MESG_LEN MESG_DATA 245 246/* 247** 3.2 Protocol Trailer Information: 248** 4-byte message check sum 249** 2-byte message closing identifier 250** 251** "N" is the decoded value of buffer[HEAD_SIZE]. This must 252** be provided because messages are variable length. 253*/ 254#define TAIL_ENDSYNC_LEN 2 255#define TAIL_ENDSYNC(N) (N - TAIL_ENDSYNC_LEN) 256#define TAIL_CHKSUM_LEN 4 257#define TAIL_CHKSUM(N) (TAIL_ENDSYNC(N) - TAIL_CHKSUM_LEN) 258 259/* 260** 3.2 Protocol Size of non-data trailer information 261*/ 262#define TAIL_LEN (TAIL_CHKSUM_LEN + TAIL_ENDSYNC_LEN) 263 264/* 265** 3.2 Protocol Size of all non-data information 266** (This is also the minimum size for 3.2 protocol messages) 267*/ 268#define CONTROL_LEN (HEAD_LEN + TAIL_LEN) 269 270/* 271** Size of excess data induced by 3.2 Protocol. 272** (This is also the size differance between 3.2 & 4.0 protocols) 273*/ 274#define EXCESS_3_2_LEN (HEAD_SIZE + TAIL_LEN) 275/** 276 ** Checksum: 277 **/ 278#define CALC_CHKSUM(B,SZ,RC) \ 279if (SZ >= CONTROL_LEN) \ 280{ \ 281 register unsigned char *p = (unsigned char *)B, \ 282 *pend = p + SZ - TAIL_LEN; \ 283 RC = 0; \ 284 while (p < pend) \ 285 RC += *p++; /* let it overflow */ \ 286} \ 287else \ 288 return ((errno = EINVAL, -1)) 289 290/* 291** Largest size permitted for any given message 292*/ 293# define MSGMAX 2048 294 295/* 296** Possible values of the type field of S_QUIET_ALERT 297*/ 298# define QA_FORM 1 299# define QA_PRINTER 2 300# define QA_PRINTWHEEL 3 301 302typedef struct strbuf strbuf_t; /* STREAMS buffer */ 303 304typedef struct mque 305{ 306 struct mque *next; 307 struct strbuf *dat; 308} MQUE; 309 310/* 311** Definition of a message descriptor 312*/ 313typedef struct 314{ 315 short type; /* type of connection */ 316 int readfd; /* STREAM fd to read from */ 317 int writefd; /* STREAM fd to write to */ 318 int wait; /* number of systems waiting for */ 319 char *file; /* pipe name if type==MD_FIFO */ 320 short state; /* Current state of client */ 321 short admin; /* Non zero if admin */ 322 short event; /* Event returned from poll */ 323 MQUE * mque; /* backlogged message ptr */ 324 uid_t uid; /* Clients UID */ 325 gid_t gid; /* Clients GID */ 326 char * slabel; /* Clients SLABEL */ 327 void (**on_discon)(); /* Clean up functions */ 328} MESG; 329 330# define MDSIZE (sizeof(MESG)) 331 332/* 333** Possible values of MESG.state 334*/ 335# define MDS_IDLE 0 336 337# define MDS_32PROTO 320 338# define MDS_32CONNECT 321 339 340/* 341** Possible values of MESG.type 342*/ 343# define MD_UNKNOWN 0 /* We don't know just yet */ 344# define MD_STREAM 1 /* 4.0 STREAMS pipe protocol */ 345# define MD_BOUND 2 /* 4.0 STREAMS fd protocol */ 346# define MD_SYS_FIFO 3 /* 3.2 named-pipe protocol */ 347# define MD_USR_FIFO 4 /* 3.2 named-pipe protocol */ 348# define MD_MASTER 5 /* MD_STREAM used by lpsched */ 349# define MD_CHILD 6 /* MD_STREAM to a child process */ 350 351/* 352** Definition for a FIFO buffer (used 353** in read_fifo. 354*/ 355typedef struct 356{ 357 int full; 358 char save [MSGMAX], 359 *psave, 360 *psave_end; 361} fifobuffer_t; 362 363/* 364** Definitions for the rest of the world and lint 365*/ 366/* 367** Server functions in order of usage 368*/ 369MESG * mcreate ( char * ); 370int mlisteninit ( MESG * ); 371MESG * mlisten ( void ); 372int mlistenadd ( MESG *, short ); 373int mon_discon ( MESG *, void (*)()); 374MESG * mlistenreset ( void ); 375int mdestroy ( MESG * ); 376 377/* 378** Client functions in order of typical usage 379*/ 380MESG * mconnect ( char *, int, int ); 381int mgetm ( MESG *, int, ... ); 382int mwrite ( MESG *, char * ); 383int mputm ( MESG *, int, ... ); 384int mread ( MESG *, char *, int ); 385short msize ( char * ); 386short mpeek ( MESG * ); 387int mdisconnect ( MESG * ); 388 389/* 390** This may be called to deallocate internal buffers allocated 391** by mgetm and mputm. Probably not useful except right before 392** a fork(). 393*/ 394void __mbfree ( void ); 395 396/* 397** Client functions for pre-4.0 compatability 398*/ 399int mclose ( void ); 400int mneeds ( void ); 401int mopen ( void ); 402int mrecv ( char *, int ); 403int msend ( char * ); 404 405int Putmsg (MESG *, strbuf_t *, strbuf_t *, int); 406int Getmsg (MESG *, strbuf_t *, strbuf_t *, int *); 407int read3_2 (MESG * md, char *msgbuf, int size); 408int write3_2 (MESG *, char *, int); 409int read_fifo (int, char *, unsigned int); 410int write_fifo (int, char *, unsigned int); 411int ResetFifoBuffer (int); 412fifobuffer_t *GetFifoBuffer (int); 413 414/* 415** General purpose message manipulating functions 416*/ 417char * htos ( char *, unsigned short ); 418char * ltos ( char *, unsigned long ); 419unsigned long stol ( char * ); 420unsigned short stoh ( char * ); 421int _getmessage ( char *, short, va_list ); 422int _putmessage ( char *, short, va_list ); 423int getmessage ( char *, short, ... ); 424int putmessage ( char *, short, ... ); 425 426/* 427** This will yield the type of a message 428*/ 429# define mtype(buffer) (getmessage(buffer, I_GET_TYPE)) 430 431/* 432** This will yeild the size of a message 433*/ 434# define msize(buffer) (stoh(buffer)) 435 436/* 437** Pass this for the request-id argument of S_CANCEL 438** to obtain the effect of the 3.2 S_CANCEL_REQUEST. 439*/ 440# define CURRENT_REQ "current" 441 442#endif /* !defined (_LP_MSGS_H) */ 443