1 /* $OpenBSD: lpd.h,v 1.2 2018/09/05 17:32:56 eric Exp $ */ 2 3 /* 4 * Copyright (c) 2017 Eric Faurot <eric@openbsd.org> 5 * 6 * Permission to use, copy, modify, and distribute this software for any 7 * purpose with or without fee is hereby granted, provided that the above 8 * copyright notice and this permission notice appear in all copies. 9 * 10 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES 11 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF 12 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR 13 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES 14 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN 15 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF 16 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. 17 */ 18 19 #include <sys/types.h> 20 #include <sys/queue.h> 21 #include <sys/tree.h> 22 #include <sys/uio.h> 23 #include <sys/socket.h> 24 25 #include <event.h> 26 #include <imsg.h> 27 #include <limits.h> 28 #include <netdb.h> 29 30 #define PORT_LPR 515 31 32 #define LPD_CONFIG "/etc/lpd.conf" 33 #define LPD_USER "daemon" 34 #define LPD_SOCKET "/var/run/lpd.sock" 35 36 #define LPR_DEFPRINTER "lp" 37 #define LPR_MAXCMDLEN BUFSIZ 38 #define LPR_MAXFILESIZE 104857600 39 40 #define LOGLEVEL_CONN 2 41 #define LOGLEVEL_IMSG 3 42 #define LOGLEVEL_IO 4 43 44 enum { 45 IMSG_NONE, 46 47 IMSG_SOCK_ENGINE, 48 IMSG_SOCK_FRONTEND, 49 50 IMSG_CONF_START, 51 IMSG_CONF_LISTENER, 52 IMSG_CONF_END, 53 54 IMSG_GETADDRINFO, 55 IMSG_GETADDRINFO_END, 56 IMSG_GETNAMEINFO, 57 58 IMSG_LPR_ALLOWEDHOST, 59 IMSG_LPR_DISPLAYQ, 60 IMSG_LPR_PRINTJOB, 61 IMSG_LPR_RECVJOB, 62 IMSG_LPR_RECVJOB_CLEAR, 63 IMSG_LPR_RECVJOB_CF, 64 IMSG_LPR_RECVJOB_DF, 65 IMSG_LPR_RECVJOB_COMMIT, 66 IMSG_LPR_RECVJOB_ROLLBACK, 67 IMSG_LPR_RMJOB 68 }; 69 70 enum { 71 PROC_CLIENT, 72 PROC_CONTROL, 73 PROC_ENGINE, 74 PROC_FRONTEND, 75 PROC_PRINTER, 76 PROC_PRIV 77 }; 78 79 enum { 80 PROTO_NONE = 0, 81 PROTO_LPR 82 }; 83 84 struct listener { 85 TAILQ_ENTRY(listener) entry; 86 int sock; 87 int proto; 88 struct sockaddr_storage ss; 89 struct timeval timeout; 90 struct event ev; 91 int pause; 92 }; 93 94 struct lpd_conf { 95 TAILQ_HEAD(, listener) listeners; 96 }; 97 98 struct io; 99 struct imsgproc; 100 101 extern struct lpd_conf *env; 102 extern struct imsgproc *p_control; 103 extern struct imsgproc *p_engine; 104 extern struct imsgproc *p_frontend; 105 extern struct imsgproc *p_priv; 106 107 /* control.c */ 108 void control(int, int); 109 110 /* engine.c */ 111 void engine(int, int); 112 113 /* frontend.c */ 114 void frontend(int, int); 115 void frontend_conn_closed(uint32_t); 116 117 /* logmsg.c */ 118 const char *log_fmt_proto(int); 119 const char *log_fmt_imsgtype(int); 120 const char *log_fmt_proctype(int); 121 const char *log_fmt_sockaddr(const struct sockaddr *); 122 void log_imsg(struct imsgproc *, struct imsg *); 123 void log_io(const char *, struct io *, int); 124 125 /* engine_lpr.c */ 126 void lpr_shutdown(void); 127 void lpr_dispatch_frontend(struct imsgproc *, struct imsg *); 128 void lpr_printjob(const char *); 129 130 /* frontend_lpr.c */ 131 void lpr_init(void); 132 void lpr_dispatch_engine(struct imsgproc *, struct imsg *); 133 void lpr_conn(uint32_t, struct listener *, int, const struct sockaddr *); 134 135 /* parse.y */ 136 struct lpd_conf *parse_config(const char *, int); 137 int cmdline_symset(char *); 138 139 /* printer.c */ 140 void printer(int, int, const char *); 141 142 /* resolver.c */ 143 void resolver_getaddrinfo(const char *, const char *, const struct addrinfo *, 144 void(*)(void *, int, struct addrinfo*), void *); 145 void resolver_getnameinfo(const struct sockaddr *, int, 146 void(*)(void *, int, const char *, const char *), void *); 147 void resolver_dispatch_request(struct imsgproc *, struct imsg *); 148 void resolver_dispatch_result(struct imsgproc *, struct imsg *); 149