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);
|