/*      $NetBSD: pcnfsd.x,v 1.7 2018/01/23 21:27:20 sevan Exp $ */

/* The maximum number of bytes in a user name argument */
const IDENTLEN = 32;
/*  The maximum number of bytes in a password argument  */
const PASSWORDLEN = 64;
/*  The maximum number of bytes in a print client name argument  */
const CLIENTLEN = 64;
/*  The maximum number of bytes in a printer name argument  */
const PRINTERNAMELEN = 64;
/*  The maximum number of bytes in a print user name argument  */
const USERNAMELEN = 64;
/*  The maximum number of bytes in a print spool file name argument  */
const SPOOLNAMELEN = 64;
/*  The maximum number of bytes in a print options argument  */
const OPTIONSLEN = 64;
/*  The maximum number of bytes in a print spool directory path  */
const SPOOLDIRLEN = 255;
/*   The maximum number of secondary GIDs returned by a V2 AUTH  */
const EXTRAGIDLEN = 16;
/*   The  maximum number of bytes in a home directory spec  */
const HOMEDIRLEN = 255;
/*   The maximum number of bytes in a misc. comments string */
const COMMENTLEN = 255;
/*   The maximum number of bytes in a print job id */
const PRINTJOBIDLEN = 255;
/*   The maximum number of printers returned by a LIST operation */
const PRLISTMAX = 32;
/*   The maximum number of print jobs returned by a QUEUE operation */
const PRQUEUEMAX = 128;
/*   The maximum number of entries in the facilities list */
const FACILITIESMAX = 32;
/*   The maximum length of an operator message */
const MESSAGELEN = 512;



typedef string ident<IDENTLEN>;
/*
** The type ident is used for passing an encoded user name for
** authentication. The server should decode the string by replacing each
** octet with the value formed by performing an exclusive-or of the octet
** value with the value 0x5b and and'ing the result with 0x7f.
*/

typedef string message<MESSAGELEN>;
/*
** The type message is used for passing an alert message to the
** system operator on the server. The text may include newlines.
*/

typedef string password<PASSWORDLEN>;
/*
** The type password is used for passing an encode password for
** authentication.  The server should decode the password as described
** above.
*/

typedef string client<CLIENTLEN>;
/*
** The type client is used for passing the hostname of a client for
** printing. The server may use this name in constructing the spool
** directory name.
*/

typedef string printername<PRINTERNAMELEN>;
/*
** The type printername is used for passing the name of a printer on which
** the client wishes to print.
*/

typedef string username<USERNAMELEN>;
/*
** The type username is used for passing the user name for a print job.
** The server may use this in any way it chooses: it may attempt to change
** the effective identity with which it is running to username or may
** simply arrange for the text to be printed on the banner page.
*/

typedef string comment<COMMENTLEN>;
/*
** The type comment is used to pass an uninterpreted text string which
** may be used by displayed to a human user or used for custom
** extensions to the PCNFSD service. If you elect to extend PCNFSD
** service in this way, please do so in a way which will avoid
** problems if your client attempts to interoperate with a server
** which does not support your extension. One way to do this is to
** use the
*/

typedef string spoolname<SPOOLNAMELEN>;
/*
** The type spoolname is used for passing the name of a print spool file
** (a simple filename not a pathname) within the spool directory.
*/

typedef string printjobid<PRINTJOBIDLEN>;
/*
** The type printjobid is used for passing the id of a print job.
*/

typedef string homedir<OPTIONSLEN>;
/*
** The type homedir is used to return the home directory for the user.
** If present, it should be in the form "hostname:path", where hostname
** and path are in a suitable form for communicating with the mount server.
*/

typedef string options<OPTIONSLEN>;
/*
** The type options is used for passing implementation-specific print
** control information.  The option string is a set of printable ASCII
** characters.  The first character should be ignored by the server; it is
** reserved for client use. The second character specifies the type of
** data in the print file.  The following types are defined (an
** implementation may define additional values):
**
**  p - PostScript data. The client will ensure that a valid
**      PostScript header is included.
**  d - Diablo 630 data.
**  x - Generic printable ASCII text. The client will have filtered
**      out all non-printable characters other than CR, LF, TAB,
**      BS and VT.
**  r - Raw print data. The client performs no filtering.
**  u - User-defined. Reserved for custom extensions. A vanilla
**      pcnfsd server will treat this as equivalent to "r"
**
** If diablo data (type 'd') is specified, a formatting specification
** string will be appended. This has the form:
**      ppnnnbbb
**         pp
** Pitch - 10, 12 or 15.
**           nnn
** The ``normal'' font to be used - encoded as follows:
**             Courier                    crn
**             Courier-Bold               crb
**             Courier-Oblique            con
**             Courier-BoldObliqu         cob
**             Helvetica                  hrn
**             Helvetica-Bold             hrb
**             Helvetica-Oblique          hon
**             Helvetica-BoldOblique      hob
**             Times-Roman                trn
**             Times-Bold                 trb
**             Times-Italic               ton
**             Times-BoldItalic           tob
**              bbb
** The ``bold'' font to be used - encoded in the same way.  For example,
** the string ``nd10hrbcob'' specifies that the print data is in Diablo
** 630 format, it should be printed at 10 pitch, ``normal'' text should be
** printed in Helvetica-Bold, and ``bold'' text should be printed in
** Courier-BoldOblique.
*/

enum arstat {
       AUTH_RES_OK = 0,
       AUTH_RES_FAKE = 1,
       AUTH_RES_FAIL = 2
};
/*
** The type arstat is returned by PCNFSD_AUTH. A value of AUTH_RES_OK
** indicates that the server was able to verify the ident and password
** successfully.AUTH_RES_FAIL is returned if a verification failure
** occurred. The value AUTH_RES_FAKE may be used if the server wishes to
** indicate that the verification failed, but that the server has
** synthesised acceptable values for uid and gid which the client may use
** if it wishes.
*/

enum alrstat {
       ALERT_RES_OK = 0,
       ALERT_RES_FAIL = 1
};
/*
** The type alrstat is returned by PCNFSD_ALERT. A value of ALERT_RES_OK
** indicates that the server was able to notify the system operator
** successfully. ALERT_RES_FAIL is returned if a failure occurred
*/
enum pirstat {
       PI_RES_OK = 0,
       PI_RES_NO_SUCH_PRINTER = 1,
       PI_RES_FAIL = 2
};
/*
** The type pirstat is returned by a number of print operations. PI_RES_OK
** indicates that the operation was performed successfully. PI_RES_FAIL
** indicates that the printer name was valid, but the operation could
** not be performed. PI_RES_NO_SUCH_PRINTER indicates that the printer
** name was not recognised.
*/

enum pcrstat {
       PC_RES_OK = 0,
       PC_RES_NO_SUCH_PRINTER = 1,
       PC_RES_NO_SUCH_JOB = 2,
       PC_RES_NOT_OWNER = 3,
       PC_RES_FAIL = 4
};
/*
** The type pcrstat is returned by a CANCEL, REQUEUE, HOLD, or RELEASE
** print operation.
** PC_RES_OK indicates that the operation was performed successfully.
** PC_RES_NO_SUCH_PRINTER indicates that the printer name was not recognised.
** PC_RES_NO_SUCH_JOB means that the job does not exist, or is not
** associated with the specified printer.
** PC_RES_NOT_OWNER means that the user does not have permission to
** manipulate the job.
** PC_RES_FAIL means that the job could not be manipulated for an unknown
** reason.
*/


enum psrstat {
       PS_RES_OK = 0,
       PS_RES_ALREADY = 1,
       PS_RES_NULL = 2,
       PS_RES_NO_FILE = 3,
       PS_RES_FAIL = 4
};
/*
** The type psrstat is returned by PCNFSD_PR_START. A value of PS_RES_OK
** indicates that the server has started printing the job. It is possible
** that the reply from a PCNFSD_PR_START call may be lost, in which case
** the client will repeat the call. If the spool file is still in
** existence, the server will return PS_RES_ALREADY indicating that it has
** already started printing. If the file cannot be found, PS_RES_NO_FILE
** is returned.  PS_RES_NULL indicates that the spool file was empty,
** while PS_RES_FAIL denotes a general failure.  PI_RES_FAIL is returned
** if spool directory could not be created. The value
** PI_RES_NO_SUCH_PRINTER indicates that the printer name was not
** recognised.
*/

enum mapreq {
       MAP_REQ_UID = 0,
       MAP_REQ_GID = 1,
       MAP_REQ_UNAME = 2,
       MAP_REQ_GNAME = 3
};
/*
** The type mapreq identifies the type of a mapping request.
** MAP_REQ_UID requests that the server treat the value in the
** id field as a uid and return the corresponding username in name.
** MAP_REQ_GID requests that the server treat the value in the
** id field as a gid and return the corresponding groupname in name.
** MAP_REQ_UNAME requests that the server treat the value in the
** name field as a username and return the corresponding uid in id.
** MAP_REQ_GNAME requests that the server treat the value in the
** name field as a groupname and return the corresponding gid in id.
*/

enum maprstat {
       MAP_RES_OK = 0,
       MAP_RES_UNKNOWN = 1,
       MAP_RES_DENIED = 2
};
/*
** The type maprstat indicates the success or failure of
** an individual mapping request.
*/

/*
**********************************************************
** Version 1 of the PCNFSD protocol.
**********************************************************
*/
struct auth_args {
       ident           id;
       password        pw;
};
struct auth_results {
       arstat          stat;
       unsigned int    uid;
       unsigned int    gid;
};

struct pr_init_args {
       client          system;
       printername     pn;
};
struct pr_init_results {
       pirstat         stat;
       spoolname       dir;
};

struct pr_start_args {
       client          system;
       printername     pn;
       username        user;
       spoolname       file;
       options         opts;
};
struct pr_start_results {
       psrstat         stat;
};


/*
**********************************************************
** Version 2 of the PCNFSD protocol.
**********************************************************
*/

struct v2_info_args {
       comment         vers;
       comment         cm;
};

struct v2_info_results {
       comment         vers;
       comment         cm;
       int             facilities<FACILITIESMAX>;
};

struct v2_pr_init_args {
       client          system;
       printername     pn;
       comment         cm;
};
struct v2_pr_init_results {
       pirstat         stat;
       spoolname       dir;
       comment         cm;
};

struct v2_pr_start_args {
       client          system;
       printername     pn;
       username        user;
       spoolname       file;
       options         opts;
       int             copies;
       comment         cm;
};
struct v2_pr_start_results {
       psrstat         stat;
       printjobid      id;
       comment         cm;
};



typedef struct pr_list_item *pr_list;

struct pr_list_item {
       printername    pn;
       printername    device;
       client         remhost; /* empty if local */
       comment        cm;
       pr_list        pr_next;
};

struct v2_pr_list_results {
       comment        cm;
       pr_list        printers;
};

struct v2_pr_queue_args {
       printername     pn;
       client          system;
       username        user;
       bool            just_mine;
       comment         cm;
};

typedef struct pr_queue_item *pr_queue;

struct pr_queue_item {
       int            position;
       printjobid     id;
       comment        size;
       comment        status;
       client         system;
       username       user;
       spoolname      file;
       comment        cm;
       pr_queue       pr_next;
};

struct v2_pr_queue_results {
       pirstat        stat;
       comment        cm;
       bool           just_yours;
       int            qlen;
       int            qshown;
       pr_queue       jobs;
};


struct v2_pr_cancel_args {
       printername     pn;
       client          system;
       username        user;
       printjobid      id;
       comment         cm;
};
struct v2_pr_cancel_results {
       pcrstat        stat;
       comment        cm;
};


struct v2_pr_status_args {
       printername     pn;
       comment         cm;
};
struct v2_pr_status_results {
       pirstat        stat;
       bool           avail;
       bool           printing;
       int            qlen;
       bool           needs_operator;
       comment        status;
       comment        cm;
};

struct v2_pr_admin_args {
       client          system;
       username        user;
       printername     pn;
       comment         cm;
};
struct v2_pr_admin_results {
       pirstat         stat;
       comment         cm;
};

struct v2_pr_requeue_args {
       printername     pn;
       client          system;
       username        user;
       printjobid      id;
       int             qpos;
       comment         cm;
};

struct v2_pr_requeue_results {
       pcrstat        stat;
       comment        cm;
};

struct v2_pr_hold_args {
       printername     pn;
       client          system;
       username        user;
       printjobid      id;
       comment         cm;
};
struct v2_pr_hold_results {
       pcrstat        stat;
       comment        cm;
};

struct v2_pr_release_args {
       printername     pn;
       client          system;
       username        user;
       printjobid      id;
       comment         cm;
};
struct v2_pr_release_results {
       pcrstat        stat;
       comment        cm;
};


typedef struct mapreq_arg_item *mapreq_arg;

struct mapreq_arg_item {
       mapreq           req;
       int              id;
       username         name;
       mapreq_arg       mapreq_next;
};

typedef struct mapreq_res_item *mapreq_res;

struct mapreq_res_item {
       mapreq           req;
       maprstat         stat;
       int              id;
       username         name;
       mapreq_res       mapreq_next;
};

struct v2_mapid_args {
       comment         cm;
       mapreq_arg      req_list;
};


struct v2_mapid_results {
       comment         cm;
       mapreq_res      res_list;
};

struct v2_auth_args {
       client          system;
       ident           id;
       password        pw;
       comment         cm;
};
struct v2_auth_results {
       arstat          stat;
       unsigned int    uid;
       unsigned int    gid;
       unsigned int    gids<EXTRAGIDLEN>;
       homedir         home;
       int             def_umask;
       comment         cm;
};

struct v2_alert_args {
       client          system;
       printername     pn;
       username        user;
       message         msg;
};
struct v2_alert_results {
       alrstat          stat;
       comment         cm;
};


/*
**********************************************************
** Protocol description for the PCNFSD program
**********************************************************
*/
/*
** Version 1 of the PCNFSD protocol.
**
** -- PCNFSD_NULL() = 0
**      Null procedure - standard for all RPC programs.
**
** -- PCNFSD_AUTH() = 1
**      Perform user authentication - map username, password into uid, gid.
**
** -- PCNFSD_PR_INIT() = 2
**      Prepare for remote printing: identify exporting spool directory.
**
** -- PCNFSD_PR_START() = 3
**      Submit a spooled print job for printing: the print data is
**      in a file created in the spool directory.
**
** Version 2 of the -- PCNFSD protocol.
**
** -- PCNFSD2_NULL() = 0
**      Null procedure - standard for all RPC programs.
**
** -- PCNFSD2_INFO() = 1
**      Determine which services are supported by this implementation
**      of PCNFSD.
**
** -- PCNFSD2_PR_INIT() = 2
**       Prepare for remote printing: identify exporting spool directory.
**
** -- PCNFSD2_PR_START() = 3
**      Submit a spooled print job for printing: the print data is
**      in a file created in the spool directory.
**
** -- PCNFSD2_PR_LIST() = 4
**      List all printers known on the server.
**
** -- PCNFSD2_PR_QUEUE() = 5
**      List all or part of the queued jobs for a printer.
**
** -- PCNFSD2_PR_STATUS() = 6
**      Determine the status of a printer.
**
** -- PCNFSD2_PR_CANCEL() = 7
**      Cancel a print job.
**
** -- PCNFSD2_PR_ADMIN() = 8
**      Perform an implementation-dependent printer administration
**      operation.
**
** -- PCNFSD2_PR_REQUEUE() = 9
**      Change the queue position of a previously-submitted print job.
**
** -- PCNFSD2_PR_HOLD() = 10
**      Place a "hold" on a previously-submitted print job. The job
**      will remain in the queue, but will not be printed.
**
** -- PCNFSD2_PR_RELEASE() = 11
**      Release the "hold" on a previously-held print job.
**
** -- PCNFSD2_MAPID() = 12
**      Perform one or more translations between user and group
**      names and IDs.
**
** -- PCNFSD2_AUTH() = 13
**      Perform user authentication - map username, password into uid, gid;
**      may also return secondary gids, home directory, umask.
**
** -- PCNFSD2_ALERT() = 14
**      Send a message to the system operator.
*/
program PCNFSDPROG {
       version PCNFSDVERS {
               void             PCNFSD_NULL(void) = 0;
               auth_results     PCNFSD_AUTH(auth_args) = 1;
               pr_init_results  PCNFSD_PR_INIT(pr_init_args) = 2;
               pr_start_results PCNFSD_PR_START(pr_start_args) = 3;
       } = 1;
/*
** Version 2 of the PCNFSD protocol.
*/
       version PCNFSDV2 {
               void                   PCNFSD2_NULL(void) = 0;
               v2_info_results        PCNFSD2_INFO(v2_info_args) = 1;
               v2_pr_init_results     PCNFSD2_PR_INIT(v2_pr_init_args) = 2;
               v2_pr_start_results    PCNFSD2_PR_START(v2_pr_start_args) = 3;
               v2_pr_list_results     PCNFSD2_PR_LIST(void) = 4;
               v2_pr_queue_results    PCNFSD2_PR_QUEUE(v2_pr_queue_args) = 5;
               v2_pr_status_results   PCNFSD2_PR_STATUS(v2_pr_status_args) = 6;
               v2_pr_cancel_results   PCNFSD2_PR_CANCEL(v2_pr_cancel_args) = 7;
               v2_pr_admin_results    PCNFSD2_PR_ADMIN(v2_pr_admin_args) = 8;
               v2_pr_requeue_results  PCNFSD2_PR_REQUEUE(v2_pr_requeue_args) = 9;
               v2_pr_hold_results     PCNFSD2_PR_HOLD(v2_pr_hold_args) = 10;
               v2_pr_release_results  PCNFSD2_PR_RELEASE(v2_pr_release_args) = 11;
               v2_mapid_results       PCNFSD2_MAPID(v2_mapid_args) = 12;
               v2_auth_results        PCNFSD2_AUTH(v2_auth_args) = 13;
               v2_alert_results       PCNFSD2_ALERT(v2_alert_args) = 14;
       } = 2;

} = 150001;

/*
** The following forces a publically-visible msg_out()
*/
%#if RPC_SVC
% static void _msgout(const char *);
% void msg_out(msg) const char *msg; {_msgout(msg);}
%#endif
%#if RPC_HDR
% extern void msg_out(const char *);
%#endif

/*
** This allows initialization prior to running the service. (see PR 12758)
*/
%#if RPC_SVC
%#define main mymain
%#endif