summaryrefslogtreecommitdiff
path: root/usr.sbin/lpd/lp.h
blob: 340305958ac0a1796c57ec550048cfa436f4cf8f (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
/*	$OpenBSD: lp.h,v 1.1.1.1 2018/04/27 16:14:36 eric Exp $	*/

/*
 * Copyright (c) 2017 Eric Faurot <eric@openbsd.org>
 *
 * Permission to use, copy, modify, and distribute this software for any
 * purpose with or without fee is hereby granted, provided that the above
 * copyright notice and this permission notice appear in all copies.
 *
 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
 */

#include <sys/stat.h>

#include <paths.h>
#include <stdio.h>

#define _PATH_PRINTCAP	"/etc/printcap"
#define _PATH_HOSTSLPD	"/etc/hosts.lpd"

#define DEFAULT_FF	"\f"
#define DEFAULT_LF	_PATH_CONSOLE
#define DEFAULT_LO	"lock"
#define DEFAULT_LP	"/dev/lp"
#define DEFAULT_PC	200
#define DEFAULT_PL	66
#define DEFAULT_PW	132
#define DEFAULT_RP	"lp"
#define DEFAULT_SD	"/var/spool/output"
#define DEFAULT_ST	"status"

#define LP_MAXALIASES	32
#define LP_MAXUSERS	50
#define LP_MAXREQUESTS	50

#define LPR_ACK		0
#define LPR_NACK	1	/* only for sending */

#define PRN_LOCAL	0	/* local printer */
#define PRN_NET		1	/* printer listening directly on a port */
#define PRN_LPR		2	/* some lpr daemon */

#define LPQ_PRINTER_DOWN 	0x1
#define LPQ_QUEUE_OFF		0x2
#define LPQ_QUEUE_UPDATED	0x4

#define LP_FF(p) (((p)->lp_ff) ? ((p)->lp_ff) : DEFAULT_FF)
#define LP_LF(p) (((p)->lp_lf) ? ((p)->lp_lf) : DEFAULT_LF)
#define LP_LO(p) (((p)->lp_lo) ? ((p)->lp_lo) : DEFAULT_LO)
#define LP_LP(p) (((p)->lp_lp) ? ((p)->lp_lp) : DEFAULT_LP)
#define LP_RP(p) (((p)->lp_rp) ? ((p)->lp_rp) : DEFAULT_RP)
#define LP_SD(p) (((p)->lp_sd) ? ((p)->lp_sd) : DEFAULT_SD)
#define LP_ST(p) (((p)->lp_st) ? ((p)->lp_st) : DEFAULT_ST)

#define LP_JOBNUM(cf) (100*((cf)[3]-'0') + 10*((cf)[4]-'0') + ((cf)[5]-'0'))
#define LP_JOBHOST(cf) ((cf) + 6)

struct lp_printer {
	int	 lp_type;
	char	*lp_name;
	char	*lp_aliases[LP_MAXALIASES];
	int	 lp_aliascount;

	char	*lp_host; /* if remote */
	char	*lp_port;

	FILE	*lp_lock; /* currently held lock file */

	char	*lp_af;	/* name of accounting file */
	long	 lp_br;	/* if lp is a tty, set baud rate (ioctl(2) call) */
	char	*lp_cf;	/* cifplot data filter */
	char	*lp_df;	/* tex data filter (DVI format) */
	char	*lp_ff;	/* string to send for a form feed */
	short	 lp_fo;	/* print a form feed when device is opened */
	char	*lp_gf;	/* graph data filter (plot(3) format) */
	short	 lp_hl;	/* print the burst header page last */
	short	 lp_ic;	/* supports non-standard ioctl to indent printout */
	char	*lp_if;	/* name of text filter which does accounting */
	char	*lp_lf;	/* error logging file name */
	char	*lp_lo;	/* name of lock file */
	char	*lp_lp;	/* local printer device, or port@host for remote */
	long	 lp_mc;	/* maximum number of copies allowed; 0=unlimited */
	char	*lp_ms;	/* if lp is a tty, a comma-separated, stty(1)-like list
			   describing the tty modes */
	long	 lp_mx;	/* max file size (in BUFSIZ blocks); 0=unlimited */
	char	*lp_nd;	/* next directory for queues list (unimplemented) */
	char	*lp_nf;	/* ditroff data filter (device independent troff) */
	char	*lp_of;	/* name of output filtering program */
	long	 lp_pc;	/* price per foot or page in hundredths of cents */
	long	 lp_pl;	/* page length (in lines) */
	long	 lp_pw;	/* page width (in characters) */
	long	 lp_px;	/* page width in pixels (horizontal) */
	long	 lp_py;	/* page length in pixels (vertical) */
	char	*lp_rf;	/* filter for printing FORTRAN style text files */
	char	*lp_rg;	/* restricted group-only group members can access */
	char	*lp_rm;	/* machine name for remote printer */
	char	*lp_rp;	/* remote printer name argument */
	short	 lp_rs;	/* remote users must have a local account */
	short	 lp_rw;	/* open printer device for reading and writing */
	short	 lp_sb;	/* short banner (one line only) */
	short	 lp_sc;	/* suppress multiple copies */
	char	*lp_sd;	/* spool directory */
	short	 lp_sf;	/* suppress form feeds */
	short	 lp_sh;	/* suppress printing of burst page header */
	char	*lp_st;	/* status file name */
	char	*lp_tf;	/* troff data filter (cat phototypesetter) */
	char	*lp_tr;	/* trailer string to print when queue empties */
	char	*lp_vf;	/* raster image filter */
};

struct lp_queue {
	int	  count;
	char	**cfname;
};

struct lp_jobfilter {
	const char	*hostfrom;
	int		 nuser;
	const char	*users[LP_MAXUSERS];
	int		 njob;
	int		 jobs[LP_MAXREQUESTS];
};

extern char *lpd_hostname;

/* lp.c */
int   lp_getprinter(struct lp_printer *, const char *);
int   lp_scanprinters(struct lp_printer *);
void  lp_clearprinter(struct lp_printer *);
int   lp_readqueue(struct lp_printer *, struct lp_queue *);
void  lp_clearqueue(struct lp_queue *);
FILE* lp_fopen(struct lp_printer *, const char *);
int   lp_stat(struct lp_printer *, const char *, struct stat *);
int   lp_unlink(struct lp_printer *, const char *);
int   lp_lock(struct lp_printer *);
void  lp_unlock(struct lp_printer *);
int   lp_getqueuestate(struct lp_printer *, int, int *);
int   lp_getcurrtask(struct lp_printer *, pid_t *, char *, size_t);
void  lp_setcurrtask(struct lp_printer *, const char *);
int   lp_getstatus(struct lp_printer *, char *, size_t);
void  lp_setstatus(struct lp_printer *, const char *, ...)
	__attribute__((__format__ (printf, 2, 3)));
int   lp_validfilename(const char *, int);
int   lp_create(struct lp_printer *, int, size_t, const char *);
int   lp_commit(struct lp_printer *, const char *);

/* lp_banner.c */
int   lp_banner(int, char *, int);

/* lp_displayq.c */
void  lp_displayq(int, struct lp_printer *, int, struct lp_jobfilter *);

/* lp_rmjob */
int   lp_rmjob(int, struct lp_printer *, const char *, struct lp_jobfilter *);

/* lp_stty.c */
void  lp_stty(struct lp_printer *, int);