#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
#define PRN_LOCAL 0
#define PRN_NET 1
#define PRN_LPR 2
#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;
char *lp_port;
FILE *lp_lock;
char *lp_af;
long lp_br;
char *lp_cf;
char *lp_df;
char *lp_ff;
short lp_fo;
char *lp_gf;
short lp_hl;
short lp_ic;
char *lp_if;
char *lp_lf;
char *lp_lo;
char *lp_lp;
long lp_mc;
char *lp_ms;
long lp_mx;
char *lp_nd;
char *lp_nf;
char *lp_of;
long lp_pc;
long lp_pl;
long lp_pw;
long lp_px;
long lp_py;
char *lp_rf;
char *lp_rg;
char *lp_rm;
char *lp_rp;
short lp_rs;
short lp_rw;
short lp_sb;
short lp_sc;
char *lp_sd;
short lp_sf;
short lp_sh;
char *lp_st;
char *lp_tf;
char *lp_tr;
char *lp_vf;
};
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;
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 *);
int lp_banner(int, char *, int);
void lp_displayq(int, struct lp_printer *, int, struct lp_jobfilter *);
int lp_rmjob(int, struct lp_printer *, const char *, struct lp_jobfilter *);
void lp_stty(struct lp_printer *, int);