xref: /freebsd/usr.sbin/lpr/common_source/lp.h (revision daf1cffce2e07931f27c6c6998652e90df6ba87e)
1 /*
2  * Copyright (c) 1983, 1993
3  *	The Regents of the University of California.  All rights reserved.
4  *
5  * Redistribution and use in source and binary forms, with or without
6  * modification, are permitted provided that the following conditions
7  * are met:
8  * 1. Redistributions of source code must retain the above copyright
9  *    notice, this list of conditions and the following disclaimer.
10  * 2. Redistributions in binary form must reproduce the above copyright
11  *    notice, this list of conditions and the following disclaimer in the
12  *    documentation and/or other materials provided with the distribution.
13  * 3. All advertising materials mentioning features or use of this software
14  *    must display the following acknowledgement:
15  *	This product includes software developed by the University of
16  *	California, Berkeley and its contributors.
17  * 4. Neither the name of the University nor the names of its contributors
18  *    may be used to endorse or promote products derived from this software
19  *    without specific prior written permission.
20  *
21  * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
22  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
23  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
24  * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
25  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
26  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
27  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
28  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
29  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
30  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
31  * SUCH DAMAGE.
32  *
33  * 	From: @(#)lp.h	8.2 (Berkeley) 4/28/95
34  * $FreeBSD$
35  */
36 
37 #include <sys/queue.h>
38 
39 /*
40  * All this information used to be in global static variables shared
41  * mysteriously by various parts of the lpr/lpd suite.
42  * This structure attempts to centralize all these declarations in the
43  * hope that they can later be made more dynamic.
44  */
45 enum	lpd_filters { LPF_CIFPLOT, LPF_DVI, LPF_GRAPH, LPF_INPUT,
46 		      LPF_DITROFF, LPF_OUTPUT, LPF_FORTRAN, LPF_TROFF,
47 		      LPF_RASTER, LPF_COUNT };
48 /* NB: there is a table in common.c giving the mapping from capability names */
49 
50 struct	printer {
51 	char	*printer;	/* printer name */
52 	int	 remote;	/* true if RM points to a remote host */
53 	int	 rp_matches_local; /* true if rp has same name as us */
54 	int	 tof;		/* true if we are at top-of-form */
55 	/* ------------------------------------------------------ */
56 	char	*acct_file;	/* AF: accounting file */
57 	long	 baud_rate;	/* BR: baud rate if lp is a tty */
58 	char	*filters[LPF_COUNT]; /* CF, DF, GF, IF, NF, OF, RF, TF, VF */
59 	long	 conn_timeout;	/* CT: TCP connection timeout */
60 	long	 daemon_user;	/* DU: daemon user id -- XXX belongs ???? */
61 	char	*form_feed;	/* FF: form feed */
62 	long	 header_last;	/* HL: print header last */
63 	char	*log_file;	/* LF: log file */
64 	char	*lock_file;	/* LO: lock file */
65 	char	*lp;		/* LP: device name or network address */
66 	long	 max_copies;	/* MC: maximum number of copies allowed */
67 	long	 max_blocks;	/* MX: maximum number of blocks to copy */
68 	long	 price100;	/* PC: price per 100 units of output */
69 	long	 page_length;	/* PL: page length */
70 	long	 page_width;	/* PW: page width */
71 	long	 page_pwidth;	/* PX: page width in pixels */
72 	long	 page_plength;	/* PY: page length in pixels */
73 	char	*restrict_grp;	/* RG: restricted group */
74 	char	*remote_host;	/* RM: remote machine name */
75 	char	*remote_queue;	/* RP: remote printer name */
76 	long	 restricted;	/* RS: restricted to those with local accts */
77 	long	 rw;		/* RW: open LP for reading and writing */
78 	long	 short_banner;	/* SB: short banner */
79 	long	 no_copies;	/* SC: suppress multiple copies */
80 	char	*spool_dir;	/* SD: spool directory */
81 	long	 no_formfeed;	/* SF: suppress FF on each print job */
82 	long	 no_header;	/* SH: suppress header page */
83 	char	*status_file;	/* ST: status file name */
84 	char	*trailer;	/* TR: trailer string send when Q empties */
85 	char	*mode_set;	/* MS: mode set, a la stty */
86 };
87 
88 /*
89  * Lists of user names and job numbers, for the benefit of the structs
90  * defined below.  We use TAILQs so that requests don't get mysteriously
91  * reversed in process.
92  */
93 struct	req_user {
94 	TAILQ_ENTRY(req_user)	ru_link; /* macro glue */
95 	char	ru_uname[1];	/* name of user */
96 };
97 TAILQ_HEAD(req_user_head, req_user);
98 
99 struct	req_file {
100 	TAILQ_ENTRY(req_file)	rf_link; /* macro glue */
101 	char	 rf_type;	/* type (lowercase cf file letter) of file */
102 	char	*rf_prettyname;	/* user-visible name of file */
103 	char	 rf_fname[1];	/* name of file */
104 };
105 TAILQ_HEAD(req_file_head, req_file);
106 
107 struct	req_jobid {
108 	TAILQ_ENTRY(req_jobid)	rj_link; /* macro glue */
109 	int	rj_job;		/* job number */
110 };
111 TAILQ_HEAD(req_jobid_head, req_jobid);
112 
113 /*
114  * Encapsulate all the information relevant to a request in the
115  * lpr/lpd protocol.
116  */
117 enum	req_type { REQ_START, REQ_RECVJOB, REQ_LIST, REQ_DELETE };
118 
119 struct	request {
120 	enum	 req_type type;	/* what sort of request is this? */
121 	struct	 printer prtr;	/* which printer is it for? */
122 	int	 remote;	/* did request arrive over network? */
123 	char	*logname;	/* login name of requesting user */
124 	char	*authname;	/* authenticated identity of requesting user */
125 	char	*prettyname;	/* ``pretty'' name of requesting user */
126 	int	 privileged;	/* was the request from a privileged user? */
127 	void	*authinfo;	/* authentication information */
128 	int	 authentic;	/* was the request securely authenticated? */
129 
130 	/* Information for queries and deletes... */
131 	int	 nusers;	/* length of following list... */
132 	struct	 req_user_head users; /* list of users to query/delete */
133 	int	 njobids;	/* length of following list... */
134 	struct	 req_jobid_head jobids;	/* list of jobids to query/delete */
135 };
136 
137 /*
138  * Global definitions for the line printer system.
139  */
140 extern char	line[BUFSIZ];
141 extern char	*name;		/* program name */
142 				/* host machine name */
143 extern char	host[MAXHOSTNAMELEN];
144 extern char	*from;		/* client's machine name */
145 
146 extern int	requ[];		/* job number of spool entries */
147 extern int	requests;	/* # of spool requests */
148 extern char	*user[];        /* users to process */
149 extern int	users;		/* # of users in user array */
150 extern char	*person;	/* name of person doing lprm */
151 
152 /*
153  * Structure used for building a sorted list of control files.
154  */
155 struct queue {
156 	time_t	q_time;			/* modification time */
157 	char	q_name[MAXNAMLEN+1];	/* control file name */
158 };
159 
160 /*
161  * Error codes for our mini printcap library.
162  */
163 #define	PCAPERR_TCLOOP		(-3)
164 #define	PCAPERR_OSERR		(-2)
165 #define	PCAPERR_NOTFOUND	(-1)
166 #define	PCAPERR_SUCCESS		0
167 #define	PCAPERR_TCOPEN		1
168 
169 /*
170  * File modes for the various status files maintained by lpd.
171  */
172 #define	LOCK_FILE_MODE	(S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP | S_IROTH)
173 #define	LFM_PRINT_DIS	(S_IXUSR)
174 #define	LFM_QUEUE_DIS	(S_IXGRP)
175 #define	LFM_RESET_QUE	(S_IXOTH)
176 
177 #define	STAT_FILE_MODE	(S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP | S_IROTH)
178 #define	LOG_FILE_MODE	(S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP | S_IROTH)
179 #define	TEMP_FILE_MODE	(S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP | S_IROTH)
180 
181 /*
182  * Command codes used in the protocol.
183  */
184 #define	CMD_CHECK_QUE	'\1'
185 #define	CMD_TAKE_THIS	'\2'
186 #define	CMD_SHOWQ_SHORT	'\3'
187 #define	CMD_SHOWQ_LONG	'\4'
188 #define	CMD_RMJOB	'\5'
189 
190 #include <sys/cdefs.h>
191 
192 __BEGIN_DECLS
193 struct	 dirent;
194 
195 void     blankfill __P((int));
196 char	*checkremote __P((struct printer *pp));
197 int      chk __P((char *));
198 void	 closeallfds __P((int start));
199 void     delay __P((int));
200 void     displayq __P((struct printer *pp, int format));
201 void     dump __P((char *, char *, int));
202 void	 fatal __P((const struct printer *pp, const char *fmp, ...));
203 int	 firstprinter __P((struct printer *pp, int *status));
204 void	 free_printer __P((struct printer *pp));
205 void	 free_request __P((struct request *rp));
206 int	 getline __P((FILE *));
207 int	 getport __P((const struct printer *pp, const char *, int));
208 int	 getprintcap __P((const char *printer, struct printer *pp));
209 int	 getq __P((const struct printer *, struct queue *(*[])));
210 void     header __P((void));
211 void     inform __P((const struct printer *pp, char *cf));
212 void	 init_printer __P((struct printer *pp));
213 void	 init_request __P((struct request *rp));
214 int      inlist __P((char *, char *));
215 int      iscf __P((struct dirent *));
216 int      isowner __P((char *, char *));
217 void     ldump __P((char *, char *, int));
218 void	 lastprinter __P((void));
219 int      lockchk __P((struct printer *pp, char *));
220 char	*lock_file_name __P((const struct printer *pp, char *buf, size_t len));
221 int	 nextprinter __P((struct printer *pp, int *status));
222 const
223 char	*pcaperr __P((int error));
224 void     prank __P((int));
225 void     process __P((const struct printer *pp, char *));
226 void     rmjob __P((const char *printer));
227 void     rmremote __P((const struct printer *pp));
228 void	 setprintcap __P((char *newprintcap));
229 void     show __P((char *, char *, int));
230 int      startdaemon __P((const struct printer *pp));
231 char	*status_file_name __P((const struct printer *pp, char *buf,
232 			       size_t len));
233 ssize_t	 writel __P((int s, ...));
234 __END_DECLS
235