Home | History | Annotate | Line # | Download | only in rpc.pcnfsd
      1 /*	$NetBSD: pcnfsd.x,v 1.7 2018/01/23 21:27:20 sevan Exp $	*/
      2 
      3 /* The maximum number of bytes in a user name argument */
      4 const IDENTLEN = 32;
      5 /*  The maximum number of bytes in a password argument  */
      6 const PASSWORDLEN = 64;
      7 /*  The maximum number of bytes in a print client name argument  */
      8 const CLIENTLEN = 64;
      9 /*  The maximum number of bytes in a printer name argument  */
     10 const PRINTERNAMELEN = 64;
     11 /*  The maximum number of bytes in a print user name argument  */
     12 const USERNAMELEN = 64;
     13 /*  The maximum number of bytes in a print spool file name argument  */
     14 const SPOOLNAMELEN = 64;
     15 /*  The maximum number of bytes in a print options argument  */
     16 const OPTIONSLEN = 64;
     17 /*  The maximum number of bytes in a print spool directory path  */
     18 const SPOOLDIRLEN = 255;
     19 /*   The maximum number of secondary GIDs returned by a V2 AUTH  */
     20 const EXTRAGIDLEN = 16;
     21 /*   The  maximum number of bytes in a home directory spec  */
     22 const HOMEDIRLEN = 255;
     23 /*   The maximum number of bytes in a misc. comments string */
     24 const COMMENTLEN = 255;
     25 /*   The maximum number of bytes in a print job id */
     26 const PRINTJOBIDLEN = 255;
     27 /*   The maximum number of printers returned by a LIST operation */
     28 const PRLISTMAX = 32;
     29 /*   The maximum number of print jobs returned by a QUEUE operation */
     30 const PRQUEUEMAX = 128;
     31 /*   The maximum number of entries in the facilities list */
     32 const FACILITIESMAX = 32;
     33 /*   The maximum length of an operator message */
     34 const MESSAGELEN = 512;
     35 
     36 
     37 
     38 typedef string ident<IDENTLEN>;
     39 /*
     40 ** The type ident is used for passing an encoded user name for
     41 ** authentication. The server should decode the string by replacing each
     42 ** octet with the value formed by performing an exclusive-or of the octet
     43 ** value with the value 0x5b and and'ing the result with 0x7f.
     44 */
     45 
     46 typedef string message<MESSAGELEN>;
     47 /*
     48 ** The type message is used for passing an alert message to the
     49 ** system operator on the server. The text may include newlines.
     50 */
     51 
     52 typedef string password<PASSWORDLEN>;
     53 /*
     54 ** The type password is used for passing an encode password for
     55 ** authentication.  The server should decode the password as described
     56 ** above.
     57 */
     58 
     59 typedef string client<CLIENTLEN>;
     60 /*
     61 ** The type client is used for passing the hostname of a client for
     62 ** printing. The server may use this name in constructing the spool
     63 ** directory name.
     64 */
     65 
     66 typedef string printername<PRINTERNAMELEN>;
     67 /*
     68 ** The type printername is used for passing the name of a printer on which
     69 ** the client wishes to print.
     70 */
     71 
     72 typedef string username<USERNAMELEN>;
     73 /*
     74 ** The type username is used for passing the user name for a print job.
     75 ** The server may use this in any way it chooses: it may attempt to change
     76 ** the effective identity with which it is running to username or may
     77 ** simply arrange for the text to be printed on the banner page.
     78 */
     79 
     80 typedef string comment<COMMENTLEN>;
     81 /*
     82 ** The type comment is used to pass an uninterpreted text string which
     83 ** may be used by displayed to a human user or used for custom
     84 ** extensions to the PCNFSD service. If you elect to extend PCNFSD
     85 ** service in this way, please do so in a way which will avoid
     86 ** problems if your client attempts to interoperate with a server
     87 ** which does not support your extension. One way to do this is to
     88 ** use the
     89 */
     90 
     91 typedef string spoolname<SPOOLNAMELEN>;
     92 /*
     93 ** The type spoolname is used for passing the name of a print spool file
     94 ** (a simple filename not a pathname) within the spool directory.
     95 */
     96 
     97 typedef string printjobid<PRINTJOBIDLEN>;
     98 /*
     99 ** The type printjobid is used for passing the id of a print job.
    100 */
    101 
    102 typedef string homedir<OPTIONSLEN>;
    103 /*
    104 ** The type homedir is used to return the home directory for the user.
    105 ** If present, it should be in the form "hostname:path", where hostname
    106 ** and path are in a suitable form for communicating with the mount server.
    107 */
    108 
    109 typedef string options<OPTIONSLEN>;
    110 /*
    111 ** The type options is used for passing implementation-specific print
    112 ** control information.  The option string is a set of printable ASCII
    113 ** characters.  The first character should be ignored by the server; it is
    114 ** reserved for client use. The second character specifies the type of
    115 ** data in the print file.  The following types are defined (an
    116 ** implementation may define additional values):
    117 **
    118 **  p - PostScript data. The client will ensure that a valid
    119 **      PostScript header is included.
    120 **  d - Diablo 630 data.
    121 **  x - Generic printable ASCII text. The client will have filtered
    122 **      out all non-printable characters other than CR, LF, TAB,
    123 **      BS and VT.
    124 **  r - Raw print data. The client performs no filtering.
    125 **  u - User-defined. Reserved for custom extensions. A vanilla
    126 **      pcnfsd server will treat this as equivalent to "r"
    127 **
    128 ** If diablo data (type 'd') is specified, a formatting specification
    129 ** string will be appended. This has the form:
    130 ** 	ppnnnbbb
    131 **         pp
    132 ** Pitch - 10, 12 or 15.
    133 **           nnn
    134 ** The ``normal'' font to be used - encoded as follows:
    135 **             Courier                    crn
    136 **             Courier-Bold               crb
    137 **             Courier-Oblique            con
    138 **             Courier-BoldObliqu         cob
    139 **             Helvetica                  hrn
    140 **             Helvetica-Bold             hrb
    141 **             Helvetica-Oblique          hon
    142 **             Helvetica-BoldOblique      hob
    143 **             Times-Roman                trn
    144 **             Times-Bold                 trb
    145 **             Times-Italic               ton
    146 **             Times-BoldItalic           tob
    147 **              bbb
    148 ** The ``bold'' font to be used - encoded in the same way.  For example,
    149 ** the string ``nd10hrbcob'' specifies that the print data is in Diablo
    150 ** 630 format, it should be printed at 10 pitch, ``normal'' text should be
    151 ** printed in Helvetica-Bold, and ``bold'' text should be printed in
    152 ** Courier-BoldOblique.
    153 */
    154 
    155 enum arstat {
    156         AUTH_RES_OK = 0,
    157         AUTH_RES_FAKE = 1,
    158         AUTH_RES_FAIL = 2
    159 };
    160 /*
    161 ** The type arstat is returned by PCNFSD_AUTH. A value of AUTH_RES_OK
    162 ** indicates that the server was able to verify the ident and password
    163 ** successfully.AUTH_RES_FAIL is returned if a verification failure
    164 ** occurred. The value AUTH_RES_FAKE may be used if the server wishes to
    165 ** indicate that the verification failed, but that the server has
    166 ** synthesised acceptable values for uid and gid which the client may use
    167 ** if it wishes.
    168 */
    169 
    170 enum alrstat {
    171         ALERT_RES_OK = 0,
    172         ALERT_RES_FAIL = 1
    173 };
    174 /*
    175 ** The type alrstat is returned by PCNFSD_ALERT. A value of ALERT_RES_OK
    176 ** indicates that the server was able to notify the system operator
    177 ** successfully. ALERT_RES_FAIL is returned if a failure occurred
    178 */
    179 enum pirstat {
    180         PI_RES_OK = 0,
    181         PI_RES_NO_SUCH_PRINTER = 1,
    182         PI_RES_FAIL = 2
    183 };
    184 /*
    185 ** The type pirstat is returned by a number of print operations. PI_RES_OK
    186 ** indicates that the operation was performed successfully. PI_RES_FAIL
    187 ** indicates that the printer name was valid, but the operation could
    188 ** not be performed. PI_RES_NO_SUCH_PRINTER indicates that the printer
    189 ** name was not recognised.
    190 */
    191 
    192 enum pcrstat {
    193         PC_RES_OK = 0,
    194         PC_RES_NO_SUCH_PRINTER = 1,
    195         PC_RES_NO_SUCH_JOB = 2,
    196         PC_RES_NOT_OWNER = 3,
    197         PC_RES_FAIL = 4
    198 };
    199 /*
    200 ** The type pcrstat is returned by a CANCEL, REQUEUE, HOLD, or RELEASE
    201 ** print operation.
    202 ** PC_RES_OK indicates that the operation was performed successfully.
    203 ** PC_RES_NO_SUCH_PRINTER indicates that the printer name was not recognised.
    204 ** PC_RES_NO_SUCH_JOB means that the job does not exist, or is not
    205 ** associated with the specified printer.
    206 ** PC_RES_NOT_OWNER means that the user does not have permission to
    207 ** manipulate the job.
    208 ** PC_RES_FAIL means that the job could not be manipulated for an unknown
    209 ** reason.
    210 */
    211 
    212 
    213 enum psrstat {
    214         PS_RES_OK = 0,
    215         PS_RES_ALREADY = 1,
    216         PS_RES_NULL = 2,
    217         PS_RES_NO_FILE = 3,
    218         PS_RES_FAIL = 4
    219 };
    220 /*
    221 ** The type psrstat is returned by PCNFSD_PR_START. A value of PS_RES_OK
    222 ** indicates that the server has started printing the job. It is possible
    223 ** that the reply from a PCNFSD_PR_START call may be lost, in which case
    224 ** the client will repeat the call. If the spool file is still in
    225 ** existence, the server will return PS_RES_ALREADY indicating that it has
    226 ** already started printing. If the file cannot be found, PS_RES_NO_FILE
    227 ** is returned.  PS_RES_NULL indicates that the spool file was empty,
    228 ** while PS_RES_FAIL denotes a general failure.  PI_RES_FAIL is returned
    229 ** if spool directory could not be created. The value
    230 ** PI_RES_NO_SUCH_PRINTER indicates that the printer name was not
    231 ** recognised.
    232 */
    233 
    234 enum mapreq {
    235         MAP_REQ_UID = 0,
    236         MAP_REQ_GID = 1,
    237         MAP_REQ_UNAME = 2,
    238         MAP_REQ_GNAME = 3
    239 };
    240 /*
    241 ** The type mapreq identifies the type of a mapping request.
    242 ** MAP_REQ_UID requests that the server treat the value in the
    243 ** id field as a uid and return the corresponding username in name.
    244 ** MAP_REQ_GID requests that the server treat the value in the
    245 ** id field as a gid and return the corresponding groupname in name.
    246 ** MAP_REQ_UNAME requests that the server treat the value in the
    247 ** name field as a username and return the corresponding uid in id.
    248 ** MAP_REQ_GNAME requests that the server treat the value in the
    249 ** name field as a groupname and return the corresponding gid in id.
    250 */
    251 
    252 enum maprstat {
    253         MAP_RES_OK = 0,
    254         MAP_RES_UNKNOWN = 1,
    255         MAP_RES_DENIED = 2
    256 };
    257 /*
    258 ** The type maprstat indicates the success or failure of
    259 ** an individual mapping request.
    260 */
    261 
    262 /*
    263 **********************************************************
    264 ** Version 1 of the PCNFSD protocol.
    265 **********************************************************
    266 */
    267 struct auth_args {
    268         ident           id;
    269         password        pw;
    270 };
    271 struct auth_results {
    272         arstat          stat;
    273         unsigned int    uid;
    274         unsigned int    gid;
    275 };
    276 
    277 struct pr_init_args {
    278         client          system;
    279         printername     pn;
    280 };
    281 struct pr_init_results {
    282         pirstat         stat;
    283         spoolname       dir;
    284 };
    285 
    286 struct pr_start_args {
    287         client          system;
    288         printername     pn;
    289         username        user;
    290         spoolname       file;
    291         options         opts;
    292 };
    293 struct pr_start_results {
    294         psrstat         stat;
    295 };
    296 
    297 
    298 /*
    299 **********************************************************
    300 ** Version 2 of the PCNFSD protocol.
    301 **********************************************************
    302 */
    303 
    304 struct v2_info_args {
    305         comment         vers;
    306         comment         cm;
    307 };
    308 
    309 struct v2_info_results {
    310         comment         vers;
    311         comment         cm;
    312 	int             facilities<FACILITIESMAX>;
    313 };
    314 
    315 struct v2_pr_init_args {
    316         client          system;
    317         printername     pn;
    318         comment         cm;
    319 };
    320 struct v2_pr_init_results {
    321         pirstat         stat;
    322         spoolname       dir;
    323         comment         cm;
    324 };
    325 
    326 struct v2_pr_start_args {
    327         client          system;
    328         printername     pn;
    329         username        user;
    330         spoolname       file;
    331         options         opts;
    332 	int             copies;
    333         comment         cm;
    334 };
    335 struct v2_pr_start_results {
    336         psrstat         stat;
    337         printjobid      id;
    338         comment         cm;
    339 };
    340 
    341 
    342 
    343 typedef struct pr_list_item *pr_list;
    344 
    345 struct pr_list_item {
    346         printername    pn;
    347         printername    device;
    348         client         remhost; /* empty if local */
    349         comment        cm;
    350         pr_list        pr_next;
    351 };
    352 
    353 struct v2_pr_list_results {
    354         comment        cm;
    355         pr_list        printers;
    356 };
    357 
    358 struct v2_pr_queue_args {
    359         printername     pn;
    360         client          system;
    361         username        user;
    362         bool            just_mine;
    363         comment         cm;
    364 };
    365 
    366 typedef struct pr_queue_item *pr_queue;
    367 
    368 struct pr_queue_item {
    369         int            position;
    370         printjobid     id;
    371         comment        size;
    372         comment        status;
    373         client         system;
    374         username       user;
    375         spoolname      file;
    376         comment        cm;
    377         pr_queue       pr_next;
    378 };
    379 
    380 struct v2_pr_queue_results {
    381         pirstat        stat;
    382         comment        cm;
    383         bool           just_yours;
    384         int            qlen;
    385         int            qshown;
    386         pr_queue       jobs;
    387 };
    388 
    389 
    390 struct v2_pr_cancel_args {
    391         printername     pn;
    392         client          system;
    393         username        user;
    394         printjobid      id;
    395         comment         cm;
    396 };
    397 struct v2_pr_cancel_results {
    398         pcrstat        stat;
    399         comment        cm;
    400 };
    401 
    402 
    403 struct v2_pr_status_args {
    404         printername     pn;
    405         comment         cm;
    406 };
    407 struct v2_pr_status_results {
    408         pirstat        stat;
    409         bool           avail;
    410         bool           printing;
    411 	int            qlen;
    412         bool           needs_operator;
    413 	comment        status;
    414         comment        cm;
    415 };
    416 
    417 struct v2_pr_admin_args {
    418         client          system;
    419         username        user;
    420         printername     pn;
    421         comment         cm;
    422 };
    423 struct v2_pr_admin_results {
    424         pirstat         stat;
    425         comment         cm;
    426 };
    427 
    428 struct v2_pr_requeue_args {
    429         printername     pn;
    430         client          system;
    431         username        user;
    432         printjobid      id;
    433 	int             qpos;
    434         comment         cm;
    435 };
    436 
    437 struct v2_pr_requeue_results {
    438         pcrstat        stat;
    439         comment        cm;
    440 };
    441 
    442 struct v2_pr_hold_args {
    443         printername     pn;
    444         client          system;
    445         username        user;
    446         printjobid      id;
    447         comment         cm;
    448 };
    449 struct v2_pr_hold_results {
    450         pcrstat        stat;
    451         comment        cm;
    452 };
    453 
    454 struct v2_pr_release_args {
    455         printername     pn;
    456         client          system;
    457         username        user;
    458         printjobid      id;
    459         comment         cm;
    460 };
    461 struct v2_pr_release_results {
    462         pcrstat        stat;
    463         comment        cm;
    464 };
    465 
    466 
    467 typedef struct mapreq_arg_item *mapreq_arg;
    468 
    469 struct mapreq_arg_item {
    470 	mapreq           req;
    471         int              id;
    472         username         name;
    473         mapreq_arg       mapreq_next;
    474 };
    475 
    476 typedef struct mapreq_res_item *mapreq_res;
    477 
    478 struct mapreq_res_item {
    479 	mapreq           req;
    480 	maprstat         stat;
    481         int              id;
    482         username         name;
    483         mapreq_res       mapreq_next;
    484 };
    485 
    486 struct v2_mapid_args {
    487         comment         cm;
    488         mapreq_arg      req_list;
    489 };
    490 
    491 
    492 struct v2_mapid_results {
    493         comment         cm;
    494         mapreq_res      res_list;
    495 };
    496 
    497 struct v2_auth_args {
    498         client          system;
    499         ident           id;
    500         password        pw;
    501         comment         cm;
    502 };
    503 struct v2_auth_results {
    504         arstat          stat;
    505         unsigned int    uid;
    506         unsigned int    gid;
    507         unsigned int    gids<EXTRAGIDLEN>;
    508         homedir         home;
    509         int             def_umask;
    510         comment         cm;
    511 };
    512 
    513 struct v2_alert_args {
    514         client          system;
    515         printername     pn;
    516         username        user;
    517         message         msg;
    518 };
    519 struct v2_alert_results {
    520         alrstat          stat;
    521         comment         cm;
    522 };
    523 
    524 
    525 /*
    526 **********************************************************
    527 ** Protocol description for the PCNFSD program
    528 **********************************************************
    529 */
    530 /*
    531 ** Version 1 of the PCNFSD protocol.
    532 **
    533 ** -- PCNFSD_NULL() = 0
    534 **	Null procedure - standard for all RPC programs.
    535 **
    536 ** -- PCNFSD_AUTH() = 1
    537 **	Perform user authentication - map username, password into uid, gid.
    538 **
    539 ** -- PCNFSD_PR_INIT() = 2
    540 **	Prepare for remote printing: identify exporting spool directory.
    541 **
    542 ** -- PCNFSD_PR_START() = 3
    543 **	Submit a spooled print job for printing: the print data is
    544 **	in a file created in the spool directory.
    545 **
    546 ** Version 2 of the -- PCNFSD protocol.
    547 **
    548 ** -- PCNFSD2_NULL() = 0
    549 **	Null procedure - standard for all RPC programs.
    550 **
    551 ** -- PCNFSD2_INFO() = 1
    552 **	Determine which services are supported by this implementation
    553 **	of PCNFSD.
    554 **
    555 ** -- PCNFSD2_PR_INIT() = 2
    556 **	 Prepare for remote printing: identify exporting spool directory.
    557 **
    558 ** -- PCNFSD2_PR_START() = 3
    559 **	Submit a spooled print job for printing: the print data is
    560 **      in a file created in the spool directory.
    561 **
    562 ** -- PCNFSD2_PR_LIST() = 4
    563 **	List all printers known on the server.
    564 **
    565 ** -- PCNFSD2_PR_QUEUE() = 5
    566 **	List all or part of the queued jobs for a printer.
    567 **
    568 ** -- PCNFSD2_PR_STATUS() = 6
    569 **	Determine the status of a printer.
    570 **
    571 ** -- PCNFSD2_PR_CANCEL() = 7
    572 **	Cancel a print job.
    573 **
    574 ** -- PCNFSD2_PR_ADMIN() = 8
    575 **	Perform an implementation-dependent printer administration
    576 **	operation.
    577 **
    578 ** -- PCNFSD2_PR_REQUEUE() = 9
    579 **	Change the queue position of a previously-submitted print job.
    580 **
    581 ** -- PCNFSD2_PR_HOLD() = 10
    582 **	Place a "hold" on a previously-submitted print job. The job
    583 **	will remain in the queue, but will not be printed.
    584 **
    585 ** -- PCNFSD2_PR_RELEASE() = 11
    586 **	Release the "hold" on a previously-held print job.
    587 **
    588 ** -- PCNFSD2_MAPID() = 12
    589 **	Perform one or more translations between user and group
    590 **	names and IDs.
    591 **
    592 ** -- PCNFSD2_AUTH() = 13
    593 **	Perform user authentication - map username, password into uid, gid;
    594 **	may also return secondary gids, home directory, umask.
    595 **
    596 ** -- PCNFSD2_ALERT() = 14
    597 **	Send a message to the system operator.
    598 */
    599 program PCNFSDPROG {
    600         version PCNFSDVERS {
    601                 void             PCNFSD_NULL(void) = 0;
    602                 auth_results     PCNFSD_AUTH(auth_args) = 1;
    603                 pr_init_results  PCNFSD_PR_INIT(pr_init_args) = 2;
    604                 pr_start_results PCNFSD_PR_START(pr_start_args) = 3;
    605         } = 1;
    606 /*
    607 ** Version 2 of the PCNFSD protocol.
    608 */
    609         version PCNFSDV2 {
    610                 void                   PCNFSD2_NULL(void) = 0;
    611                 v2_info_results        PCNFSD2_INFO(v2_info_args) = 1;
    612                 v2_pr_init_results     PCNFSD2_PR_INIT(v2_pr_init_args) = 2;
    613                 v2_pr_start_results    PCNFSD2_PR_START(v2_pr_start_args) = 3;
    614                 v2_pr_list_results     PCNFSD2_PR_LIST(void) = 4;
    615                 v2_pr_queue_results    PCNFSD2_PR_QUEUE(v2_pr_queue_args) = 5;
    616                 v2_pr_status_results   PCNFSD2_PR_STATUS(v2_pr_status_args) = 6;
    617                 v2_pr_cancel_results   PCNFSD2_PR_CANCEL(v2_pr_cancel_args) = 7;
    618                 v2_pr_admin_results    PCNFSD2_PR_ADMIN(v2_pr_admin_args) = 8;
    619                 v2_pr_requeue_results  PCNFSD2_PR_REQUEUE(v2_pr_requeue_args) = 9;
    620                 v2_pr_hold_results     PCNFSD2_PR_HOLD(v2_pr_hold_args) = 10;
    621                 v2_pr_release_results  PCNFSD2_PR_RELEASE(v2_pr_release_args) = 11;
    622                 v2_mapid_results       PCNFSD2_MAPID(v2_mapid_args) = 12;
    623                 v2_auth_results        PCNFSD2_AUTH(v2_auth_args) = 13;
    624                 v2_alert_results       PCNFSD2_ALERT(v2_alert_args) = 14;
    625         } = 2;
    626 
    627 } = 150001;
    628 
    629 /*
    630 ** The following forces a publically-visible msg_out()
    631 */
    632 %#if RPC_SVC
    633 % static void _msgout(const char *);
    634 % void msg_out(msg) const char *msg; {_msgout(msg);}
    635 %#endif
    636 %#if RPC_HDR
    637 % extern void msg_out(const char *);
    638 %#endif
    639 
    640 /*
    641 ** This allows initialization prior to running the service. (see PR 12758)
    642 */
    643 %#if RPC_SVC
    644 %#define main mymain
    645 %#endif
    646