| /* |
| * CDDL HEADER START |
| * |
| * The contents of this file are subject to the terms of the |
| * Common Development and Distribution License (the "License"). |
| * You may not use this file except in compliance with the License. |
| * |
| * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE |
| * or http://www.opensolaris.org/os/licensing. |
| * See the License for the specific language governing permissions |
| * and limitations under the License. |
| * |
| * When distributing Covered Code, include this CDDL HEADER in each |
| * file and include the License file at usr/src/OPENSOLARIS.LICENSE. |
| * If applicable, add the following below this CDDL HEADER, with the |
| * fields enclosed by brackets "[]" replaced with your own identifying |
| * information: Portions Copyright [yyyy] [name of copyright owner] |
| * |
| * CDDL HEADER END |
| */ |
| /* |
| * Copyright 2006 Sun Microsystems, Inc. All rights reserved. |
| * Use is subject to license terms. |
| */ |
| |
| /* Copyright (c) 1984, 1986, 1987, 1988, 1989 AT&T */ |
| /* All Rights Reserved */ |
| |
| |
| #pragma ident "%Z%%M% %I% %E% SMI" /* SVr4.0 1.18 */ |
| |
| # include <sys/types.h> |
| # include <poll.h> |
| # include <stdarg.h> |
| # include <stropts.h> |
| |
| #if !defined(_LP_MSGS_H) |
| # define _LP_MSGS_H |
| |
| /* |
| * THE DISPATCH TABLE DEPENDS ON EACH R_... MESSAGE FOLLOWING |
| * IMMEDIATELY AFTER ITS CORRESPONDING S_... COUNTERPART. |
| * I.E R_... MESSAGE FOR A S_... MESSAGE IS (S_... + 1) |
| */ |
| # define R_BAD_MESSAGE 0 |
| # define S_NEW_QUEUE 1 |
| # define R_NEW_QUEUE 2 |
| # define S_ALLOC_FILES 3 |
| # define R_ALLOC_FILES 4 |
| # define S_PRINT_REQUEST 5 |
| # define R_PRINT_REQUEST 6 |
| # define S_START_CHANGE_REQUEST 7 |
| # define R_START_CHANGE_REQUEST 8 |
| # define S_END_CHANGE_REQUEST 9 |
| # define R_END_CHANGE_REQUEST 10 |
| # define S_CANCEL_REQUEST 11 |
| # define R_CANCEL_REQUEST 12 |
| # define S_INQUIRE_REQUEST 13 |
| # define R_INQUIRE_REQUEST 14 |
| # define S_LOAD_PRINTER 15 |
| # define R_LOAD_PRINTER 16 |
| # define S_UNLOAD_PRINTER 17 |
| # define R_UNLOAD_PRINTER 18 |
| # define S_INQUIRE_PRINTER_STATUS 19 |
| # define R_INQUIRE_PRINTER_STATUS 20 |
| # define S_LOAD_CLASS 21 |
| # define R_LOAD_CLASS 22 |
| # define S_UNLOAD_CLASS 23 |
| # define R_UNLOAD_CLASS 24 |
| # define S_INQUIRE_CLASS 25 |
| # define R_INQUIRE_CLASS 26 |
| # define S_MOUNT 27 |
| # define R_MOUNT 28 |
| # define S_UNMOUNT 29 |
| # define R_UNMOUNT 30 |
| # define S_MOVE_REQUEST 31 |
| # define R_MOVE_REQUEST 32 |
| # define S_MOVE_DEST 33 |
| # define R_MOVE_DEST 34 |
| # define S_ACCEPT_DEST 35 |
| # define R_ACCEPT_DEST 36 |
| # define S_REJECT_DEST 37 |
| # define R_REJECT_DEST 38 |
| # define S_ENABLE_DEST 39 |
| # define R_ENABLE_DEST 40 |
| # define S_DISABLE_DEST 41 |
| # define R_DISABLE_DEST 42 |
| # define S_LOAD_FILTER_TABLE 43 |
| # define R_LOAD_FILTER_TABLE 44 |
| # define S_UNLOAD_FILTER_TABLE 45 |
| # define R_UNLOAD_FILTER_TABLE 46 |
| # define S_LOAD_PRINTWHEEL 47 |
| # define R_LOAD_PRINTWHEEL 48 |
| # define S_UNLOAD_PRINTWHEEL 49 |
| # define R_UNLOAD_PRINTWHEEL 50 |
| # define S_LOAD_USER_FILE 51 |
| # define R_LOAD_USER_FILE 52 |
| # define S_UNLOAD_USER_FILE 53 |
| # define R_UNLOAD_USER_FILE 54 |
| # define S_LOAD_FORM 55 |
| # define R_LOAD_FORM 56 |
| # define S_UNLOAD_FORM 57 |
| # define R_UNLOAD_FORM 58 |
| # define S_GETSTATUS 59 |
| # define R_GETSTATUS 60 |
| # define S_QUIET_ALERT 61 |
| # define R_QUIET_ALERT 62 |
| # define S_SEND_FAULT 63 |
| # define R_SEND_FAULT 64 |
| # define S_SHUTDOWN 65 |
| # define R_SHUTDOWN 66 |
| # define S_GOODBYE 67 |
| # define S_CHILD_DONE 68 |
| |
| /* |
| ** These are for use by the scheduler only |
| */ |
| # define I_GET_TYPE 69 |
| # define I_QUEUE_CHK 70 |
| # define R_CONNECT 71 |
| |
| # define S_GET_STATUS 72 |
| # define R_GET_STATUS 73 |
| # define S_INQUIRE_REQUEST_RANK 74 |
| # define R_INQUIRE_REQUEST_RANK 75 |
| # define S_CANCEL 76 |
| # define R_CANCEL 77 |
| # define S_NEW_CHILD 78 |
| # define R_NEW_CHILD 79 |
| # define S_SEND_JOB 80 |
| # define R_SEND_JOB 81 |
| # define S_JOB_COMPLETED 82 |
| # define R_JOB_COMPLETED 83 |
| # define S_INQUIRE_REMOTE_PRINTER 84 |
| # define R_INQUIRE_REMOTE_PRINTER 20 |
| # define S_CHILD_SYNC 85 |
| # define S_LOAD_SYSTEM 86 |
| # define R_LOAD_SYSTEM 87 |
| # define S_UNLOAD_SYSTEM 88 |
| # define R_UNLOAD_SYSTEM 89 |
| /* new messages */ |
| # define S_CLEAR_FAULT 90 |
| # define R_CLEAR_FAULT 91 |
| # define S_MOUNT_TRAY 92 |
| # define R_MOUNT_TRAY 93 |
| # define S_UNMOUNT_TRAY 94 |
| # define R_UNMOUNT_TRAY 95 |
| # define S_MAX_TRAYS 96 |
| # define R_MAX_TRAYS 97 |
| # define S_PAPER_CHANGED 98 |
| # define R_PAPER_CHANGED 99 |
| # define S_PAPER_ALLOWED 100 |
| # define R_PAPER_ALLOWED 101 |
| # define S_PASS_PEER_CONNECTION 102 |
| # define R_PASS_PEER_CONNECTION 103 |
| /* |
| ** Last available message |
| */ |
| # define LAST_MESSAGE 104 |
| |
| /* |
| ** These are the possible status codes returned by the scheduler |
| */ |
| # define MOK 0 |
| # define MOKMORE 1 |
| # define MOKREMOTE 2 |
| # define MMORERR 3 |
| # define MNODEST 4 |
| # define MERRDEST 5 |
| # define MDENYDEST 6 |
| # define MNOMEDIA 7 |
| # define MDENYMEDIA 8 |
| # define MNOFILTER 9 |
| # define MNOINFO 10 |
| # define MNOMEM 11 |
| # define MNOMOUNT 12 |
| # define MNOOPEN 13 |
| # define MNOPERM 14 |
| # define MNOSTART 15 |
| # define MUNKNOWN 16 |
| # define M2LATE 17 |
| # define MNOSPACE 18 |
| # define MBUSY 19 |
| # define MTRANSMITERR 20 |
| # define MNOMORE 21 |
| # define MGONEREMOTE 22 |
| # define MNOTRAY 23 |
| |
| /* |
| ** Offsets and lengths of the various elements of the message header. |
| ** |
| ** Macro Data Type Size Comment |
| ** |
| ** HEAD_RESYNC 2 bytes (2) * |
| ** HEAD_AUTHCODE short + long (6) * |
| ** |
| ** HEAD_SIZE 4 bytes (4) \ |
| ** HEAD_TYPE 4 bytes (4) > message propper |
| ** HEAD_DATA n bytes (n) / |
| ** |
| ** TAIL_CHKSUM 4 bytes (4) * |
| ** TAIL_ENDSYNC 2 bytes (2) * |
| ** |
| ** Items marked with an asterisk are only used with the 3.2 |
| ** Spooler protocol. |
| */ |
| |
| /* |
| ** 3.2 Protocol Header Information: |
| ** 2-byte message introduction |
| ** 6-byte client authorization data |
| */ |
| #define HEAD_RESYNC (0) |
| #define HEAD_RESYNC_LEN 2 |
| #define HEAD_AUTHCODE (HEAD_RESYNC + HEAD_RESYNC_LEN) |
| #define HEAD_AUTHCODE_LEN (sizeof(short) + sizeof(long)) |
| |
| /* |
| ** 3.2 Protocol Message Information: |
| ** 4-byte message size |
| ** 4-byte message type |
| ** n-byte message data |
| */ |
| #define HEAD_SIZE (HEAD_AUTHCODE + HEAD_AUTHCODE_LEN) |
| #define HEAD_SIZE_LEN 4 |
| #define HEAD_TYPE (HEAD_SIZE + HEAD_SIZE_LEN) |
| #define HEAD_TYPE_LEN 4 |
| #define HEAD_DATA (HEAD_TYPE + HEAD_TYPE_LEN) |
| |
| /* |
| ** 3.2 Protocol Size of non-data header information |
| */ |
| #define HEAD_LEN HEAD_DATA |
| |
| /* |
| ** Equivalents for 4.0 protocol |
| */ |
| #define MESG_SIZE (0) |
| #define MESG_SIZE_LEN 4 |
| #define MESG_TYPE (MESG_SIZE + MESG_SIZE_LEN) |
| #define MESG_TYPE_LEN 4 |
| #define MESG_DATA (MESG_TYPE + MESG_TYPE_LEN) |
| |
| #define MESG_LEN MESG_DATA |
| |
| /* |
| ** 3.2 Protocol Trailer Information: |
| ** 4-byte message check sum |
| ** 2-byte message closing identifier |
| ** |
| ** "N" is the decoded value of buffer[HEAD_SIZE]. This must |
| ** be provided because messages are variable length. |
| */ |
| #define TAIL_ENDSYNC_LEN 2 |
| #define TAIL_ENDSYNC(N) (N - TAIL_ENDSYNC_LEN) |
| #define TAIL_CHKSUM_LEN 4 |
| #define TAIL_CHKSUM(N) (TAIL_ENDSYNC(N) - TAIL_CHKSUM_LEN) |
| |
| /* |
| ** 3.2 Protocol Size of non-data trailer information |
| */ |
| #define TAIL_LEN (TAIL_CHKSUM_LEN + TAIL_ENDSYNC_LEN) |
| |
| /* |
| ** 3.2 Protocol Size of all non-data information |
| ** (This is also the minimum size for 3.2 protocol messages) |
| */ |
| #define CONTROL_LEN (HEAD_LEN + TAIL_LEN) |
| |
| /* |
| ** Size of excess data induced by 3.2 Protocol. |
| ** (This is also the size differance between 3.2 & 4.0 protocols) |
| */ |
| #define EXCESS_3_2_LEN (HEAD_SIZE + TAIL_LEN) |
| /** |
| ** Checksum: |
| **/ |
| #define CALC_CHKSUM(B,SZ,RC) \ |
| if (SZ >= CONTROL_LEN) \ |
| { \ |
| register unsigned char *p = (unsigned char *)B, \ |
| *pend = p + SZ - TAIL_LEN; \ |
| RC = 0; \ |
| while (p < pend) \ |
| RC += *p++; /* let it overflow */ \ |
| } \ |
| else \ |
| return ((errno = EINVAL, -1)) |
| |
| /* |
| ** Largest size permitted for any given message |
| */ |
| # define MSGMAX 2048 |
| |
| /* |
| ** Possible values of the type field of S_QUIET_ALERT |
| */ |
| # define QA_FORM 1 |
| # define QA_PRINTER 2 |
| # define QA_PRINTWHEEL 3 |
| |
| typedef struct strbuf strbuf_t; /* STREAMS buffer */ |
| |
| typedef struct mque |
| { |
| struct mque *next; |
| struct strbuf *dat; |
| } MQUE; |
| |
| /* |
| ** Definition of a message descriptor |
| */ |
| typedef struct |
| { |
| short type; /* type of connection */ |
| int readfd; /* STREAM fd to read from */ |
| int writefd; /* STREAM fd to write to */ |
| int wait; /* number of systems waiting for */ |
| char *file; /* pipe name if type==MD_FIFO */ |
| short state; /* Current state of client */ |
| short admin; /* Non zero if admin */ |
| short event; /* Event returned from poll */ |
| MQUE * mque; /* backlogged message ptr */ |
| uid_t uid; /* Clients UID */ |
| gid_t gid; /* Clients GID */ |
| char * slabel; /* Clients SLABEL */ |
| void (**on_discon)(); /* Clean up functions */ |
| } MESG; |
| |
| # define MDSIZE (sizeof(MESG)) |
| |
| /* |
| ** Possible values of MESG.state |
| */ |
| # define MDS_IDLE 0 |
| |
| # define MDS_32PROTO 320 |
| # define MDS_32CONNECT 321 |
| |
| /* |
| ** Possible values of MESG.type |
| */ |
| # define MD_UNKNOWN 0 /* We don't know just yet */ |
| # define MD_STREAM 1 /* 4.0 STREAMS pipe protocol */ |
| # define MD_BOUND 2 /* 4.0 STREAMS fd protocol */ |
| # define MD_SYS_FIFO 3 /* 3.2 named-pipe protocol */ |
| # define MD_USR_FIFO 4 /* 3.2 named-pipe protocol */ |
| # define MD_MASTER 5 /* MD_STREAM used by lpsched */ |
| # define MD_CHILD 6 /* MD_STREAM to a child process */ |
| |
| /* |
| ** Definition for a FIFO buffer (used |
| ** in read_fifo. |
| */ |
| typedef struct |
| { |
| int full; |
| char save [MSGMAX], |
| *psave, |
| *psave_end; |
| } fifobuffer_t; |
| |
| /* |
| ** Definitions for the rest of the world and lint |
| */ |
| /* |
| ** Server functions in order of usage |
| */ |
| MESG * mcreate ( char * ); |
| int mlisteninit ( MESG * ); |
| MESG * mlisten ( void ); |
| int mlistenadd ( MESG *, short ); |
| int mon_discon ( MESG *, void (*)()); |
| MESG * mlistenreset ( void ); |
| int mdestroy ( MESG * ); |
| |
| /* |
| ** Client functions in order of typical usage |
| */ |
| MESG * mconnect ( char *, int, int ); |
| int mgetm ( MESG *, int, ... ); |
| int mwrite ( MESG *, char * ); |
| int mputm ( MESG *, int, ... ); |
| int mread ( MESG *, char *, int ); |
| short msize ( char * ); |
| short mpeek ( MESG * ); |
| int mdisconnect ( MESG * ); |
| |
| /* |
| ** This may be called to deallocate internal buffers allocated |
| ** by mgetm and mputm. Probably not useful except right before |
| ** a fork(). |
| */ |
| void __mbfree ( void ); |
| |
| /* |
| ** Client functions for pre-4.0 compatability |
| */ |
| int mclose ( void ); |
| int mneeds ( void ); |
| int mopen ( void ); |
| int mrecv ( char *, int ); |
| int msend ( char * ); |
| |
| int Putmsg (MESG *, strbuf_t *, strbuf_t *, int); |
| int Getmsg (MESG *, strbuf_t *, strbuf_t *, int *); |
| int read3_2 (MESG * md, char *msgbuf, int size); |
| int write3_2 (MESG *, char *, int); |
| int read_fifo (int, char *, unsigned int); |
| int write_fifo (int, char *, unsigned int); |
| int ResetFifoBuffer (int); |
| fifobuffer_t *GetFifoBuffer (int); |
| |
| /* |
| ** General purpose message manipulating functions |
| */ |
| char * htos ( char *, unsigned short ); |
| char * ltos ( char *, unsigned long ); |
| unsigned long stol ( char * ); |
| unsigned short stoh ( char * ); |
| int _getmessage ( char *, short, va_list ); |
| int _putmessage ( char *, short, va_list ); |
| int getmessage ( char *, short, ... ); |
| int putmessage ( char *, short, ... ); |
| |
| /* |
| ** This will yield the type of a message |
| */ |
| # define mtype(buffer) (getmessage(buffer, I_GET_TYPE)) |
| |
| /* |
| ** This will yeild the size of a message |
| */ |
| # define msize(buffer) (stoh(buffer)) |
| |
| /* |
| ** Pass this for the request-id argument of S_CANCEL |
| ** to obtain the effect of the 3.2 S_CANCEL_REQUEST. |
| */ |
| # define CURRENT_REQ "current" |
| |
| #endif /* !defined (_LP_MSGS_H) */ |