#include <sys/types.h>
#include <sys/queue.h>
#include <sys/tree.h>
#include <sys/uio.h>
#include <sys/socket.h>
#include <event.h>
#include <imsg.h>
#include <limits.h>
#include <netdb.h>
#define PORT_LPR 515
#define LPD_CONFIG "/etc/lpd.conf"
#define LPD_USER "daemon"
#define LPD_SOCKET "/var/run/lpd.sock"
#define LPR_DEFPRINTER "lp"
#define LPR_MAXCMDLEN BUFSIZ
#define LPR_MAXFILESIZE 104857600
#define LOGLEVEL_CONN 2
#define LOGLEVEL_IMSG 3
#define LOGLEVEL_IO 4
enum {
IMSG_NONE,
IMSG_SOCK_ENGINE,
IMSG_SOCK_FRONTEND,
IMSG_CONF_START,
IMSG_CONF_LISTENER,
IMSG_CONF_END,
IMSG_GETADDRINFO,
IMSG_GETADDRINFO_END,
IMSG_GETNAMEINFO,
IMSG_LPR_ALLOWEDHOST,
IMSG_LPR_DISPLAYQ,
IMSG_LPR_PRINTJOB,
IMSG_LPR_RECVJOB,
IMSG_LPR_RECVJOB_CLEAR,
IMSG_LPR_RECVJOB_CF,
IMSG_LPR_RECVJOB_DF,
IMSG_LPR_RECVJOB_COMMIT,
IMSG_LPR_RECVJOB_ROLLBACK,
IMSG_LPR_RMJOB
};
enum {
PROC_CLIENT,
PROC_CONTROL,
PROC_ENGINE,
PROC_FRONTEND,
PROC_PRINTER,
PROC_PRIV
};
enum {
PROTO_NONE = 0,
PROTO_LPR
};
struct listener {
TAILQ_ENTRY(listener) entry;
int sock;
int proto;
struct sockaddr_storage ss;
struct timeval timeout;
struct event ev;
int pause;
};
struct lpd_conf {
TAILQ_HEAD(, listener) listeners;
};
struct io;
struct imsgproc;
extern struct lpd_conf *env;
extern struct imsgproc *p_control;
extern struct imsgproc *p_engine;
extern struct imsgproc *p_frontend;
extern struct imsgproc *p_priv;
void control(int, int);
void engine(int, int);
void frontend(int, int);
void frontend_conn_closed(uint32_t);
const char *log_fmt_proto(int);
const char *log_fmt_imsgtype(int);
const char *log_fmt_proctype(int);
const char *log_fmt_sockaddr(const struct sockaddr *);
void log_imsg(struct imsgproc *, struct imsg *);
void log_io(const char *, struct io *, int);
void lpr_shutdown(void);
void lpr_dispatch_frontend(struct imsgproc *, struct imsg *);
void lpr_printjob(const char *);
void lpr_init(void);
void lpr_dispatch_engine(struct imsgproc *, struct imsg *);
void lpr_conn(uint32_t, struct listener *, int, const struct sockaddr *);
struct lpd_conf *parse_config(const char *, int);
int cmdline_symset(char *);
void printer(int, int, const char *);
void resolver_getaddrinfo(const char *, const char *, const struct addrinfo *,
void(*)(void *, int, struct addrinfo*), void *);
void resolver_getnameinfo(const struct sockaddr *, int,
void(*)(void *, int, const char *, const char *), void *);
void resolver_dispatch_request(struct imsgproc *, struct imsg *);
void resolver_dispatch_result(struct imsgproc *, struct imsg *);